mobx のオブザーバブルとリアクションに欠けているものがあります。2 つの例を用意しました。1 つは機能し、もう 1 つは機能しません。理由がわかりません。
例 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 で送信し、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 オブザーバブルを他のオブザーバブルにラップします。Alert2 反応が機能します。
同時に、反応を Alert1 および Alert2 コンポーネントから Main コンポーネントのコンストラクターに移動すると、両方の反応が機能します。
両方のコンポーネントを使用した jsfiddle の例を次に示します。https://jsfiddle.net/kasheftin/zex0qjvf/1/