当前位置:首页 > VUE

vue如何实现数据监听

2026-02-21 08:15:24VUE

Vue 数据监听的实现方式

Vue 主要通过数据劫持和发布-订阅模式实现数据监听,核心是 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现方法:

使用 Object.defineProperty(Vue 2)

通过劫持对象的属性访问和修改,触发依赖收集和更新通知。

vue如何实现数据监听

// 简易实现
function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集依赖
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}
  • 依赖收集:在 getter 中通过 Dep 类收集当前属性的依赖(如 Watcher)。
  • 触发更新:在 setter 中通过 Dep.notify() 通知所有依赖执行更新。

使用 Proxy(Vue 3)

Proxy 可以监听整个对象,无需递归遍历属性,性能更好。

vue如何实现数据监听

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key); // 收集依赖
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return true;
    }
  });
}
  • 优势:支持监听动态新增属性、数组索引修改等场景。

监听数组变化

Vue 2 通过重写数组方法(如 pushpop)实现监听:

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);

['push', 'pop', 'shift'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    dep.notify(); // 触发更新
    return result;
  };
});

手动监听:$watch API

Vue 提供 $watch 方法手动监听数据变化:

export default {
  data() {
    return { count: 0 };
  },
  created() {
    this.$watch('count', (newVal, oldVal) => {
      console.log(`count变化:${oldVal} -> ${newVal}`);
    });
  }
};
  • 深度监听:通过 { deep: true } 监听嵌套对象。

注意事项

  1. 性能开销:频繁监听大型对象可能影响性能,建议拆分数据。
  2. 异步更新:Vue 的更新是异步的,多次修改会合并为一次渲染。
  3. 避免循环引用:监听循环引用对象可能导致栈溢出。

分享给朋友:

相关文章

如何实现vue表格联动

如何实现vue表格联动

实现 Vue 表格联动的方法 数据绑定与响应式更新 通过 Vue 的响应式特性,将多个表格的数据绑定到同一个数据源或计算属性。当一个表格的数据发生变化时,另一个表格会自动更新。例如: data()…

vue如何实现默认页面

vue如何实现默认页面

Vue 实现默认页面的方法 在 Vue 项目中,通常需要设置一个默认页面(如首页或登录页)作为用户访问时的初始页面。可以通过路由配置实现。 配置路由默认跳转 在 Vue Router 中,使用 r…

vue如何实现曲线图

vue如何实现曲线图

使用 ECharts 实现曲线图 在 Vue 项目中安装 ECharts 依赖: npm install echarts --save 引入 ECharts 并创建基础图表组件: <te…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

vue怎么实现数据

vue怎么实现数据

Vue 数据实现方式 Vue 提供了多种方式来实现数据的响应式绑定和管理,核心是通过数据驱动视图的更新。 响应式数据声明 在 Vue 组件中,可以通过 data 选项声明响应式数据。这些数据会被 V…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常…