带空逻辑的useEffect是否必要?基于MobX-State-Tree的组件疑问
首先明确核心结论:这个空的useEffect完全是多余的,应该删除,原因如下:
1. observer装饰器的核心作用
你使用的observer来自mobx-react,它的核心机制是自动追踪组件渲染过程中用到的所有MST可观察状态。只要组件内直接使用了语言相关的可观察值(比如languageStore.currentLang、翻译文本函数等),当setLanguage()修改这些状态时,observer会自动触发组件重渲染,根本不需要额外的useEffect来强制更新。
2. 关于refresh变量的误区
同事提到的refresh如果是MST store中的可观察值,那只要组件在渲染时引用了它(哪怕只是解构出来),observer已经会监听它的变化——也就是说,refresh更新时组件本来就会重渲染,空useEffect并没有额外做任何事情,属于重复触发。
如果refresh不是可观察值,那它出现在useEffect的依赖数组里也不会触发任何更新,完全起不到同事说的“强制重渲染”作用。
3. 极端场景的替代方案
只有一种极端情况可能需要类似逻辑:组件完全没有直接引用任何语言相关的可观察状态,但语言变化时必须重渲染(比如依赖语言的第三方组件,或通过非MST方式获取语言的场景)。但这种情况本身是设计缺陷,正确的做法是让组件直接依赖语言相关的可观察值,而非用refresh这种“触发信号”。如果真的需要强制重渲染,也应该用React内置的forceUpdate或自定义重触发逻辑,而非空useEffect这种隐晦的写法。
总结
这个空useEffect既没有实际作用,还会增加代码维护成本(比如后续开发者会疑惑为什么保留空逻辑),甚至可能在refresh逻辑变更时导致意外问题。正确的做法是删除它,依赖observer的自动追踪机制来保证语言变化时组件同步更新。
内容的提问来源于stack exchange,提问作者Damilare Gabriel Idowu

