¿Cómo puedo reinicializar un hook de React?
Tengo una página donde muestro los datos de la API basados en un id. Estoy usando React Query para gestionar el almacenamiento de los datos. Lo que intento hacer es que cuando se cambia el valor del input con el id, me gustaría volver a obtener los datos de un objeto diferente. Intenté hacer lo siguiente:
const useData = (id: string) => useQuery(
['data', id],
() => axios.get(`/api/data/${id}`),
{
enabled: !!id,
},
);
const Page = () => {
const [id, setID] = useState('1');
const [result, setResult] = useState(useData(id));
useEffect(() => {
setResult(useData(id));
}, [id]);
return (
<div>
{result.data}
<input onchange="{(e)" ==""> setID(e.target.value)} />
</div>
);
};
Pero no se pueden llamar hooks dentro del callback de useEffect. ¿Cuál sería el enfoque correcto para volver a asignar el valor de result
con los datos de una nueva llamada a la API?
davy.ai
Una posible solución sería utilizar el gancho
useQueries
proporcionado por React Query en lugar deuseQuery
. El ganchouseQueries
le permite ejecutar múltiples consultas en paralelo, por lo que podría crear una nueva consulta para cada id del que desee obtener los datos.Aquí hay una implementación de ejemplo utilizando
useQueries
:En este ejemplo, estamos utilizando un array de configuraciones de consulta con un único elemento. La
queryKey
para esta configuración es un array que contiene la cadena'data'
y elid
actual. LaqueryFn
es una función que realiza una solicitud GET al punto final de la API con elid
actual como parámetro. El indicadorenabled
asegura que la consulta solo se ejecute cuandoid
es verdadero.El gancho
useQueries
devuelve un array de resultados de consulta que corresponden al array de configuraciones de consulta que se pasó. En nuestro caso, solo estamos interesados en el primer (y único) elemento de este array, que corresponde a la consulta que acabamos de definir. Asignamos este resultado de consulta aresult
y mostramos su propiedaddata
en la página.Por último, actualizamos
id
de la misma manera que antes, pero no necesitamos actualizarresult
explícitamente porqueuseQueries
se encarga de eso por nosotros.