You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MobX中如何让reaction监听observable对象profile的所有变更?

最优解决方案

注意:所有监听方法返回的销毁函数,在组件卸载/Store销毁时记得调用,避免内存泄漏。

方案1:使用toJS配合reaction(最简便,适合绝大多数场景)

MobX的toJS方法会递归遍历整个observable对象的所有属性,自动完成全量依赖收集,任何深层属性(包括数组内对象的属性、后续新增的属性)变化都会触发回调,无需手动罗列属性:

import { reaction, toJS } from "mobx";

reaction(
  () => toJS(this.profile),
  (newProfile) => {
    console.log("profile发生变更", newProfile);
  }
);

原理说明

你之前的写法只收集了id、name和todos数组本身的依赖,没有遍历到todos数组内部对象的done、value属性,所以修改这些属性不会触发回调。toJS会递归访问所有层级的属性,自动完成全量依赖收集。

方案2:使用observe深层监听(性能更优,适合需要感知具体变更的场景)

如果你需要拿到具体的变更信息(比如变更的字段、变更类型),或者要避免每次序列化整个对象的性能开销,可以用MobX原生的observe方法开启深层监听:

import { observe } from "mobx";

// 第三个参数传入true开启深层监听
const cancelObserve = observe(this.profile, (changeEvent) => {
  console.log("变更类型:", changeEvent.type);
  console.log("变更字段:", changeEvent.name);
  console.log("变更后的值:", changeEvent.newValue);
}, true);

// 不需要监听时调用销毁方法避免内存泄漏
// cancelObserve()

该方案不仅能监听到已有属性的修改,还能监听到属性新增、删除、数组元素增删改等所有变更场景。

方案3:使用autorun(适合初始化就要执行一次的场景)

如果你的副作用需要在初始化时就执行一次,后续变更也执行,可以用autorun:

import { autorun, toJS } from "mobx";

const cancelAutorun = autorun(() => {
  const snapshot = toJS(this.profile);
  // 这里写你的副作用逻辑
  console.log("profile变更:", snapshot);
});

内容的提问来源于stack exchange,提问作者Mimoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:42:02