我刚刚在我的服务器上设置了graphql,并希望将Apollo连接到我的前端。将查询映射到Apollo.js的React中
我能够将阿波罗和Redux整合在一起(How to pass initial state to reducer),但现在想通过REDX连接将状态映射到道具。
我目前的家庭成分是这样的:
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)
我基本上是想mapQueryToProps
但是我不能确定这是如何工作,以取代mapStateToProps
。
这是否向我的/graphql
端点发出请求并将响应映射到curPage
?
这会在第一次呈现之前发生吗?由于this.props.curPage
在componentWillMount()
内有售? (我需要这个用于seo的目的,以确保所有的内容都呈现在服务器端)。
我该在哪里配置我的graphql端点?我看到一些示例在其商店中配置它。我的店被分成store.js和index.js略,但如下:
// 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
}
更新
我现在从我的商店导入我的客户端,这样我只有一个客户端实例。我也使用/graphql
作为我的端点,所以我不需要配置端点。
// 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')
)
还是有点困惑graphql(MY_QUERY, { props: mapQueryToProps })(Home)
我有一个查询来获取curPage这graphiql工作:(我猜MY_QUERY
应该等于这个? )
query {
findResource(filter: {resource: "pages", slug: "about"}) {
id
title
slug
path
sections
}
}
和回报:
{
"data": {
"findResource": [
{
"id": "5",
"title": "About",
"slug": "about",
"path": "/about",
"sections": [
{
"type": "masthead",
"mh_title": "",
"video": false,
"image": [],
"showCta": false,
"cta": []
},
{
"type": "text_image",
"alignment": "left",
"text_image": [
{
"type": "text",
"title": "",
"content": "",
"call_to_action": false,
"cta": []
}
]
}
]
}
]
}
}
请问这意味着我的
const mapQueryToProps = ({data: { getPage: { page } }, ownProps}) => ({ curPage: page })
应该是这样的:
const mapQueryToProps = ({data: { findResource: { page } }, ownProps}) => ({ curPage: page })
好吧,我已根据您的建议对客户端进行了更改。我已经用我这样做的方式更新了我原来的帖子。其次我仍然有点不确定如何映射QueryToProps。我用另一个例子更新了我原来的帖子。我在正确的轨道上吗?我也阅读过你建议的文档。 – Stretch0
请参阅我的编辑以了解如何在查询中传递。你可以阅读更多[这里](http://dev.apollodata.com/react/queries.html#basics)。至于mapQueryToProps ...在我的exampe中,我只是猜测你的数据结构是什么;查看查询返回的内容 - 这是您在mapQueryToProps中使用的数据对象。我猜你需要返回数组中的第一个对象,所以你可以做一些事情:({data})=>({curPage:data.findResource [0]})。 –
或者不用担心为这样的简单情况设置道具。只要执行'graphql(MY_QUERY)(Home)',然后就可以用'props.data'访问组件内的数据。可能不那么头疼。 –