在 React 或 JS 中,由于闭包,函数外部的变量被访问,函数会保留对它们的引用。并且在渲染时,状态变量会更改其引用,从而使函数捕获的引用无效。但是函数“setState”呢?每次渲染后它是否也会更改其引用? 在下面的组件中,setCount 被 eventListener 调用,并且 setCount 的渲染地址应该更改。作为对scrollHandler 的引用而给出的旧的不应更新UI。但这并没有发生? 我知道通过使用 scrollHandler ( setCount(count) ) 内的计数,将捕获计数的引用。但为什么不使用 setCount 呢?
import React, { useEffect, useState } from 'react'
import './Navbar.css';
import logo from '../../assets/logo.png'
const Navbar = () => {
const [count, setCount] = useState(0);
console.log("Count is " + count);
useEffect(() => {
const scrollHandler = () => {
console.log("Handler is called");
setCount((count) => count + 1);
}
window.addEventListener('scroll', scrollHandler);
}, [])
return (
<></>
)
}
export default Navbar
如果它不更改引用,那么它如何更改当前计数(在 render 上定义)和旧计数(由 rollHandler 捕获)取决于我们是否使用 setCount(count + 1) 或 setCount ((count) => count + 1)).
我读过几篇关于闭包引起的问题的文章,但它们都集中在state变量上,我找不到任何关于setState函数的解释。
useState
钩子更新函数是一个稳定的参考,这就是为什么强烈推荐eslint-plugin-react-hooks插件不会将状态更新函数(即setCount
)标记为缺少依赖项。换句话说,React 已经知道它是一个稳定的引用,不会改变渲染周期。
但是如果它是一个*不稳定的引用并且你正在使用
eslint-plugin-react-hooks
插件那么你会收到一个关于setCount
是一个缺失依赖项的警告,并且你应该自己记住它,就像任何其他一样外部回调依赖。