当前位置:首页 > VUE

vue为啥能实现监听

2026-02-09 13:59:29VUE

Vue 监听机制的核心原理

Vue 实现监听的核心依赖于 JavaScript 的 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)特性。通过劫持数据对象的属性访问和修改,触发依赖收集与更新通知。

基于 Object.defineProperty 的实现(Vue 2.x)

通过定义属性的 gettersetter 拦截操作:

vue为啥能实现监听

  • 依赖收集:在 getter 中记录当前依赖(如 Watcher 实例)。
  • 触发更新:在 setter 中通知依赖进行更新,执行重新渲染或回调函数。

示例代码逻辑:

function defineReactive(obj, key) {
  let value = obj[key];
  const dep = new Dep(); // 依赖管理容器

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) dep.depend(); // 收集依赖
      return value;
    },
    set(newVal) {
      if (newVal === value) return;
      value = newVal;
      dep.notify(); // 通知更新
    }
  });
}

基于 Proxy 的实现(Vue 3.x)

Proxy 提供更全面的拦截能力,支持数组和动态新增属性:

vue为啥能实现监听

  • 拦截操作:代理对象的读取(get)、修改(set)、删除(deleteProperty)等操作。
  • 性能优化:避免递归遍历对象属性,按需响应。

示例代码逻辑:

const reactive = (target) => {
  return new Proxy(target, {
    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;
    }
  });
};

依赖管理机制

  • Watcher 与 Dep:每个响应式属性关联一个 Dep 实例,用于存储依赖的 Watcher(如组件渲染函数、计算属性等)。
  • 派发更新:数据变化时,Dep 通知所有 Watcher 执行更新,可能触发虚拟 DOM 的重新渲染或用户定义的回调。

数组的特殊处理

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

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

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

总结对比

  • Vue 2.x:基于 Object.defineProperty,需递归初始化属性,对数组需特殊处理。
  • Vue 3.x:基于 Proxy,支持动态属性,性能更高,但需环境支持 ES6。

标签: vue
分享给朋友:

相关文章

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直接使…

vue实现单点

vue实现单点

Vue 实现单点登录(SSO)方案 单点登录(SSO)允许用户在多个相关但独立的系统中使用同一组凭证登录。以下是基于 Vue 的实现方案: 基于 OAuth2/OpenID Connect 的实现…

vue实现素材

vue实现素材

Vue 实现素材的方法 使用 Vue 组件管理素材 在 Vue 项目中,可以通过组件化的方式管理素材。创建一个专门的组件来加载和显示素材,例如图片、视频或音频文件。组件可以接收素材的路径或 URL 作…

vue实现横滚

vue实现横滚

Vue 实现横滚效果 横滚效果通常指水平滚动内容,常见于轮播图、横向导航栏等场景。以下是几种实现方式: 使用 CSS 和 Vue 结合 通过 CSS 的 overflow-x 和 white-spa…

vue遮罩实现

vue遮罩实现

实现 Vue 遮罩的常见方法 使用 CSS 定位和透明度 创建一个全屏遮罩层,通过 CSS 固定定位覆盖整个视口,并设置半透明背景色。 <template> <div cl…

mui实现vue

mui实现vue

mui 实现 Vue 的步骤 mui 是一个轻量级的前端框架,常用于移动端开发。结合 Vue 可以实现高效的开发体验。以下是具体实现方法。 安装 mui 和 Vue 通过 npm 或 yarn 安装…