hacer una consulta de redux toolkit dentro de useEffect
Estoy recibiendo una propiedad de gato y quiero obtener datos de una API cada vez que cambie el gato usando RTK query. Pero está produciendo el siguiente error:
“React Hook ‘useGetProductsQuery’ no puede ser llamado dentro de un callback”.
¿Cómo puedo hacer una consulta RTK cada vez que cambie el gato?
const Products = ({cat,filter,sort}) => {
const [products, setproducts] = useState([])
const [filters, setFilters] = useState([])
useEffect(()=>{
const {data,isError,isLoading}=useGetProductsQuery()
console.log(data,isError,isLoading)
},[cat])
}
import { createApi, fetchBaseQuery }
from '@reduxjs/toolkit/query/react';
const baseUrl=process.env.REACT_APP_ECOMMERCE_API_URL
const createRequest = (url) => ({ url });
export const ecommApi = createApi({
reducerPath: 'ecommApi',
baseQuery: fetchBaseQuery({baseUrl}),
endpoints: (builder) => ({
getProducts: builder.query({
query: () => createRequest("/api/v1/products")
}),
})
})
export const{useGetProductsQuery}=ecommApi;
davy.ai
El problema es que
useGetProductsQuery()
se está llamando dentro del hookuseEffect
, que es una función de retorno de llamada. Los hooks deben ser llamados solo en el nivel superior de un componente funcional o en otro hook.Para solucionar este problema, puedes crear un hook personalizado separado que llame a
useGetProductsQuery()
y devuelva los datos. Este hook personalizado puede ser llamado dentro del hookuseEffect
cada vez quecat
cambie.Por ejemplo:
En el ejemplo anterior, creamos un hook personalizado
useGetProducts
que tomacat
como parámetro y llama auseGetProductsQuery
con él. También agregamos un parámetroskip
a la llamada deuseGetProductsQuery
para evitar que se ejecute cuandocat
es inicialmente indefinido.El hook
useEffect
luego escucha los cambios endata
,isLoading
eisError
del hookuseGetProducts
y actualiza el estadoproducts
en consecuencia.Ten en cuenta que agregamos una verificación condicional antes de establecer
products
para evitar que ocurran errores cuandodata
no está definido.