J'ai un _<Query />
_ dans mon fichier _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>
_
Dans mon fichier _Main.js
_ j'ai le composant _<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>
_
Lorsque switchSelectedProduct
est appelé dans le composant _<Mutation />
_, il exécute refetchQueries
comme je vois l'instruction console.log("refetchQueries", product.id);
mais je ne vois pas les résultats mis à jour dans le _<Query />
_ composant dans le fichier _Home.js
_.
Comment dire au composant _<Query />
_ dans _Home.js
_ d'être averti lorsque refetchQueries
est exécuté dans le fichier _Main.js
_?
Aucune suggestion?
Je l'ai résolu avec de l'aide. Il y a apparemment un bogue dans refetchQueries
car il ne met pas à jour les données d'un autre composant. Mais refetchQueries
n'était pas du tout nécessaire.
J'ai enveloppé mon composant Home
avec un autre Query
comme:
<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>
Ensuite, j'ai également enveloppé mon composant Main
avec un autre Query
afin qu'il change d'état lorsque la mutation est appliquée. De cette façon, vous n'avez pas du tout besoin de refetchQueries
. Enveloppez simplement votre composant Mutation
ou Query
lorsque Mutation
à partir d'un autre ou du même composant est effectué.
<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>
De docs: refetchQueries: (mutationResult: FetchResult) => Array<{ query: DocumentNode, variables?: TVariables} | string>
, donc probablement vous devez retourner un tableau au lieu de simplement l'objet
<Mutation
key={v4()}
mutation={SWITCH_SELECTED_PRODUCT}
refetchQueries={() => {
console.log("refetchQueries", product.id)
return [{
query: GET_TODOS_BY_PRODUCT,
variables: { id: product.id }
}];
}}
>
Au lieu de renvoyer une fonction, vous devez passer directement le tableau d'objets
<Mutation refetchQueries={[{query:YOUR_QUERY}>
...code
</Mutation>