React Query with hooks is throwing error, "Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop."
React Query with hooks is throwing error, "Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop."
我正在开发一个使用 React 查询、https://react-query.tanstack.com/、React 挂钩和功能组件的 React JS 项目。但是当我对 API 调用使用反应查询时它会抛出错误。
这是我的组件以及我如何在其中使用查询。
const App = () => {
const [ list, updateList ] = useState([])
const info = useQuery(["item-list"], getList, {
retry: false,
refetchOnWindowFocus: false,
})
if (info.status == "success") {
updateList(info.data)
}
return (
//view components here
)
}
这是我的 getList API 调用逻辑
export const getList= async () => {
const { data } = await api.get("8143487a-3f2a-43ba-b9d4-63004c4e43ea");
return data;
}
当我 运行 我的代码时,出现以下错误:
react-dom.development.js:14815 Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
我的代码有什么问题?
这里出现该错误的主要原因是,一旦您将 info.status === 'success'
设为 true
,您就是 if
语句中的代码块 运行 无限循环。然后在每个渲染中调用updateList
触发另一个渲染。
可能我会在这里使用 useEffect
钩子来监听 info
的变化:
useEffect(() => {
if (info.status == "success") {
updateList(info.data)
}
}, [info])
您应该从 <App />
组件的主体中删除 if
语句,并按照上面的建议使用 useEffect
挂钩。通过这样做,if
语句将在 info
发生变化时被检查,而不是在每次渲染时都被检查。
建议阅读 Using the Effect Hook。
我正在开发一个使用 React 查询、https://react-query.tanstack.com/、React 挂钩和功能组件的 React JS 项目。但是当我对 API 调用使用反应查询时它会抛出错误。
这是我的组件以及我如何在其中使用查询。
const App = () => {
const [ list, updateList ] = useState([])
const info = useQuery(["item-list"], getList, {
retry: false,
refetchOnWindowFocus: false,
})
if (info.status == "success") {
updateList(info.data)
}
return (
//view components here
)
}
这是我的 getList API 调用逻辑
export const getList= async () => {
const { data } = await api.get("8143487a-3f2a-43ba-b9d4-63004c4e43ea");
return data;
}
当我 运行 我的代码时,出现以下错误:
react-dom.development.js:14815 Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
我的代码有什么问题?
这里出现该错误的主要原因是,一旦您将 info.status === 'success'
设为 true
,您就是 if
语句中的代码块 运行 无限循环。然后在每个渲染中调用updateList
触发另一个渲染。
可能我会在这里使用 useEffect
钩子来监听 info
的变化:
useEffect(() => {
if (info.status == "success") {
updateList(info.data)
}
}, [info])
您应该从 <App />
组件的主体中删除 if
语句,并按照上面的建议使用 useEffect
挂钩。通过这样做,if
语句将在 info
发生变化时被检查,而不是在每次渲染时都被检查。
建议阅读 Using the Effect Hook。