首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >反应:成分功能的副作用与效应的区别?

反应:成分功能的副作用与效应的区别?
EN

Stack Overflow用户
提问于 2022-03-30 22:46:04
回答 2查看 450关注 0票数 2

我试图理解在组件函数中产生副作用与在没有传递依赖数组的效果中具有副作用之间的实际区别(因此,每次呈现都应该触发)。据我所观察,它们都以相同的频率运行。我意识到这种效果允许在适当的时间进行清理,但我只是对清理不是一个因素的场景感到好奇。

下面的CodePen展示了我所说的内容。

https://codepen.io/benrhere/pen/GRyvXZZ

重要的是:

代码语言:javascript
复制
function EffectVsFunctionQuestion() {
  const [count, setCount] = React.useState(0);

  React.useEffect(()=>{
    console.log("incremented within hook")
  });
  console.log("incremented within component function")
...
}
EN

Stack Overflow用户

回答已采纳

发布于 2022-03-31 01:33:53

useEffect钩子发出的副作用的好处是每个呈现周期最多触发一次。这里的呈现周期意味着当React计算下一个视图并将其提交到DOM时,即“提交阶段”。

当呈现出组件(以及子组件和整个ReactTree)以计算更改的内容并需要提交到DOM时,不应将此与React称为“呈现阶段”混淆。

React函数组件的整个函数体是--“呈现”函数。正如您在图表中所看到的,在render或主体中任何无意的副作用都将在“呈现阶段”中发生,这些副作用可以通过React暂停、中止或重新启动(即再次运行)。请注意,“呈现阶段”是纯的,没有副作用。

组件的“提交阶段”可以使用DOM并运行副作用。

这有什么关系?如何区分。?

实际上,使用一个帮助您检测意外副作用的组件来响应。

检测意外副作用

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

  • 类组件constructorrendershouldComponentUpdate方法
  • 类构件静态getDerivedStateFromProps方法
  • 功能构件体
  • 状态更新函数(setState的第一个参数)
  • 传递给useStateuseMemouseReducer的函数

下面是一个沙箱演示示例,它演示了意外的副作用。

注意,意外的效果是加倍的。

代码:

代码语言:javascript
复制
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>
  );
}
票数 5
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71684952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档