考虑规范的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;
单击按钮使每个状态打印两次。为什么呢?
const countRef = useRef(1);
countRef.current += 1;
这样,渲染将一次执行2次
const countRef = useRef(1);
useEffect(() => {
countRef.current += 1;
})
这样,渲染将一次执行1次
关于双重重新渲染的更多信息(根据关闭的反应问题)。
这是StrictMode的一个有意的特性。这只发生在开发中,并有助于发现意外的副作用放入渲染阶段。我们只对带有钩子的组件这样做,因为这些组件更有可能在错误的地方意外产生副作用。
https://github.com/facebook/react/issues/15074
另一个相关问题在这里。
useState()执行双重渲染
放置控制台。在一个没有依赖项的
useffect
hook中记录,您将看到它实际上不会呈现两次。
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钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的