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

VueJS:如何在非组件环境下订阅reactive对象?

纯JS环境下订阅Vue reactive对象的实现方式

Vue的reactive对象本身没有内置的subscribe方法,但可以通过以下两种低冗余的方式实现订阅需求:

1. 使用官方提供的watch函数

如果你是基于@vue/reactivity包在纯JS环境中使用reactive,可以直接导入官方的watch函数来监听对象变化,这是最简洁的方案:

import { reactive, watch } from '@vue/reactivity';

const x = {
  a: [],
  b: 2,
  c: { q: 0 }
};
const y = reactive(x);

// 订阅整个reactive对象的所有变化
watch(y, (newVal, oldVal) => {
  console.log('Something reactive happened', { newVal, oldVal });
});

y.a = [1,2,3]; // 触发订阅回调
y.c.q = 5; // 嵌套属性变化也会触发

如果只想监听特定属性,也可以给watch传一个 getter 函数:

// 只监听y.a的变化
watch(() => y.a, (newVal, oldVal) => {
  console.log('y.a changed:', newVal);
});

2. 封装简易的subscribe函数

如果想要更贴近你示例中的subscribe调用方式,可以基于Vue的effect函数封装一个极简版本:

import { reactive, effect } from '@vue/reactivity';

function subscribe(target, callback) {
  // 用effect追踪target的所有依赖,变化时触发回调
  effect(() => {
    // 遍历对象所有属性(包括嵌套)触发依赖追踪
    JSON.stringify(target);
    callback(target);
  });
}

const x = {
  a: [],
  b: 2,
  c: { q: 0 }
};
const y = reactive(x);

subscribe(y, (obj) => {
  console.log('Something reactive happened', obj);
});

y.b = 10; // 触发订阅

注意:这种方式通过JSON.stringify强制遍历所有属性实现深度监听,适合简单场景;复杂场景建议还是用官方watch更灵活。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:00:54