setState 函数是否会更改其在 React 中渲染时的引用?

问题描述 投票:0回答:1

在 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函数的解释。

reactjs react-hooks
1个回答
0
投票

useState
钩子更新函数是一个稳定的参考,这就是为什么强烈推荐eslint-plugin-react-hooks插件不会将状态更新函数(即
setCount
)标记为缺少依赖项。换句话说,React 已经知道它是一个稳定的引用,不会改变渲染周期。

但是如果它是一个*不稳定的引用并且你正在使用

eslint-plugin-react-hooks
插件那么你会收到一个关于
setCount
是一个缺失依赖项的警告,并且你应该自己记住它,就像任何其他一样外部回调依赖。

© www.soinside.com 2019 - 2024. All rights reserved.