项目背景:
使用react Hooks中的useEffect勾子
问题:
react Hocks中的useEffect勾子,第二参数传值复杂(引用)类型造成页面的死循环
import React, { useState, useEffect } from 'react';
function Example() {
const [obj, setObj] = useState({item:''});
useEffect(() => {
setObj({test:"obj是一个对象,使得页面死循环"})
},[obj]);
return (
<div>
<p>You clicked {obj.item} times</p>
<button onClick={() => setObj((x)=>{
x.item=1
return x
)}>
Click me
</button>
</div>
);
}
react Hocks中的useEffect勾子极大简化了代码,但是又有些副作用,这些副作用用好了提高效率,用不好加班不断!
useEffect接受两个参数:
| 参数情况 | 效果 | 注意 |
|---|---|---|
| 不传 | 每次渲染后都执行清理或者执行effect | 这可能会导致性能问题,比如两次渲染的数据完全一样 |
| 传空数组 | 只运行一次的 effect(仅在组件挂载和卸载时执行) | 这就告诉 React 你的 effect 不依赖于 props 或 state 中的任何值,所以它永远都不需要重复执行 |
| 传[obj] | React 将对前一次渲染的obj和后一次渲染的obj进行比较。若相等React 会跳过这个 effect, | 实现了性能的优化 |
上面例子中之所以造成页面的死循环,是因为在JavaScript中,{} ==={}结果是false,{a:1}=== {a:1}同样,由此造成了react以为两个值不同,就一直的渲染最终页面死循环。
1、第二个参数一般情况下不要使用引用类型!
2、使用lodash里的isEqual:
