<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 />
コンポーネントがあります-
<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>
switchSelectedProduct
が<Mutation />
コンポーネント内で呼び出されると、console.log("refetchQueries", product.id);
ステートメントを見るとrefetchQueries
を実行しますが、<Query />
コンポーネントのHome.js
コンポーネントの更新結果は表示されません。
<Query />
ファイルでrefetchQueries
が実行されたときに通知を受けるようにHome.js
のMain.js
コンポーネントに指示するにはどうすればよいですか?
助言がありますか?
私はいくつかの助けを借りてそれを解決しました。 refetchQueries
には、別のコンポーネントからのデータを更新しないため、明らかにバグがあります。しかし、refetchQueries
はまったく必要ありませんでした。
Home
コンポーネントを別のQuery
でラップしました:
<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>
次に、Main
コンポーネントを別のQuery
でラップし、ミューテーションが適用されると状態が変わるようにしました。この方法では、refetchQueries
はまったく必要ありません。別のコンポーネントまたは同じコンポーネントからMutation
が実行された場合、Query
またはMutation
コンポーネントをラップするだけです。
<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>
ドキュメントから:refetchQueries: (mutationResult: FetchResult) => Array<{ query: DocumentNode, variables?: TVariables} | string>
。したがって、おそらくオブジェクトだけではなく配列を返す必要があります
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
refetchQueries={() => {
console.log("refetchQueries", product.id)
return [{
query: GET_TODOS_BY_PRODUCT,
variables: { id: product.id }
}];
}}
>
関数を返す代わりに、オブジェクトの配列を直接渡す必要があります
<Mutation refetchQueries={[{query:YOUR_QUERY}>
...code
</Mutation>