嵌套的可观察对象不会触发反应
Reaction not being triggered by nested observables
我有一个具有嵌套可观察属性的可观察 class:
class TodoItem {
@observable name: string = "";
@observable completed: boolean = false;
@action
setCompleted(value: boolean) {
this.completed = value;
}
constructor(name: string) {
this.name = name;
makeObservable(this);
}
}
class TodoList {
@observable todos: TodoItem[] = [];
@action
addTodo(todo: TodoItem) {
this.todos.push(todo);
}
constructor() {
makeObservable(this);
}
}
当我尝试修改 TodoList
实例的 todos
属性中的 TodoItem
时,未触发 reaction
块:
reaction(
() => store.todos,
(value) => {
console.log(value);
}
);
演示:https://codesandbox.io/s/mobx-reaction-81q33n
预期:切换待办事项时,待办事项列表应打印到控制台
成功:未打印任何内容
要真正对某些可观察值的变化做出反应,您需要使用它,或者 dot into
它或 touch
它,无论您怎么称呼它。您的 reaction
仅跟踪对 store.todos
数组本身的更改,因此如果您更改此数组,它将触发。
如果您明显修改其中的某些项目,它不会触发,因为此反应不会touch
或以任何方式使用它们。
如果你想对 store.todos
内的所有变化做出反应,你可以使用 JSON.stringify
或 MobX 方法 toJS
,像这样:
reaction(
() => JSON.stringify(store.todos),
(value) => {
console.log(value);
}
);
我有一个具有嵌套可观察属性的可观察 class:
class TodoItem {
@observable name: string = "";
@observable completed: boolean = false;
@action
setCompleted(value: boolean) {
this.completed = value;
}
constructor(name: string) {
this.name = name;
makeObservable(this);
}
}
class TodoList {
@observable todos: TodoItem[] = [];
@action
addTodo(todo: TodoItem) {
this.todos.push(todo);
}
constructor() {
makeObservable(this);
}
}
当我尝试修改 TodoList
实例的 todos
属性中的 TodoItem
时,未触发 reaction
块:
reaction(
() => store.todos,
(value) => {
console.log(value);
}
);
演示:https://codesandbox.io/s/mobx-reaction-81q33n
预期:切换待办事项时,待办事项列表应打印到控制台
成功:未打印任何内容
要真正对某些可观察值的变化做出反应,您需要使用它,或者 dot into
它或 touch
它,无论您怎么称呼它。您的 reaction
仅跟踪对 store.todos
数组本身的更改,因此如果您更改此数组,它将触发。
如果您明显修改其中的某些项目,它不会触发,因为此反应不会touch
或以任何方式使用它们。
如果你想对 store.todos
内的所有变化做出反应,你可以使用 JSON.stringify
或 MobX 方法 toJS
,像这样:
reaction(
() => JSON.stringify(store.todos),
(value) => {
console.log(value);
}
);