在接触到 useEffect 的依赖时,很容易产生一个误解,就是 state 必须在依赖中,才能获取到正确的值,但这实际是是错误的理解。

我们需要建立一个正确的概念,就是当 useEffect 运行时,它实际上是对当前组件的所有 state 进行了一次捕获,也就意味着,在 effect 内部,所有 state 都是 effect 运行时的状态。

理解了这个概念之后,我们就可以来看实际的例子了

const [a, setA] = useState(0)
const [b, setB] = useState('apple')

const onChange = () => {
  setA(1)
  setB('banana')
}

useEffect(() => {
  console.log(a, b)
  // 1 banana
}, [a])

就像这里提到的,尽管我们的 useEffect 没有将 b 设置为依赖,但是在 effect 内部依然能获取到 b 的最新状态,这就是因为当这个 effect 运行时,会捕获 a, b 的状态,而不仅仅是 a,因此 b 也是改变之后的值。

这一点在某些情况下会非常有用,因为有时候我们只想在 a 改变的时候执行一些 effect,但是又希望能使用所有 state 的最新状态的值。这时候我们可以灵活的利用这个特性,尽管很多 lint 规则都会将这个情况判定为 warning。

另外还要注意一个情况,这种用法仅在对 a b 两个 state 设置在同步流程下进行的时候有效,如果是异步流程,则不能这样使用。