即使状态值没有变化,也反应组件渲染

恶作剧

从 React Docs 中,我了解到只有当状态值发生变化时,组件才会重新渲染。

例如

import React, { useState } from "react";

export default function Counter() {
  const [count, setCount] = useState(0);

  console.log("I am rendering");

  const handleButtonClick = () => {
    setCount(0);
  };
  return (
    <>
      <button onClick={handleButtonClick}>Increment</button>
      Count value is: {count}
    </>
  );
}

即使我们单击按钮,该消息I am rendering也只会打印一次setCount,因为该函数正在将值设置0为当前值count

由于当前值和未来值没有变化,因此组件不会重新渲染。

意外行为

setCount(1)但是,当我们之前添加额外的行时,没有观察到类似的行为setCount(0)

import React, { useState } from "react";

export default function Counter() {
  const [count, setCount] = useState(0);

  console.log("I am rendering");

  const handleButtonClick = () => {
    setCount(1); //this line has been added extra
    setCount(0);
  };
  return (
    <>
      <button onClick={handleButtonClick}>Increment</button>
      Count value is: {count}
    </>
  );
}

count原则上,最终值的输出没有变化。但是,如果我们单击按钮,组件会重新渲染并打印消息I am rendering


我找不到这种行为的解释。这是预期线路上的行为吗?

只有当状态的最终值与当前值不同时,组件不应该重新渲染吗?

丹尼斯·瓦什

有时,Reacts 需要另一个渲染阶段来决定它是否需要救助。顺便说一句,当我们说“救助”时,意味着救助和解过程。

请注意有关救助状态更新的文档:

请注意,React可能仍需要在 bail out 之前再次渲染该特定组件

这是另一个例子,展示了这个想法:

import React, { useEffect } from "react";
import ReactDOM from "react-dom";

const App = () => {
  const [state, setState] = React.useState(0);

  useEffect(() => {
    console.log("B");
  }, [state]);

  console.log("A");

  return (
    <>
      <h1>{state}</h1>
      <button onClick={() => setState(42)}>Click</button>
    </>
  );
};

ReactDOM.render(<App />, document.getElementById("root"));

编辑 React 状态触发器

您会注意到下一个日志及其解释:

A // First render
B // Mount

A // State change from 0 -> 42, triggers render
B // useEffect dep array change, triggers callback

A // **Our issue**, React needs another render

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

反应:即使状态没有变化也要重新渲染

反应:将组件状态值复制到剪贴板,而没有虚拟元素

为什么反应功能组件中的回调没有读取更新的状态值

React Native:根据 Modal 中的状态值变化渲染条件组件

即使实际值相同,状态变化时组件也会重新渲染

在使用钩子的反应中没有得到更新的状态值?

反应状态值消失

反应:父组件重新渲染所有子组件,即使状态更改未改变的子组件也是如此

React组件没有使用相同的道具重新渲染,但是子状态发生了变化

反应没有类的有状态组件

如何使反应输入显示状态值?

如何获取最新的状态值?反应

即使状态没有改变,React 组件在重新渲染时也会创建一个新的状态实例

即使内部值没有改变,组件 getter 也会触发重新渲染

为什么用旧值调用useState的setter随后会触发组件更新,即使旧状态值等于新状态值

如何重置组件的状态值?

在组件之间传递状态值?

根据组件状态值的While循环

反应状态变化没有按预期工作

页面刷新后,即使状态发生变化,React也不会重新渲染组件

反应渲染使用旧的和新的状态值,而不仅仅是新值

反应状态变化不会导致重新渲染

Formik 重新渲染反应状态变化

如果部分状态发生变化,如何停止反应重新渲染组件?

我的组件不会在状态变化时重新渲染本机反应

你能控制基于状态变化的功能性反应组件的重新渲染吗?

反应组件不会随着状态变化而更新

基于状态变化的组件条件渲染

状态变化不会重新渲染组件