Ich habe gerade graphql auf meinem Server eingerichtet und wollte Apollo mit meinem Frontend verbinden.Map Query zu Requisiten mit Apollo.js in React
Ich war in der Lage, Apollo mit Redux (How to pass initial state to reducer) zu integrieren, aber jetzt den Status zu Requisiten über redux connect zuordnen möchten.
Meine aktuelle Heim-Komponente sieht wie folgt aus:
import React, { Component } from 'react'
import { connect } from 'react-redux'
import { graphql } from 'react-apollo';
import './Home.css'
class Home extends Component {
render() {
return (
<section className='home-container'>
<h1>Site Name</h1>
</section>
)
}
}
const mapStateToProps = state => ({
curPage: state.curPage
})
export default connect(
mapStateToProps,
)(Home)
ich im Wesentlichen mapStateToProps
mit mapQueryToProps
ersetzen wollen aber ich bin nicht sicher, wie das funktioniert.
Stellt dies eine Anfrage an meinen /graphql
Endpunkt und ordnen Sie die Antwort auf curPage
?
Wird dies vor dem ersten Rendern passieren? Wie in wird this.props.curPage
innerhalb componentWillMount()
verfügbar sein? (Ich brauche dies für seo Zwecke, um sicherzustellen, dass der gesamte Inhalt serverseitig gerendert wird).
Wo konfiguriere ich meinen graphql-Endpunkt? Ich sehe einige Beispiele, die es in ihrem Geschäft konfigurieren. Mein Speicher ist aufgeteilt in store.js und index.js leicht aber ist wie folgt:
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import App from './containers/App/App';
import initialState from './initialState';
import configureStore from './store';
import { ApolloClient, ApolloProvider } from 'react-apollo';
const client = new ApolloClient();
// Let the reducers handle initial state
initState() // eslint-disable-line
// if we are in production mode, we get the initial state from the window object, otherwise, when we are in dev env we get it from a static file
const preloadedState = window.__INITIAL_STATE__ === '{{__PRELOADEDSTATE__}}' ? initialState : window.__INITIAL_STATE__
const store = configureStore(preloadedState)
ReactDOM.render(
<ApolloProvider store={store} client={client}>
<BrowserRouter>
<App />
</BrowserRouter>
</ApolloProvider>,
document.getElementById('root')
)
// store.js
import { createStore, applyMiddleware, compose } from 'redux'
import { createLogger } from 'redux-logger'
import reducers from './reducers'
import { ApolloClient } from 'react-apollo';
const logger = createLogger()
const client = new ApolloClient();
export default function configureStore(initialState = {}) {
// Create the store with two middlewares
const middlewares = [
// sagaMiddleware
logger,
client.middleware()
]
const enhancers = [
applyMiddleware(...middlewares)
]
const store = createStore(
reducers,
initialState,
compose(...enhancers)
)
// Extensions
store.asyncReducers = {} // Async reducer registry
return store
}
aktualisieren
Ich importiere jetzt meinen Client aus meinem Geschäft, so dass ich nur eine Instanz meines Clients habe. Ich verwende auch /graphql
als meinen Endpunkt, so dass ich den Endpunkt nicht konfigurieren sollte.
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import App from './containers/App/App';
import initialState from './initialState';
import {configureStore, client} from './store';
import { ApolloClient, ApolloProvider } from 'react-apollo';
initState() // eslint-disable-line
// if we are in production mode, we get the initial state from the window object, otherwise, when we are in dev env we get it from a static file
const preloadedState = window.__INITIAL_STATE__ === '{{__PRELOADEDSTATE__}}' ? initialState : window.__INITIAL_STATE__
const store = configureStore(preloadedState)
ReactDOM.render(
<ApolloProvider store={store} client={client}>
<BrowserRouter>
<App />
</BrowserRouter>
</ApolloProvider>,
document.getElementById('root')
)
noch ein bisschen verwirrt über graphql(MY_QUERY, { props: mapQueryToProps })(Home)
Ich habe eine Abfrage curPage zu erhalten, die in graphiql funktioniert: (Ich vermute, MY_QUERY
sollte dies gleich sein?)
query {
findResource(filter: {resource: "pages", slug: "about"}) {
id
title
slug
path
sections
}
}
und kehrt:
Würde das bedeuten, meine
const mapQueryToProps = ({data: { getPage: { page } }, ownProps}) => ({ curPage: page })
sollte wie folgt aussehen:
const mapQueryToProps = ({data: { findResource: { page } }, ownProps}) => ({ curPage: page })
Ok, also habe ich die Änderungen an den Client gemäß Ihrer Empfehlung vorgenommen. Ich habe meinen ursprünglichen Post mit der Art aktualisiert, wie ich das gemacht habe. Zweitens bin ich immer noch ein wenig unsicher, wie manQueryToProps abbildet. Ich habe meinen ursprünglichen Beitrag mit einem anderen Beispiel aktualisiert. Bin ich auf dem richtigen Weg? Ich habe die von Ihnen vorgeschlagene Dokumentation ebenfalls gelesen. – Stretch0
Siehe meine Bearbeitung für die Übergabe der Abfrage. Sie können mehr [hier] lesen (http://dev.apollodata.com/react/queries.html#basics). Soweit die mapQueryToProps ... In meinem Beispiel habe ich nur geschätzt, was Ihre Datenstruktur wäre; Sehen Sie sich an, was die Abfrage zurückgibt - das ist das Datenobjekt, mit dem Sie in mapQueryToProps arbeiten. Ich nehme an, Sie brauchen das erste Objekt innerhalb des Array, das zurückgegeben wird, so dass Sie einfach etwas tun könnten: ({Daten}) => ({curPage: data.findResource [0]}). –
Oder mach dir keine Sorgen über die Einstellung der Requisiten für einen einfachen Fall wie diesen. Tun Sie einfach 'graphql (MY_QUERY) (Home)' und dann können Sie mit 'props.data' auf die Daten innerhalb Ihrer Komponente zugreifen. Könnte weniger Kopfschmerzen haben. –