[英]Why does this React/Mobx observer component not rerender when its observable props change?
我有一个React组件,它从其props中呈现数据表。 数据包含在MobX的observable()
。 有时,异步操作(AJAX调用)会向数据源添加一个新行,这会导致新的表行呈现。 不是这种情况。
有关组件的最小示例如下:
@observer
class MyDashboard extends React.Component {
render() {
return (
<Table
columns={this.props.columns}
dataSource={this.props.model.contentTypes}
/>
);
}
@action.bound
private onThingHappened = async () => {
const thing = await asyncThing();
runInAction('onThingHappened', () => {
this.props.model.contentTypes.push(thing);
});
}
}
道具model
是一个可观察的对象。 model.contentTypes
是一个对象数组。 该表在第一次抽奖时正确呈现; 它是随后的重新渲染,这是有问题的。
如果删除await
则onThingHappened
的绑定操作onThingHappened
预期工作。 换句话说 - 在第一次await
触发之前发生的模型更改按预期重新呈现。
runInAction
似乎没有显着改变任何东西。
但是,如果我在组件本身中绘制model.contentTypes
- 而不是简单地将其传递给子组件(在本例中为<Table>
),整个过程按预期工作。 例如:
return (
<React.Fragment>
<div style={{display: 'none'}}>{this.props.model.contentTypes.length}</div>
<Table
columns={this.props.columns}
dataSource={this.props.model.contentTypes}
/>
</React.Fragment>
)
在这个渲染函数中,取消引用model.contentTypes
数组似乎足以触发onThingHappened
的重新渲染,即使在await
之后也是如此。
我不使用mobx但经过一些研究后:
observer()
包装<Table/>
应该有效...如果<Table/>
render直接使用该值,如果传递给(unwrapped)子组件,它可能会失败; “Mobx跟踪访问”可能足以迫使mobx通过“不必要的”访问来做出反应。
试试吧:
render() {
const amount = this.props.model.contentTypes.length;
if( !amount ) return null; // to avoid 'amount unused, no unused ...'
return (
<Table
columns={this.props.columns}
dataSource={this.props.model.contentTypes}
/>
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.