【问题标题】:How to call an apollo client query from a redux action如何从 redux 操作调用 apollo 客户端查询
【发布时间】:2017-04-07 19:26:33
【问题描述】:

如果我在我的应用中使用 redux 和 apollo 客户端,从组件外部的操作触发查询的最佳方式是什么。

例如,如果我有一个标准应用程序,配置了 redux 和 apollo 客户端,我应该如何触发“刷新”列表。我可以在具有 gql 的组件本身上触发一个函数,但是我将如何通过一个更符合通量的操作来执行它。

import React, { Component, PropTypes } from 'react';
import { graphql } from 'react-apollo';
import gql from 'graphql-tag';
import { connect } from 'react-redux';
import { refreshProfile } from './actions';

class Profile extends Component { ... }
Profile.propTypes = {
  data: PropTypes.shape({
    loading: PropTypes.bool.isRequired,
    user: PropTypes.object,
  }).isRequired,
};

const UserQuery = gql`
  query getUser {
    user {
      id
      name
    }
  }
`;

const ProfileWithData = graphql(UserQuery)(Profile); 
const ProfileWithDataAndState = connect(
 (state) => ({ user: state.user })),
 )(ProfileWithData);

然后,假设我想触发一个动作来刷新用户数据?由于逻辑在组件本身中,我不确定如何从操作本身触发 gql 查询。

【问题讨论】:

    标签: react-apollo


    【解决方案1】:

    我了解您的需求,因为我几天前刚在您的位置。

    不幸的是:如果你想对graphQL 使用动作,那么你不应该使用apollo,直接使用graphQL。这是一篇非常好的文章,可以引导您完成 - getting started with Redux and GraphQL。为什么?因为 Apollo 使用了一个名为 qraphql(query) 的函数,它调用了它自己的动作。

    ReduxApollo 如何以非常简单的方式工作。

    • Redux:(用户调度一个动作)ActionCreator --> Action --> Middleware --> reducer --> store --> 将数据绑定到用户 props。我们手动控制每个状态。

    • Apollo:(用户将查询/突变传递给graphql(query))全部隐藏(操作 --> 存储)然后将数据绑定到用户道具。

    如果你使用 graphql,你可以说 Apollo 取代了 Redux,因为它与 react 和 graphQL 有更好的集成。

    与此同时,由于 Apollo 仍在开发中,您可能需要 redux for redux-form 等。如果您习惯了一些 redux 库,您可能会考虑在 Apollo 之外继续使用 redux,您仍然可以绑定它们的存储并添加可能适用于两者的中间件,但您可能不会通过 Apollo 使用 Redux 操作获取数据.

    我知道这感觉就像你失去了 redux,但通过 Apollo 处理更多异步请求和缓存,你获得了所有优势。

    如果您需要一个起点react-redux-apollo

    【讨论】:

      【解决方案2】:

      我需要在我的 actions.js 中使用 ApolloClient。例如

      import ApolloClient, { createNetworkInterface } from 'apollo-client';
      const networkInterface = createNetworkInterface({
        uri: config.graphCoolUri,
      });
      
      const client = new ApolloClient({
        networkInterface,
        dataIdFromObject: r => r.id,
      });
      
      const { data } = await client.query({
         query: UserQuery
      });
      

      【讨论】:

      • 你找到办法了吗?
      • 是的,您可以直接使用 apollo 客户端,就像我在答案中的示例代码中一样。
      • 来自其他组件? withApollo?
      猜你喜欢
      • 2018-02-09
      • 2018-02-16
      • 2018-06-07
      • 2017-12-27
      • 2020-11-03
      • 2020-09-29
      • 2021-03-20
      • 2021-06-01
      相关资源
      最近更新 更多