当前位置:首页 > 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如何实现tap

vue如何实现tap

Vue 中实现类似移动端 tap 事件的方法 在 Vue 中可以通过以下几种方式实现类似移动端 tap(轻触)事件的效果: 使用第三方库 安装 v-tap 指令库可以快速实现 tap 事件: np…

vue数据劫持实现

vue数据劫持实现

Vue 数据劫持实现原理 Vue 的数据劫持主要通过 Object.defineProperty 或 Proxy 实现,用于监听对象属性的变化并触发更新。以下是核心实现方式: 基于 Object.d…

vue怎么实现数据

vue怎么实现数据

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

vue如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生滚动 在Vue中可以直接使用HTML原生滚动,通过CSS设置overflow: auto或overflow: scroll来实现滚动效果。适用于简单场景。 <d…

vue如何实现404

vue如何实现404

实现 Vue 404 页面的方法 在 Vue 中实现 404 页面通常需要结合路由配置和动态路由匹配。以下是几种常见方法: 使用通配符路由匹配 在 Vue Router 配置中,可以通过 * 通配符…

java如何实现分布式

java如何实现分布式

分布式系统实现方式 Java实现分布式系统通常涉及多种技术和框架,以下是几种核心方法: 基于RPC框架 使用Dubbo、gRPC等RPC框架实现服务间的远程调用。Dubbo提供高性能的RPC通信,支…