从为 GraphQL 分派的 redux 操作中访问 Apollo 客户端

Posted

技术标签:

【中文标题】从为 GraphQL 分派的 redux 操作中访问 Apollo 客户端【英文标题】:Reaching Apollo client from dispatched redux actions for GraphQL 【发布时间】:2018-06-07 15:52:56 【问题描述】:

我正在尝试将 Apollo 集成到我的 react-app 中。

我想发送一个带有查询参数的操作,并在该操作中处理该查询,并将解析的 Promise 作为有效负载传递给相应的减速器。

我的方法如下;

我有一个client.js 文件

import  graphql  from 'react-apollo';
import  ApolloProvider  from 'react-apollo';
import  ApolloClient  from 'apollo-client';
import  HttpLink  from 'apollo-link-http';
import  InMemoryCache  from 'apollo-cache-inmemory';

const client = new ApolloClient(
  link: new HttpLink( uri: 'https://api.graph.cool/simple/v1/cixos23120m0n0173veiiwrjr' ),
  cache: new InMemoryCache()
);

export default client

然后我要从我的组件中分派以下操作。

import client from '../graphclient'

export function gQLFetch(query) 

  const data = client.query(query: query)

  return 
    type: "gQL_FETCH",
    payload: new Promise((resolve, reject) => 
      data.then(response => resolve(response)).catch(error => reject(error))
    )
  

最后,我的 reducer 处理调度的动作并返回状态

const apiReducer = (state=[], action) => 
  switch (action.type) 
    case "gQL_FETCH_FULFILLED":
      state = action.payload.data.allMovies
      break;
  
  return state;


export default apiReducer

这对我来说很好用。

但是,Apollo 的文档建议在 index.js 文件中定义 client 并在组件树顶部使用 <ApolloProvider> 标签和 client 属性将客户端传递给整个应用程序,如下所示;

ReactDOM.render(<ApolloProvider client=client><Provider store=store><App /></Provider></ApolloProvider>, document.getElementById('root'));

我的第一个问题:我的方法是一种好的做法吗?我觉得不是,因为&lt;ApolloProvider&gt; 提供了一种将客户端服务于整个应用程序的方法。

那么我的第二个问题来了:如何在我的 redux 操作中到达客户端以传递查询参数?

【问题讨论】:

【参考方案1】:

ApolloProvider HoC 对我来说是有意义的,如果你想将数据直接填充/注入到组件中。如果您想拥有不同的数据管理,您可能会创建自己的客户端请求和数据获取机制。

您处理异步请求的方式不正确。您应该使用 redux-thunk 或 redux-saga 来管理此类副作用。 reducer 函数应该是同步的,并且只接收最终获取的数据。正如我在您的示例中看到的那样,reducer 收到了一个需要通过缺少的 .then 方法处理的承诺。也许您正在使用中间件或其他东西?我建议阅读有关 redux-saga 的更多信息并调度三个操作 - REQUESTREQUEST_SUCCESSFULREQUEST_FAILURE

【讨论】:

我使用redux-promise-middleware 来处理promise,因此reducer 的开关中的类型名称为gQL_FETCH_FULFILLED。可以吗?

以上是关于从为 GraphQL 分派的 redux 操作中访问 Apollo 客户端的主要内容,如果未能解决你的问题,请参考以下文章

使用 IIFE 从 Thunk 分派 Redux 操作

从非反应文件分派操作时 Redux 状态未更新

将异步操作分派到 redux-saga 后如何捕获 redux 存储中的更改

即使没有分派任何操作,Redux 状态也会在加载时更改

React Native Redux:动作分派,返回结果

Redux 状态未在 Redux DevTool 中更新