为什么useEffect不会在每个渲染上触发?

安德鲁·杜弗雷斯尼

我的组件有两个Rect.useEffect钩子

const Example = ({ user }) => {
  React.useEffect(() => {
    autorun(() => {
      console.log("inside autorun", user.count);
    });
  });

  // Only runs once
  React.useEffect(() => {
    console.log("Why not me?");
  });

  return <Observer>{() => <h1>{user.count}</h1>}</Observer>;
};

我使用来更新此组件mobx它已正确重新渲染。但是"Why not me?"只打印一次。

根据官方文档

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

这意味着console.log("Why not me?");每次propuser更新时也应该运行但事实并非如此。控制台输出是这个

这种明显的不一致背后的原因是什么?

我的完整代码可以在这里查看

编辑mobx-useEffect查询

Shubham Khatri

在Mobx中,就像Observer提供渲染函数回调的组件一样autorun函数也独立于react生命周期执行。

发生此现象的原因在于,您将用户视为可观察变量

根据mobx-react文档

Observer是一个React组件,它将观察者应用于组件中的匿名区域。它以单个无参数函数作为子代,该函数应仅返回一个React组件。函数中的渲染将被跟踪,并在需要时自动重新渲染。

和mobx文档

autorun使用时,所提供的功能总是会一次立即触发,然后再对其依赖的变化,每次一个。

您可以通过直接在功能组件内部登录来确认此行为,并且您将观察到该组件仅渲染一次

编辑:

回答你的问题

如果我改成useEffect这个

React.useEffect(autorun(() => {console.log("inside autorun", user.count)}));

基本上从中删除匿名函数useEffect,然后直接通过自动运行,然后仅运行一次。为什么会这样呢?有什么不同?

不同之处在于,autorun返回的adisposer function在运行时将处理autorun并且不再执行它。

从文档:

自动运行的返回值是一个处理程序函数,可以在不再需要自动运行时使用它来处置它。

现在发生的事情是,由于useEffect在运行时执行提供给它的回调,因此执行的回调是disposerautorun返回函数,它实际上取消了您的自动运行。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么这不会在1行上渲染

来自分类Dev

为什么onQueryTextChange不会在双击时触发?

来自分类Dev

反应:为什么从useRef更改ref的当前值不会在这里触发useEffect

来自分类Dev

反应-UseState不会在useEffect钩子内部获取后触发重新渲染

来自分类Dev

为什么我的简单元素不会在此React渲染方法中渲染?

来自分类Dev

为什么$ location.path不会在控制器中触发$ routeChangeStart?

来自分类Dev

为什么onError处理程序不会在Http.call()将来触发?

来自分类Dev

为什么“ orientationchange”事件不会在浏览器调整大小时触发?

来自分类Dev

为什么jQuery中的'change'事件不会在ReactJS中触发onChange?

来自分类Dev

为什么ng-src不会在AngularJS中触发某些属性更改?

来自分类Dev

为什么Vaadin ClickListener不会在首次点击时触发?

来自分类Dev

为什么InputText的onChange事件不会在Blazor中触发?

来自分类Dev

为什么这不会在WSL内的Ubuntu上触发堆栈溢出?

来自分类Dev

为什么更改输入不会在更改事件上触发?

来自分类Dev

为什么Ajax错误不会在我的MVC项目中触发?

来自分类Dev

为什么“ drop”事件不会在此网页上触发?

来自分类Dev

为什么jQuery中的'change'事件不会在ReactJS中触发onChange?

来自分类Dev

为什么InternetExplorer 11不会在非活动选项卡中触发事件?

来自分类Dev

为什么模糊事件不会在对 textarea 做出反应时触发?

来自分类Dev

为什么ACTION_DOWN有时可能不会在Android中为ListView触发

来自分类Dev

为什么Netbeans不会在我的断点处停止?

来自分类Dev

为什么>>> 100不会在JavaScript中产生0?

来自分类Dev

为什么“零除”不会在Dart中崩溃?

来自分类Dev

为什么枚举空数组不会在堆上分配?

来自分类Dev

为什么我的ibjects不会在javascript中变形?

来自分类Dev

为什么addTarget不会在Swift中删除?

来自分类Dev

为什么mouseDown事件不会在React中传播?

来自分类Dev

break不会在while循环中中断。为什么?

来自分类Dev

为什么Netbeans不会在我的断点处停止?

Related 相关文章

  1. 1

    为什么这不会在1行上渲染

  2. 2

    为什么onQueryTextChange不会在双击时触发?

  3. 3

    反应:为什么从useRef更改ref的当前值不会在这里触发useEffect

  4. 4

    反应-UseState不会在useEffect钩子内部获取后触发重新渲染

  5. 5

    为什么我的简单元素不会在此React渲染方法中渲染?

  6. 6

    为什么$ location.path不会在控制器中触发$ routeChangeStart?

  7. 7

    为什么onError处理程序不会在Http.call()将来触发?

  8. 8

    为什么“ orientationchange”事件不会在浏览器调整大小时触发?

  9. 9

    为什么jQuery中的'change'事件不会在ReactJS中触发onChange?

  10. 10

    为什么ng-src不会在AngularJS中触发某些属性更改?

  11. 11

    为什么Vaadin ClickListener不会在首次点击时触发?

  12. 12

    为什么InputText的onChange事件不会在Blazor中触发?

  13. 13

    为什么这不会在WSL内的Ubuntu上触发堆栈溢出?

  14. 14

    为什么更改输入不会在更改事件上触发?

  15. 15

    为什么Ajax错误不会在我的MVC项目中触发?

  16. 16

    为什么“ drop”事件不会在此网页上触发?

  17. 17

    为什么jQuery中的'change'事件不会在ReactJS中触发onChange?

  18. 18

    为什么InternetExplorer 11不会在非活动选项卡中触发事件?

  19. 19

    为什么模糊事件不会在对 textarea 做出反应时触发?

  20. 20

    为什么ACTION_DOWN有时可能不会在Android中为ListView触发

  21. 21

    为什么Netbeans不会在我的断点处停止?

  22. 22

    为什么>>> 100不会在JavaScript中产生0?

  23. 23

    为什么“零除”不会在Dart中崩溃?

  24. 24

    为什么枚举空数组不会在堆上分配?

  25. 25

    为什么我的ibjects不会在javascript中变形?

  26. 26

    为什么addTarget不会在Swift中删除?

  27. 27

    为什么mouseDown事件不会在React中传播?

  28. 28

    break不会在while循环中中断。为什么?

  29. 29

    为什么Netbeans不会在我的断点处停止?

热门标签

归档