作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的简化商店:
export class ProfileStore {
profile = {
id: 1,
name: "Tommy",
todos: [
{
value: "Clean the room",
done: false
}
]
};
constructor() {
makeObservable(this, {
profile: observable,
});
}
}
我的目标是倾听可观察到的“个人资料”内的每一个可能的变化。我想使用 MobX 的 reaction
来实现此目的,但这有点棘手。
reaction(
() => this.profile,
() => {
console.log("change");
}
);
上面的示例根本不起作用,因为 MobX 不会对值使用react,而是对属性和引用使用react。所以我把它改成这样:
reaction(
() => ({
id: this.profile.id,
name: this.profile.name,
todos: this.profile.todos.slice()
}),
() => {
console.log("change");
}
);
它开始起作用,但并不完全起作用。除了切换 todos 中的 done
属性之外,它还会监听所有更改。如果我添加另一个属性,我需要在这里列出,这有点乏味。
处理这个问题的最佳方法是什么?如何应对每一个可能的变化?
我为此制作了一个codesandbox:link
尝试按下按钮并查看计数器。
最佳答案
要对每个可能的更改使用react,您需要取消引用每个属性。例如,为此,您可以使用 toJS
方法来序列化您的 profile
对象。 (甚至 native JSON.stringify
):
import { reaction, toJS } from 'mobx';
// ...
reaction(
() => toJS(profileStore.profile),
() => {
setReactionCounter((state) => state + 1);
}
);
关于reactjs - 如何对 MobX 中每个可能的变化运行 react 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69099041/
我是一名优秀的程序员,十分优秀!