【发布时间】:2019-02-26 06:43:36
【问题描述】:
我目前正在将 React 和 Graphql 与 Apollo 和 react-apollo 一起使用。
当我想从 Graphql 加载数据时,我通常使用 react-apollo 中的
但是通过这样做,当缓存更新或重置时,通过 ApolloConsumer 加载的所有内容都不会更新。 这是一个例子:
import React, { Component } from "react";
import { render } from "react-dom";
import ApolloClient from "apollo-boost";
import { ApolloProvider, ApolloConsumer, Query } from "react-apollo";
import gql from "graphql-tag";
const client = new ApolloClient({
uri: `https://m08pj5j9k9.lp.gql.zone/graphql`
});
class App extends Component {
state = { client: [] };
renderQuery = () => {
return (
<Query query={gql`{test01 {id, name}}`}>
{({ loading, error, data }) => {
if (loading) return "Loading...";
if (error) return "Error";
return (
<ul>
{data.test01.map(data => <li key={data.id}>{data.name}</li>)}
</ul>
);
}}
</Query>
);
};
btnQueryClick = async client => {
const data = await client.query({ query: gql`{test02 {id, name}}` });
this.setState({ client: data.data.test02 });
};
render() {
return (
<ApolloProvider client={client}>
<div>
<h2>Query test</h2>
{this.renderQuery()}
<ApolloConsumer>
{client => (
<div>
<h2>Client query test</h2>
<button onClick={() => this.btnQueryClick(client)}>
Test!
</button>
<ul>
{this.state.client.map(data => (
<li key={data.id}>{data.name}</li>
))}
</ul>
<h2>Store reset</h2>
<button
onClick={() => {
client.resetStore();
}}
>
{" "}
Reset!
</button>
</div>
)}
</ApolloConsumer>
</div>
</ApolloProvider>
);
}
}
render(<App />, document.getElementById("root"));
这是一个现场试用的链接:https://codesandbox.io/s/5460952y3k
在所有请求中,我填充了一个随机数,因此我知道数据是否已更改。 如您所见,如果我按下重置按钮,会更新“查询测试”部分中的数据,但不会更新“客户端查询测试”部分中的数据。
有没有办法用 ApolloConsumer 模拟相同类型的更新?
谢谢
【问题讨论】:
-
数据保留的原因是您在调用
this.setState({ client: data.data.test02 });时将其存储在状态中。当您重置存储时,数据将不再在缓存中,但仍将处于组件状态。您也可以通过在单击重置按钮时手动重置组件状态来解决此问题。 -
@TLadd 但是即使我没有在状态下存储数据,如果我查看浏览器上的网络选项卡,我只会在重置存储后看到 test01 被重新获取。
标签: reactjs graphql react-apollo