为什么我会在我的函数中看到陈旧的 props 和 state?

194 阅读1分钟

发生场景

当在一个函数里面使用两次setState,且其中一个setState(val)的值val依赖于另外一个setState的结果的时候.

例子:codesandbox.io/s/react-hoo…

发生的原因

闭包陷阱:hooks 的闭包陷阱是指 useEffect 等 hook 中用到了某个 state,但是没有把它加到 deps 数组里,导致 state 变了,但是执行的函数依然引用着之前的 state。

image.png

重新创建函数意味着将使用最新的state值

带入到例子当中来看

const onBtnClick = useCallback(() => {

setList([...list, "item"]);

setVal(list.length * 2);

}, [list]);

在这个函数被声明的时候,使用的都是旧的list值

() => {

setList([...list, "item"]);

setVal(list.length * 2);

}

解决方案

  1. 使用useEffect,并使用正确的依赖项 codesandbox.io/s/react-hoo…
  2. 使用ref,获得最新的值 codesandbox.io/s/bi-bao-xi…

参考文章

  1. blog.51cto.com/u_15506823/…
  2. zh-hans.reactjs.org/docs/hooks-…