React Hooks:重新渲染时的setState功能

伊斯瓦尔

这是一个有关使用钩子时可能导致性能下降的问题。useState从react docs引用示例:

function Counter({initialCount}) {
  const [count, setCount] = useState(initialCount);
  return (
    <>
      Count: {count}
      <button onClick={() => setCount(initialCount)}>Reset</button>
      <button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
      <button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
    </>
  );
}

React保证setState函数身份是稳定的,并且在重新渲染时不会改变。这就是为什么安全地从useEffect或useCallback依赖项列表中省略的原因。

我有两个有关的用法查询useState

  • 什么identity is stable and won’t change on re-renders意思
  • 我可以看到,对于每个按钮,都有一个anonymous函数作为事件处理程序传递。即使setState identity is stableReact声称的是真的,难道不是每次重新渲染都会重新创建匿名函数吗?

如果useCallback用于定义备注函数并将其用作事件处理程序,会不会更有效

阿文·卡维什(Avin Kavish)

什么是身份稳定的,并且在重新渲染后不会改变?

返回的函数useState在渲染周期内不会更改。也就是说,在第一个渲染周期设置状态后,仍可以调用在第一个渲染周期返回的调度函数。这使您可以在任何时候使用分派功能来设置钩子,而无需在函数引用更改时刷新钩子。

  useEffect(() => {
    setCount(initialCount);
  }, [ initialCount, setCount ]); // <--- setCount is not needed here

我可以看到每个按钮都有一个匿名函数作为事件处理程序传递。即使React声称的setState身份是稳定的,也不会在每次重新渲染时都重新创建匿名函数吗?

是的,箭头函数将在重新渲染时重建。另一种方法是用于useCallback记忆回调,但是要付出什么代价?调用useCallback的成本,记忆该回调的成本,构建对该回调的引用的成本以及在每个重新渲染的情况下检索该回调的成本都远远超过了在每个重新渲染的情况下简单构建函数的好处。

useCallback函数本身有20行,带有对其他内部React API的其他3个嵌套函数调用。所有这些都可以防止在每个渲染器上执行单行功能?数学加起来并没有useCallback唯一有用的情况是,您希望回调通过引用或其他某种方式具有“稳定的身份”,以便您可以将回调作为道具传递而不会引起过多的重新渲染。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

React功能组件在渲染时重新初始化局部函数和变量(React Hooks)

React Hooks:跳过多个连续setState调用的重新渲染

在 API 调用之后 setState 时 React 不会重新渲染

当 React 功能组件重新渲染时,它会重新分配分配的值和功能吗?

使用 React Hooks 限制 Firebase 重新渲染

当props数据通过react hooks改变时我想重新渲染,但是我得到了无限的重新渲染

React Native setState不重新渲染

React setState 不会重新渲染元素

当值相等时,React Hooks useState setValue仍会重新渲染一次

如何根据项目列表防止使用React Hooks,功能组件和功能进行不必要的重新渲染

我使用 React hooks 和 React memo 来防止我的功能组件重新渲染,但不起作用?

React-在将功能作为道具传递时,功能组件保持重新渲染

React useEffect不重新渲染功能组件

停止重新渲染react功能组件

React功能组件中的重新渲染逻辑

当更改作为数组传递的道具时,React功能组件不会重新渲染

React Hooks useCallback和备忘录列表重新渲染

使用 React Hooks 和 Redux 重新渲染太多

React Custom Hooks 和 useEffect 无限重新渲染

使用 Hooks 在 React 中重新渲染时停止/防止滚动到顶部(需要实现无限滚动)

使用react usestate挂钩防止为每个setstate重新渲染

React setState不使用Context触发重新渲染

React 组件不会在 setState({}) 上重新渲染

React setState / Flux-是否总是触发重新渲染?

React.js setState不会重新渲染子组件

React:是否在每个setState()上完全重新渲染了组件?

React DOM不会相应地重新渲染到setState

重新渲染过多。React限制渲染次数以防止无限循环-React hooks

使用 Redux 和 React Hooks,Flatlist 不会重新渲染,也不会重新渲染其中的各个组件