alb*_*ert 6 reactjs react-hooks
我已将 useEffect 配置为仅在其依赖项更改时运行:
useEffect(() => {
localStorage.setItem("cart", JSON.stringify(cart));
}, [cart])
Run Code Online (Sandbox Code Playgroud)
但是当组件第一次渲染时。useEffect 钩子为什么会调用?
Cer*_*nce 14
这就是useEffect工作原理。无论依赖项数组是什么,所有回调都会在组件安装时运行- 无论其中的值是什么,无论它是否为空,无论它是否存在。
如果您想避免这种情况,您可以检查购物车是否等于 ( ===) 购物车的初始值。
const [cart, setCart] = useState(initialCart);
useEffect(() => {
if (cart !== initialCart) {
localStorage.setItem("cart", JSON.stringify(cart));
}
}, [cart]);
Run Code Online (Sandbox Code Playgroud)
在直接比较可能产生误报的情况下 - 例如状态是否是基元而不是数组,因此尽管===不在初始渲染中,但可能是初始值 - 您将需要另一种方法来检查组件是否是安装与否,例如通过状态isMounted或引用。
我已经使用这个来防止安装:
let storageRef = useRef(true);
useEffect(() => {
if (!storageRef.current) {
localStorage.setItem("cart", JSON.stringify(cart));
}
return () => { storageRef.current = false; }
}, [cart])
Run Code Online (Sandbox Code Playgroud)
这是不是一个好主意?
| 归档时间: |
|
| 查看次数: |
7278 次 |
| 最近记录: |