使用 redux 状态以及 Apollo 的 Graphql

Posted

技术标签:

【中文标题】使用 redux 状态以及 Apollo 的 Graphql【英文标题】:Graphql using redux state as well as Apollo 【发布时间】:2017-12-23 23:54:13 【问题描述】:

我有一个服务器端渲染的应用程序,并希望在第一次渲染时可以访问数据。如果用户导航到下一页,我想使用 graphQL 库 Apollo 来获取新内容。

当一个页面被请求时,服务器用被请求页面的数据设置initialState键curPage。例如,用户请求http://example.com/about。我从数据库中获取/about 的页面数据,将initialState 键curPage 设置为数据库中的该数据。

所以我的 initialState 可能看起来像这样:


  "curPage": 
    "id": 5,
    "title": "About",
    "slug": "about",
    "path": "/about",
    "template": "about",
    "published": "2017-07-10 02:02:30",
    "image": null,
    "seo": 
      "title": null,
      "description": null,
      "image": null,
      "fbAdmins": null,
      "gtm": null,
      "schema": ""
    ,
    "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": [

            ]
          
        ]
      
    ]
  ,

因此,如果该 curPage 数据可用,我想使用它,否则我想从 graphQL 获取。

我的页面组件目前仅从 graphQL 中获取,并且不检查数据在 initialState 中是否可用。

import React,  Component  from 'react'
import  graphql, gql  from 'react-apollo';

import './about.css'

class About extends Component 
  render() 
    return (
      <section className='about-container'>
        <h2>About Page</h2>
      </section>
    )
  


const mapQueryToProps = (data:  findResource , ownProps) =>
  ( curPage: findResource ? findResource[0] : null )

const MY_QUERY = gql`
  query 
    findResource(filter: resource: "pages", slug: "about") 
        id
        title
        slug
        path
        sections
    
  `

 export default graphql(MY_QUERY,  props: mapQueryToProps )(About)

有没有一种方法可以通过 Apollo graphQL 执行类似 react-redux 的 connect() 的操作,但如果它不可用,则从 graphQL 获取?

我猜我需要使用connect(),然后在我的componentDidMount() 中检查数据是否已设置以及是否未检索到它?

【问题讨论】:

【参考方案1】:

你需要将curData转换成Apollo graphql格式,并用它来初始化store的Apollo部分。

您可以在此处阅读具体内容:http://dev.apollodata.com/react/server-side-rendering.html#store-rehydration

注意Apollo其实是支持服务端渲染的,所以如果你在服务端使用Apollo Graphql,它实际上会生成你需要发送给客户端用来初始化客户端Redux store的状态

【讨论】:

酷,看看。谢谢

以上是关于使用 redux 状态以及 Apollo 的 Graphql的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Client 3.0 或 Redux 用于本地状态管理?

Apollo 客户端本地状态 - LoggedIn 查询

Redux-Logger 等效于 Apollo / Graphql

如何将 redux 与 graphql 一起使用

使用 Redux 时访问应用程序范围的客户端?

在使用 django 和 react 时,用 apollo 和 graphql 替换 redux 是个好主意吗?