【发布时间】:2022-01-12 10:16:09
【问题描述】:
我正在向心愿单添加项目,一旦添加,我会尝试重新渲染心形图标以在其上显示一个数字,以指示该项目已添加到心愿单。我想要实现的类似于 Twitter 的点赞按钮,当有人点赞帖子时,点赞的数量会立即增加。因此,在我的情况下,当有人喜欢(愿望清单)该产品时,它会增加 Heart 图标顶部的数字。我正在使用本地存储来获取添加到愿望清单的项目,当在效果中添加新项目时,我可以重新渲染愿望清单组件,但它会使组件无限重新渲染,这给了我一个警告的Warning: Maximum update depth exceeded
这是我的效果;
const [wishlist, setWishlist] = React.useState([]);
React.useEffect(() => {
if (typeof window !== "undefined") {
const wishlistStorage =
localStorage.getItem("wishlist") === null
? []
: [...JSON.parse(localStorage.getItem("wishlist"))];
if (wishlistStorage.length > 0) {
setWishlist(wishlistStorage);
}
}
}, [wishlist]);
如果我从依赖数组中删除心愿单,我需要刷新页面以查看正确的项目数。我在这里做错了什么以及解决此问题的最佳方法是什么。谢谢!
【问题讨论】:
-
当然可以,当你让它依赖于你在其中更新的状态时。只在
useEffect的第二个参数中输入您想要重新运行的值。 -
你告诉 React 只在愿望清单状态改变时运行 useEffect,但你正在改变 useEffect 中的愿望清单状态。因此,当您第一次更改愿望清单时,useEffect 会运行,因为愿望清单已更改,但随后 useEffect 已更改愿望清单,这会触发它一次又一次地运行。
-
useEffect 将在“wishlist”更改时重新渲染您的组件,并且您正在通过调用“setWishlist”更改 useEffect 中“wishlist”的值。这就是它陷入无限循环的原因
标签: javascript reactjs react-hooks local-storage