我正试图使用钩子将Axios的响应保存到状态。但是,每当我尝试使用钩子时,组件都会继续无限次地重新渲染。
const [orders, setOrders] = useState([]);
const getUserOrders = async () => {
await API.getOrders(window.sessionStorage.id)
.then(res => setOrders(res.data.ordersArr))
.catch(err => console.log(err));
}
useEffect(() => {
if (logged_in) {
getUserOrders();
} else {
window.location.href = "/login";
}
}, [orders])
如果我控制台日志res.data.ordersArr而不是使用setOrders挂钩,我就能看到预期的数据。当我使用钩子时,它会不断地重新渲染。
您需要重构
- 您的React Hook useEffect具有依赖项
orders
,它将无限次重新渲染 - 等待之后的
.then
没有任何意义,要么去掉async/await,要么包括promise回调
const getUserOrders = () => {
API.getOrders(window.sessionStorage.id)
.then(res => setOrders(res.data.ordersArr))
.catch(err => console.log(err));
}
useEffect(() => {
if (logged_in) {
getUserOrders();
} else {
window.location.href = "/login";
}
}, [])
每次orders
状态更改时,useEffect
钩子都将重新运行,当useEffect
钩子运行时,您将从API获取数据,然后设置orders
。这反过来又触发了具有orders
的新值的渲染,从而使useEffect
调用无效,并导致其再次激发,最终导致无限循环。
您只想通过传递一个空的依赖项列表useEffect(..., [])
来强制useEffect
运行一次