我试图理解在组件函数中产生副作用与在没有传递依赖数组的效果中具有副作用之间的实际区别(因此,每次呈现都应该触发)。据我所观察,它们都以相同的频率运行。我意识到这种效果允许在适当的时间进行清理,但我只是对清理不是一个因素的场景感到好奇。
下面的CodePen展示了我所说的内容。
https://codepen.io/benrhere/pen/GRyvXZZ
重要的是:
function EffectVsFunctionQuestion() {
const [count, setCount] = React.useState(0);
React.useEffect(()=>{
console.log("incremented within hook")
});
console.log("incremented within component function")
...
}发布于 2022-03-31 01:33:53
从useEffect钩子发出的副作用的好处是每个呈现周期最多触发一次。这里的呈现周期意味着当React计算下一个视图并将其提交到DOM时,即“提交阶段”。
当呈现出组件(以及子组件和整个ReactTree)以计算更改的内容并需要提交到DOM时,不应将此与React称为“呈现阶段”混淆。

React函数组件的整个函数体是--“呈现”函数。正如您在图表中所看到的,在render或主体中任何无意的副作用都将在“呈现阶段”中发生,这些副作用可以通过React暂停、中止或重新启动(即再次运行)。请注意,“呈现阶段”是纯的,没有副作用。
组件的“提交阶段”可以使用DOM并运行副作用。
这有什么关系?如何区分。?
实际上,使用一个帮助您检测意外副作用的组件来响应。
严格模式不能自动为您检测副作用,但它可以帮助您通过使其更具确定性来识别它们。这是通过有意地双重调用以下函数来实现的:
constructor、render和shouldComponentUpdate方法getDerivedStateFromProps方法setState的第一个参数)useState、useMemo或useReducer的函数下面是一个沙箱演示示例,它演示了意外的副作用。
注意,意外的效果是加倍的。

代码:
const externalValue1 = { count: 0 };
const externalValue2 = { count: 0 };
function EffectVsFunctionQuestion() {
const [state, setState] = React.useState(0);
React.useEffect(() => {
externalValue1.count++;
console.log("incremented within hook", externalValue1.count);
});
externalValue2.count++;
console.log("incremented within component function", externalValue2.count);
return (
<button type="button" onClick={() => setState((c) => c + 1)}>
Render
</button>
);
}https://stackoverflow.com/questions/71684952
复制相似问题