浅与深
如果你进行浅层比较,你的代码会被执行,如果你的逻辑涉及更新相同的状态,有时会出现错误Maximum call stack size exceeded,因为每次更新的引用都不相同。
因此,使用一些库来执行深度比较会很有用,或者至少比较您感兴趣的属性以运行您的代码。
获取上一个状态
比较它们听起来可能很困难,因为一开始你手边没有prevState。为了实现这一点,您可以利用 useRef,创建一个 usePrevious 自定义钩子,就像 react docs 中建议的那样来存储以前的状态:
function usePrevious(value) {
const ref = useRef();
useEffect(() => { ref.current = value });
return ref.current;
}
您可以在您的组件中使用它,例如:
const [arr, setarr] = useState([1, 2, 3])
const previousArr = usePrevious(arr)
比较状态
最后,您将使用useEffect(将您的 state 和 prevState 作为依赖项)在其中进行一些验证以执行您的代码:
useEffect(() => {
const isEqual = _.isEqual(arr, previousArr)
isEqual
? console.log('same content')
: console.log('different content')
}, [arr, previousArr])
注意:在山上previousArr 是undefined,这样他们就不相等了。如果您想跳过 Mount 上的任何操作,您可以验证 previousArr 是否未定义。