当前位置: 首页 > 知识库问答 >
问题:

反应useState导致双重渲染

归松
2023-03-14

考虑规范的useState示例:

import React, { useState } from 'react';

const MyComponent = () => {
  const [count, setCount] = useState(0);
  console.log(count);
  return (
    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
      count: {count}
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default MyComponent;

单击按钮使每个状态打印两次。为什么呢?

共有3个答案

景德海
2023-03-14
const countRef = useRef(1);
countRef.current += 1;

这样,渲染将一次执行2次

const countRef = useRef(1);
useEffect(() => {
   countRef.current += 1;
})

这样,渲染将一次执行1次

龙高超
2023-03-14

关于双重重新渲染的更多信息(根据关闭的反应问题)。

这是StrictMode的一个有意的特性。这只发生在开发中,并有助于发现意外的副作用放入渲染阶段。我们只对带有钩子的组件这样做,因为这些组件更有可能在错误的地方意外产生副作用。

https://github.com/facebook/react/issues/15074

另一个相关问题在这里。

useState()执行双重渲染

汪同
2023-03-14

放置控制台。在一个没有依赖项的useffecthook中记录,您将看到它实际上不会呈现两次。

import React, { useEffect, useState } from 'react';

const MyComponent = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log(count);
  });
  
  return (
    <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
      count: {count}
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default MyComponent;

这是一个很好的组件生命周期图,它列出了基于类的生命周期函数,但呈现/提交阶段是相同的。

需要注意的重要一点是,组件可以“渲染”,而无需实际提交(即,您在屏幕上看到的常规渲染)。控制台。日志本身就是其中的一部分。效果在“提交”阶段之后运行。

使用效果

... 传递给useEffect的函数将在渲染提交到屏幕后运行。。。

默认情况下,效果在每次完成渲染后运行。。。

检测意外的副作用

严格模式不能自动为您检测副作用,但它可以通过使副作用更具确定性来帮助您发现副作用。这是通过故意双重调用以下函数来实现的:

  • 类组件构造函数呈现,以及应组件更新方法

这只适用于开发模式。

 类似资料:
  • 我在函数组件中使用useState(),第一个渲染调用两次。这是正确的还是错误的?如果正确,为什么渲染两次?setCount也会渲染组件两次。 谢啦

  • 嗨,我不确定这是一个期望的行为还是一个bug。 这是一个空的create react应用程序示例,带有 版本: 反应:^16.13.1, react-dom:^16.13.1, react-router-dom:^5.2.0, 反应脚本:3.4.1 部件: /-对于主部件 /触点-用于触点组件 这里提供小提琴 多次单击“主页”链接会显示一条

  • 问题内容: 我读约阵营,并在“ 鱼钩常见问题解答 ”,我糊涂了关于一些使用案例,似乎有useRef和useState解决方案的同时,我不知道哪条路是正确的方式。 从关于useRef()的“挂钩常见问题”中: “ useRef()钩不仅用于DOM引用。“ ref”对象是通用容器,其当前属性是可变的,并且可以保存任何值,类似于类的实例属性。” 使用 useRef() : 使用 useState() :

  • 问题内容: 我在网页上实现了控件。此网页要求上载的文件显示在中。 其中包含以下列:“ 文件名 ”,“ 机密 ”复选框和“ 删除 ”按钮,用于删除上载的文件。 由于回发不执行 整页 回发,因此我需要在AsyncFileUpload控件的事件中“强制”回发,以便在上传文件后呈现gridview。 在中,我使用javascript进行调用。在此回发中,我仅绑定GridView并显示文件信息(我不重新保存

  • 问题内容: 我正在尝试使用新的Hooks从类组件转变为功能组件。但是,感觉与类组件中的类函数不同,我将获得不必要的子代渲染。 下面有两个相对简单的片段。第一个是我的示例编写为类,第二个是我的示例重写为功能组件。目的是使功能组件获得与类组件相同的行为。 类组件测试用例 功能组件测试用例 在第一个(类组件)中,我可以通过红色块更新计数,而无需重新渲染任何一个块,并且我可以通过橙色块自由地控制台记录当前

  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的