React Apollo Client 的 Mutation 组件中的 refetchQueries 不起作用?
refetchQueries in Mutation Component of React Apollo Client is not working?
我的 Home.js
文件中有一个 <Query />
Home.js
<Query
query={GET_TODOS_BY_PRODUCT}
variables={{ id: state.get("selectedProduct.id"), completed: true }}
>
{({ data: { product } }) => {
return <Main todos={product.todos} hashtag={product.hashtag} />;
}}
</Query>
在我的 Main.js
文件中我有 <Mutation />
组件 -
Main.js
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
refetchQueries={() => {
console.log("refetchQueries", product.id);
return {
query: GET_TODOS_BY_PRODUCT,
variables: { id: product.id }
};
}}
>
{switchSelectedProduct => (
<Product
onClick={() => {
switchSelectedProduct({
variables: { id: product.id, name: product.name }
});
}}
highlight={
data.selectedProduct
? product.name === data.selectedProduct.name
: i === 0
}
>
<Name>{product.name}</Name>
</Product>
)}
</Mutation>
当在 <Mutation />
组件中调用 switchSelectedProduct
时,它 运行s refetchQueries
正如我看到的 console.log("refetchQueries", product.id);
语句但我没有看到Home.js
文件中 <Query />
组件的更新结果。
如何让 Home.js
中的 <Query />
组件在 Main.js
文件中的 refetchQueries
为 运行 时收到通知?
有什么建议吗?
来自文档:refetchQueries: (mutationResult: FetchResult) => Array<{ query: DocumentNode, variables?: TVariables} | string>
,所以您可能需要 return 一个数组而不只是对象
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
refetchQueries={() => {
console.log("refetchQueries", product.id)
return [{
query: GET_TODOS_BY_PRODUCT,
variables: { id: product.id }
}];
}}
>
我在一些帮助下解决了它。 refetchQueries
中显然存在错误,因为它不会更新来自另一个组件的数据。但是根本不需要refetchQueries
。
我用另一个 Query
包装了我的 Home
组件,例如:
Home.js
<Query
query={GET_ALL_PRODUCTS}
variables={{ id: state.get("user.id") }}
>
{({ data: { user } }) => {
const { id, name } = user.products ? user.products[0] : [];
return <Main id={id} name={name} />;
}}
</Query>
然后我还用另一个 Query
包装了我的 Main
组件,因此它会在应用突变时改变状态。这样你就根本不需要 refetchQueries
了。当执行来自另一个或相同组件的 Mutation
时,只需包装您的 Mutation
或 Query
组件。
Main.js
<Query query={GET_SELECTED_PRODUCT}>
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
>
{switchSelectedProduct => (
<Product
onClick={() => {
switchSelectedProduct({
variables: { id: product.id, name: product.name }
});
}}
highlight={
data.selectedProduct
? product.name === data.selectedProduct.name
: i === 0
}
>
<Name>{product.name}</Name>
</Product>
)}
</Mutation>
</Query>
您必须直接传递对象数组而不是返回函数
<Mutation refetchQueries={[{query:YOUR_QUERY}>
...code
</Mutation>
我为另一个 React 组件中的 refetchQueries 打了很多仗,最好的解决方案,我猜不是最简单或最聪明的,是将 refetch() 函数从一个组件传递到另一个组件
我的 Home.js
文件中有一个 <Query />
Home.js
<Query
query={GET_TODOS_BY_PRODUCT}
variables={{ id: state.get("selectedProduct.id"), completed: true }}
>
{({ data: { product } }) => {
return <Main todos={product.todos} hashtag={product.hashtag} />;
}}
</Query>
在我的 Main.js
文件中我有 <Mutation />
组件 -
Main.js
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
refetchQueries={() => {
console.log("refetchQueries", product.id);
return {
query: GET_TODOS_BY_PRODUCT,
variables: { id: product.id }
};
}}
>
{switchSelectedProduct => (
<Product
onClick={() => {
switchSelectedProduct({
variables: { id: product.id, name: product.name }
});
}}
highlight={
data.selectedProduct
? product.name === data.selectedProduct.name
: i === 0
}
>
<Name>{product.name}</Name>
</Product>
)}
</Mutation>
当在 <Mutation />
组件中调用 switchSelectedProduct
时,它 运行s refetchQueries
正如我看到的 console.log("refetchQueries", product.id);
语句但我没有看到Home.js
文件中 <Query />
组件的更新结果。
如何让 Home.js
中的 <Query />
组件在 Main.js
文件中的 refetchQueries
为 运行 时收到通知?
有什么建议吗?
来自文档:refetchQueries: (mutationResult: FetchResult) => Array<{ query: DocumentNode, variables?: TVariables} | string>
,所以您可能需要 return 一个数组而不只是对象
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
refetchQueries={() => {
console.log("refetchQueries", product.id)
return [{
query: GET_TODOS_BY_PRODUCT,
variables: { id: product.id }
}];
}}
>
我在一些帮助下解决了它。 refetchQueries
中显然存在错误,因为它不会更新来自另一个组件的数据。但是根本不需要refetchQueries
。
我用另一个 Query
包装了我的 Home
组件,例如:
Home.js
<Query
query={GET_ALL_PRODUCTS}
variables={{ id: state.get("user.id") }}
>
{({ data: { user } }) => {
const { id, name } = user.products ? user.products[0] : [];
return <Main id={id} name={name} />;
}}
</Query>
然后我还用另一个 Query
包装了我的 Main
组件,因此它会在应用突变时改变状态。这样你就根本不需要 refetchQueries
了。当执行来自另一个或相同组件的 Mutation
时,只需包装您的 Mutation
或 Query
组件。
Main.js
<Query query={GET_SELECTED_PRODUCT}>
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
>
{switchSelectedProduct => (
<Product
onClick={() => {
switchSelectedProduct({
variables: { id: product.id, name: product.name }
});
}}
highlight={
data.selectedProduct
? product.name === data.selectedProduct.name
: i === 0
}
>
<Name>{product.name}</Name>
</Product>
)}
</Mutation>
</Query>
您必须直接传递对象数组而不是返回函数
<Mutation refetchQueries={[{query:YOUR_QUERY}>
...code
</Mutation>
我为另一个 React 组件中的 refetchQueries 打了很多仗,最好的解决方案,我猜不是最简单或最聪明的,是将 refetch() 函数从一个组件传递到另一个组件