javascript - 使用 Apollo Client 在 ReactJs 中的组件之间发送数据
问题描述
根据文档,GraphQl 提供了类似 Redux 的状态管理。我有 2 个组件。在Component1
我使用 AppoloClient 从服务器获取数据时,它工作正常,并且Component2
我想从cache
(存储)读取数据。
//Component1
import React from "react";
import { gql, useQuery } from "@apollo/client";
const EXCHANGE_RATES = gql`
query GetExchangeRates {
rates(currency: "EUR") {
currency
}
}
`;
const Component1 = () => {
const { loading, error, data } = useQuery(EXCHANGE_RATES);
console.log("component1", data);
return <div>Component1</div>;
};
export default Component1;
//Component2
import React from 'react';
import {gql} from "@apollo/client";
import {client} from "./App";
const Component2 = () => {
const info = client.readQuery({
query: gql`
query EXCHANGE_RATES {
rates(currency: "EUR") {
currency
}
}
`,
});
console.log('component2',info);
return (
<div>
component2
</div>
);
};
export default Component2;
问题:我可以在组件 1 中获取数据,但是当我尝试从组件 2 中读取数据时,我得到undefined
.
问题:如何解决这个问题,以便能够读取在组件 1 中获取的数据,在组件 2 中?此外,如何在 GraphQl 和 Apollo 客户端中传递一个对象,例如在缓存中,并在组件 1 中读取它(如 redux 功能)?
演示:https ://codesandbox.io/s/empty-sun-symv6?file=/src/App.js
解决方案
Apollo 提供客户端状态处理,可以设置为处理您的客户端站点状态,就像我们使用服务器端状态一样。
在您的示例中,这不是您想要的。最近,react 社区发生了一个明显的转变,即服务器端数据不应该存储在您选择的全局状态处理工具中。您的获取工具(在您的情况下为 apollo)应通过缓存响应来处理此问题。
为了解决您的问题,两个组件都使用完全相同的查询,您应该这样做。运行两次查询,让 apollo 处理缓存。因此,您可以将查询提取到查询文件中,或者只创建一个 userRates 挂钩并将其导入组件中,以更好地在组件之间共享逻辑。
要回答为什么您的方法不起作用,您必须了解您在缓存中的查找是在您的请求甚至完成之前发生的,并且此缓存查找不是“反应性的”。
编辑:我只是快速解决这个问题以提供一个起点,如果事情得到清理,可以稍后清理它。
推荐阅读
- kubernetes - 如何在 Istio VirtualService 正则表达式中实现逻辑 OR?
- c# - 场景变化时如何运行一些代码?
- html - 网站宽度总是大于页面
- mysql - 如何编写 SQL 语句从交叉引用表中获取匹配数据?
- macos - Applescript 将 Safari 选项卡拆分为新窗口
- tensorflow - 基于单词/文本输入的推荐引擎需要什么
- neo4j - 最长路径 Neo4j 返回不正确的路径
- python - 如何在指定标记和误差条的多线图上自定义颜色
- python - Python:使用协程进行异步 HTTP 请求响应?
- python - in while 消息弹出 6 次,本应跳出 5 次