javascript - MobX:避免在 View 中未使用对象键时触发重新渲染

标签 javascript reactjs react-native mobx mobx-react

我有一个可观察对象列表:

[
    {
        key1: "x",
        updateTs: "y"
    },

    ...
]

用户可以通过 UI 改变这些对象。

这些更改会发送到远程服务器,一旦请求返回,“updateTs”就会更新。

问题是在线时,这会导致双重渲染:

  1. 从 UI 进行初始编辑。

  2. 当远程请求返回并编辑updateTs时。

在我看来,我没有使用 updateTs,只有它的同级键 (key1).

MobX @observer 跟踪对对象的读取,因此它会触发重新渲染。

这会导致 UI 卡顿,因为它会消耗 JS CPU 时间来重新计算虚拟 dom 并对其进行比较(列表非常大)。

是否可以避免第二次重新渲染?

最佳答案

为了避免“卡顿”,让你的 Mobx 组件尽可能小。例如,创建带有“key”子组件和“ts”子组件的“item”组件(并使两个子组件都成为observer)。然后 Mobx 应该只会导致子组件更新,并且因为每个子组件只关心一个属性,所以编辑一个不应该影响另一个。

不过,您必须将整个“项目”observable 传递给组件(作为 prop),这样 Mobx 才能正确跟踪它。此外,请确保项目集合和值的更新到位,并且不要重新创建对象。

您是正确的,读取属性会导致 Mobx 跟踪该属性的更改。因此,如果您不希望组件重新呈现,则不得更改您从该组件中读取的任何内容。但是,作为 observer 的子组件会在单独的上下文中跟踪 Mobx 属性。因此,如果您在子观察者组件中读取某些内容但在父组件中未读取,则 Mobx 不会更新父组件。

另请参阅:Optimizing Mobx for React

关于javascript - MobX:避免在 View 中未使用对象键时触发重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56443650/

相关文章:

javascript - Jvectormap 标记在 setFocus 调用后绘制错误

javascript - AngularJS 逻辑应该放在 HTML 文件中吗?

javascript - 未定义“createPolyglotMiddleware”

javascript - 如何从 Chrome REPL 调试 React 变量

javascript - map() 作为 React 中 setState() 的回调,奇怪地运行条件两次

javascript - 从 JSON Schema 自动生成 JavaScript

javascript - 不使用 webconfig 或 htaccess 将网页重定向到新目录名称

react-native - React Native map Google 定价

javascript - 如何将图像添加到expo中的android可绘制资源而不运行expo prebuild来创建android文件夹

reactjs - 如何在堆栈导航器(react-navigation 2.X)中卸载以前安装的组件?