Estou tendo um comportamento inesperado. Ou seja, coloquei uma condição de salto na consulta e, mesmo quando a condição de salto deveria ser verdadeira, a consulta continua sendo executada. Fiz uma reprodução mínima do bug.
Aplicativo.jsx:
import { useState } from "react";
import "./App.css";
import { Test } from "../test";
import { useApolloClient } from "@apollo/client";
export default function App() {
const [bool, setBool] = useState(false);
const client = useApolloClient();
return (
<main>
<button
onClick={() => {
if (bool) {
client.resetStore();
}
setBool((bool) => {
return !bool;
});
}}
>
Click me
</button>
{bool && <Test bool={bool} />}
</main>
);
}
teste.jsx:
import { gql, useQuery } from "@apollo/client";
const testQuery = gql`
query {
countries {
name
}
}
`;
export const Test = ({ bool }) => {
const { data, loading, error } = useQuery(testQuery, {
skip: !bool,
variables:{holy:"shit"}
});
if (loading) return <p>Loading...</p>;
if (error) return <p>Error :(</p>;
return (
<div>
{data.countries.map((country) => (
<div key={country.name}>{country.name}</div>
))}
</div>
);
};
Estou usando a API de países fornecida pela Apollo GraphQL.
Aqui, quando o botão é clicado pela primeira vez, a consulta é enviada ao servidor que faz sentido. Então, quando ele é clicado novamente (ou seja, tornando bool=false), o cache deve ser limpo e a consulta não deve ser executada, pois está sendo ignorada, mas ela é executada (posso ver que está em execução olhando para a guia de rede). Ao fazer a renderização condicional do teste, pensei que a consulta não seria executada com certeza, pois o componente nem renderizava, mas estava sendo executado novamente, então acho que o problema é que a consulta está em execução entre o momento em que o cache é limpo e o ReactJS atualiza completamente o estado. Acho que não entendo alguns conceitos sobre estados. Como posso evitar que a consulta seja executada quando eu não quero? Agradeço sua ajuda.
Você pode ver aqui por si mesmo relitLink