我的组件有两个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中,就像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在运行时执行提供给它的回调,因此执行的回调是disposer
autorun返回的函数,它实际上取消了您的自动运行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句