当前位置:首页 > VUE

vue 响应式实现

2026-01-15 06:03:26VUE

Vue 响应式实现原理

Vue 的响应式系统通过数据劫持结合发布-订阅模式实现,核心是 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)。

数据劫持(Vue 2.x)

Vue 2.x 使用 Object.defineProperty 递归遍历对象的属性,将其转换为 getter/setter:

vue 响应式实现

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`读取 ${key}: ${val}`);
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        console.log(`设置 ${key}: ${newVal}`);
        val = newVal;
        // 触发更新
      }
    }
  });
}

依赖收集与派发更新

每个响应式属性关联一个 Dep(依赖管理器),在 getter 中收集依赖(Watcher),在 setter 中通知更新:

vue 响应式实现

class Dep {
  constructor() {
    this.subs = new Set();
  }
  addSub(watcher) {
    this.subs.add(watcher);
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

// Watcher 示例
class Watcher {
  update() {
    console.log('视图更新');
  }
}

Vue 3.x 的 Proxy 实现

Vue 3.x 改用 Proxy 实现更高效的响应式:

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      track(target, key); // 依赖收集
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      Reflect.set(target, key, value);
      trigger(target, key); // 触发更新
    }
  });
}

数组响应式处理

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);
    // 触发更新逻辑
    return result;
  };
});

响应式系统的局限性

  • 对象属性添加/删除:Vue 2.x 需通过 Vue.set/Vue.delete 触发响应。
  • 数组索引修改:直接通过索引修改元素(如 arr[0] = newVal)不会触发更新。
  • Proxy 兼容性:Vue 3.x 的 Proxy 不支持 IE11 及以下浏览器。

性能优化建议

  • 避免频繁操作大型响应式对象。
  • 使用 Object.freeze() 冻结不需要响应式的数据。
  • 在 Vue 3.x 中,通过 shallowRefshallowReactive 减少深层响应式开销。

以上实现展示了 Vue 响应式系统的核心逻辑,实际源码中还包含虚拟 DOM 比对、批量异步更新等优化策略。

标签: vue
分享给朋友:

相关文章

vue实现下拉菜单

vue实现下拉菜单

实现下拉菜单的基本思路 使用Vue实现下拉菜单可以通过动态绑定v-show或v-if控制菜单显示隐藏,结合事件监听(如@click或@mouseenter)触发状态切换。以下是两种常见实现方式:…

vue实现多级组件

vue实现多级组件

实现多级组件的基本结构 在Vue中实现多级组件通常涉及父子组件嵌套,通过props向下传递数据,通过$emit向上传递事件。多级组件的核心是递归或动态组件渲染。 <!-- 父组件 Parent…

vue 实现长列表

vue 实现长列表

Vue 实现长列表的优化方案 虚拟滚动技术 虚拟滚动是处理长列表的高效方式,仅渲染可视区域内的元素。通过计算滚动位置动态加载和卸载DOM节点,大幅减少内存占用和渲染压力。 <template&…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template>…

vue实现按钮组轮换

vue实现按钮组轮换

实现按钮组轮换的方法 在Vue中实现按钮组轮换效果可以通过动态绑定类和事件处理来完成。以下是一种常见的实现方式: 模板部分 <template> <div class="bu…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue…