当前位置:首页 > VUE

vue 数据绑定实现

2026-03-26 18:22:46VUE

Vue 数据绑定的实现原理

Vue 的数据绑定主要通过响应式系统虚拟 DOM实现,核心是Object.defineProperty(Vue 2)或Proxy(Vue 3)的劫持机制。

Vue 2 的实现方式

基于 Object.defineProperty
通过递归遍历数据对象,为每个属性添加 gettersetter,实现依赖收集和派发更新:

function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      console.log('读取属性', key);
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      console.log('更新属性', key);
      val = newVal;
      // 触发视图更新
    }
  });
}

依赖收集与 Watcher
每个组件实例对应一个 Watcher,在 getter 中收集依赖,在 setter 中通知 Watcher 更新视图。

Vue 3 的实现方式

基于 Proxy
Proxy 直接代理整个对象,无需递归遍历,性能更好:

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log('读取属性', key);
      return Reflect.get(target, key);
    },
    set(target, key, newVal) {
      if (newVal === target[key]) return true;
      console.log('更新属性', key);
      Reflect.set(target, key, newVal);
      // 触发视图更新
      return true;
    }
  });
}

响应式优化
Vue 3 引入 effecttrack/trigger 机制,更细粒度地控制依赖追踪和更新触发。

模板编译与绑定

  1. 模板解析
    Vue 将模板编译为渲染函数,解析指令(如 v-model)和插值表达式({{}})。

  2. 虚拟 DOM 比对
    数据变化时,生成新的虚拟 DOM,通过 Diff 算法高效更新真实 DOM。

双向绑定的实现(v-model)

v-model 是语法糖,本质是 :value@input 的组合:

vue 数据绑定实现

<input v-model="message">
<!-- 等价于 -->
<input :value="message" @input="message = $event.target.value">

数组和对象的特殊处理

Vue 2 中需通过 Vue.set 或数组的变异方法(如 push)触发更新。Vue 3 的 Proxy 已自动支持深层响应。

标签: 绑定数据
分享给朋友:

相关文章

vue实现数据增加

vue实现数据增加

vue实现数据增加的几种方法 在Vue中实现数据增加通常涉及以下几个核心概念和方法: 响应式数据声明 在Vue组件中,使用data选项或ref(Vue 3)声明响应式数据: // Vue 2 da…

vue实现双向数据绑定的原理

vue实现双向数据绑定的原理

Vue 双向数据绑定的原理 Vue 实现双向数据绑定的核心是通过 数据劫持 和 发布-订阅模式 结合实现的。主要依赖 Object.defineProperty(Vue 2.x)或 Proxy(Vue…

vue样式绑定实现收藏

vue样式绑定实现收藏

Vue 样式绑定实现收藏功能 在 Vue 中,可以通过动态绑定样式来实现收藏功能,常见的方法是使用 v-bind:class 或 v-bind:style 来切换样式状态。 使用 v-bind:cl…

vue实现数据筛选

vue实现数据筛选

数据筛选的实现方式 在Vue中实现数据筛选可以通过计算属性、方法或第三方库完成。以下是几种常见的方法: 计算属性筛选 使用计算属性对数组数据进行筛选,具有缓存特性,适合静态或较少变化的数据。 co…

vue 实现数据滚动

vue 实现数据滚动

Vue 实现数据滚动的方法 在Vue中实现数据滚动可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS动画实现滚动 通过CSS的animation和@keyframes可以实现简单的滚动效果…

vue实现数据分页

vue实现数据分页

Vue 实现数据分页的方法 使用计算属性分页 在 Vue 中,可以利用计算属性对数据进行分页处理。这种方法适用于前端分页,即一次性获取所有数据后在客户端进行分页。 data() { return…