我有一个可观察对象的列表:
[
{
key1: "x",
updateTs: "y"
},
...
]
用户可以通过UI更改这些对象。
这些更改将发送到远程服务器,并在请求返回时更新“updateTs”。
问题在于,在线时会导致双重渲染:
updateTs
时。 我不在 View 中使用
updateTs
,仅使用其同级键(
key1
)。MobX
@observer
跟踪对对象的读取,因此触发了重新渲染。这会导致UI jank,因为它消耗了JS CPU时间来重新计算虚拟dom并对其进行比较(列表非常大)。
是否可以避免第二次重新渲染?
最佳答案
为了避免“麻烦”,请使您的Mobx组件尽可能小。例如,使用“键”子组件和“ts”子组件创建“item”组件(并将这两个子组件都设置为observer
)。 Mobx然后仅应导致子组件更新,并且由于每个子组件仅关心一个属性,因此编辑一个子组件不应影响另一个子组件。
但是,您将必须将整个“item” observable
传递给组件(作为 Prop ),以便Mobx可以正确跟踪它。另外,请确保已更新项目集合和值,并且不要重新创建对象。
您正确地理解,读取属性会使Mobx跟踪该属性的更改。因此,如果您不希望重新渲染组件,则不得更改在该组件中读取的任何内容。但是,observer
的子组件在单独的上下文中跟踪Mobx属性。因此,如果您在子观察者组件中读取了某些内容,但在父组件中却没有读取,那么Mobx将不会更新父组件。
另请参阅:Optimizing Mobx for React
关于javascript - MobX:当 View 中未使用对象键时,避免触发重新渲染,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56443650/