Apollo 客户端的全局加载标志

Posted

技术标签:

【中文标题】Apollo 客户端的全局加载标志【英文标题】:Global Loading Flag for Apollo Client 【发布时间】:2017-10-13 09:08:09 【问题描述】:

是否有全局 loading 标志可用于 react-apollo 客户端?我有一个“页面包装器”组件,我想在所有子组件都收到它们的数据后应用 ui 效果。

我已经用 redux 设置了 apollo,所以可以随时访问商店 (http://dev.apollodata.com/react/redux.html)

我可以很容易地 dispatch 从每个从 apollo 接收数据的组件更改状态,但我希望这个 page wrapper 组件不知道它的子组件或查询。

我使用withApollo 进行了调查 - http://dev.apollodata.com/react/higher-order-components.html#withApollo - 但看不到全局 is loading 的 api。

【问题讨论】:

我怀疑你可以用 Apollo 包装一个 HoC 并在那里添加你的自定义逻辑。 我不知道withApollo 是否为全局loading 状态提供任何API?我想也许是通过它的networkInterface 但看起来不像? 它不是开箱即用的。您可以使用自定义网络接口来实现它,但这似乎是适合这项工作的错误工具。我怀疑用 withCustomApollo 之类的东西包装 withApollo,你可以在那里检查加载状态。 但这不适用于任何一个特定的组件——我希望一个单独的组件知道是否正在进行任何 graphql 调用——除非我只弄错了graphql()包装的组件本身将收到 data/loading 道具 哦,那您绝对可以使用自定义网络接口。包装网络接口(批处理或默认),然后每当它查询时设置它正在加载到单例变量。 【参考方案1】:

您可以通过两种方式实现这一目标:

一种方法是使用Apollo网络接口的中间件/后件。

另一种方法是包装 Apollo 的网络接口以包含您的自定义逻辑。具体来说,您将包装查询方法。

【讨论】:

你能再解释一下吗?我在哪里可以阅读更多关于这些方法的信息?像代码沙箱代码示例或文档或 github repo 解释这一点? 我的评论来自 5 年前,但使用最新版本的 Apollo,我相信您可以创建一个 new ApolloLink(),根据是否收到结果将全局加载值设置为 true/false与否.. 然后有一个像getApolloLoading 这样的全局函数来更新zustand 或redux 中的状态。但是,如果您需要它了解反应状态,您可能需要在 <App /> 组件中初始化 ApolloClient 和 。 你有任何示例代码吗?我正在使用 nuxtjs/apollo,我正在使用本地状态加载并手动更新它。我想知道阿波罗链接中是否有内置的东西可以做到这一点。或者有没有办法将 axios 与 apollo 链接一起使用?就像它在引擎盖下使用的包? 我没有任何示例代码。您可能会更幸运地发布 *** 问题或 reddit.com/r/reactjs。您可以阅读 apollo 的 repos 的 package.json 以查看它是否使用 axios,但这似乎不太可能,因为这将是不必要的依赖。 谢谢,我发现 '@nuxtjs/observable' 会检查它。那么我只需要找到他们如何在 apollo 客户端中进行 api 调用【参考方案2】:

我刚刚发布了一个为 Apollo 2 解决此问题的库:react-apollo-network-status。

要点是:

import React, Fragment from 'react';
import ReactDOM from 'react-dom';
import ApolloClient from 'apollo-client';
import createNetworkStatusNotifier from 'react-apollo-network-status';
import createHttpLink from 'apollo-link-http';

const 
  NetworkStatusNotifier,
  link: networkStatusNotifierLink
 = createNetworkStatusNotifier();

const client = new ApolloClient(
  link: networkStatusNotifierLink.concat(createHttpLink())
);

// Render the notifier along with the app. The
// `NetworkStatusNotifier` can be placed anywhere.
const element = (
  <Fragment>
    <NetworkStatusNotifier render=(loading, error) => (
      <div>
        loading && <p>Loading …</p>
        error && <p>Error: JSON.stringify(error)</p>
      </div>
    ) />
    <ApolloProvider client=client>
      <App />
    </ApolloProvider>
  </Fragment>
);
const node = document.getElementById('root');
ReactDOM.render(element, node);

【讨论】:

以上是关于Apollo 客户端的全局加载标志的主要内容,如果未能解决你的问题,请参考以下文章

为聊天应用程序缓存 apollo 客户端的最佳方式是啥?

如何在本地网络上部署带有 apollo 客户端和 apollo-server 后端的 React 应用程序

Rails、Graphql、Apollo 客户端的 Auth Token 无效

如何重置 Apollo 客户端的 useMutation 钩子

Apollo GraphQL - 如何将 RxJS 主题用作 Apollo 客户端的变量?

启用缓存时模拟服务人员和 Apollo 客户端的最佳实践