我在Mobx中相对较新,我需要在更新此可观察数组时自动调用函数。 可观察的数组:
@observable Todos = []
我有很多功能来管理这个数组(addToso,removeTodo,...),我想避免在更新这个数组的每个函数中调用这个函数。
例如:
@action addTodo(todo, important) {
const newTodo = {
id : Math.random(),
text : todo,
isImportant : important,
completed : false,
date : Date.now()
}
this.Todos.push(newTodo)
}
我想在Todos
更新时自动为我的数据库中的保存Todos
运行一个函数。
const UpdateDbData = (id, newTodos) => {
firebase.database().ref(`users/${id}`).update({
todos : newTodos
})
.catch(error => console.log(error))
}
此处newTodo
用于Todos
数组的当前值(用户ID的ID)
我使用autorun
和reaction
进行了测试,但我不明白如何正确使用它们。
怎么做?
答案 0 :(得分:0)
您可以使用autorun
,但请务必使用slice
将MobX可观察数组转换为常规数组:
示例(JSBin)
class TodoStore {
@observable todos = [];
constructor() {
autorun(() => {
const newTodos = this.todos.slice();
firebase.database().ref(`users/${id}`).update({
todos : newTodos
})
.catch(error => console.log(error))
})
}
@action addTodo(todo, important) {
const newTodo = {
id : Math.random(),
text : todo,
isImportant : important,
completed : false,
date : Date.now()
};
this.todos.push(newTodo);
}
}
const todoStore = new TodoStore();
setTimeout(() => {
todoStore.addTodo('A todo', true);
setTimeout(() => todoStore.todos[0].text = 'A changed todo', 1000);
}, 1000);
答案 1 :(得分:0)
我更喜欢mobx.observe
方法:https://mobx.js.org/refguide/observe.html#observe。
您可以使用以下内容:
constructor(){
mobx.observe(this.Todos, (change) => {
// update your backend data here.
doSomething(this.Todos);
})
}
此方法仅在todos数组更改时触发。没有任何其他属性被更改。
注释: