我错过了 mobx 可观察和反应中的一些东西。我准备了两个示例,其中一个有效,另一个无效,我不明白为什么。
示例 1(不起作用):
@observer class Alert1 extends Component {
constructor(props) {
super(props);
this.r2 = reaction(
() => this.props.v1,
v => console.log("Alert1 reaction trigger",v)
);
}
render() {
return null;
}
}
@observer class Main extends Component {
@observable v1 = false;
render() {
return (
<div>
<Alert1 v1={this.v1} />
<button onClick={e=>this.v1=!this.v1}>Switch</button>
</div>
);
}
}
在示例 1 中,我们只是在 props 中发送 observable 变量并在 Alert1 组件中创建反应,但它不会触发。
示例 2(作品):
@observer class Alert2 extends Component {
constructor(props) {
super(props);
this.r2 = reaction(
() => this.props.someObj.v1,
v => console.log("Alert2 reaction trigger",v)
);
}
render() {
return null;
}
}
@observer class Main extends Component {
constructor(props) {
this.someObj = observable({v1:observable(false)});
}
render() {
return (
<div>
<Alert2 someObj={this.someObj} />
<button onClick={e=>this.someObj.v1=!this.someObj.v1}>Switch</button>
</div>
);
}
}
这与示例 1 几乎相同,但我们将 v1 observable 包装到另一个 observable 中。Alert2 反应有效。
同时,如果我们将反应从 Alert1 和 Alert2 组件移动到 Main 组件的构造函数,这两个反应都有效。
这是两个组件的 jsfiddle 示例,https: //jsfiddle.net/kasheftin/zex0qjvf/1/