当前位置:首页 > VUE

vue数据双向绑定实现

2026-02-23 01:27:53VUE

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

Vue 的数据双向绑定主要通过 v-model 指令实现,其核心是基于数据劫持和发布-订阅模式。以下是关键实现机制:

数据劫持(响应式系统)

Vue 使用 Object.defineProperty(Vue 2)或 Proxy(Vue 3)劫持数据的读写操作,在属性被访问或修改时触发更新。

Vue 2 实现示例:

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

Vue 3 使用 Proxy:

const reactive = (target) => {
  return new Proxy(target, {
    get(target, key) {
      console.log(`读取 ${key}`);
      return Reflect.get(target, key);
    },
    set(target, key, value) {
      if (target[key] !== value) {
        console.log(`更新 ${key} 为 ${value}`);
        Reflect.set(target, key, value);
        // 触发视图更新
      }
      return true;
    }
  });
};

依赖收集与派发更新

  1. 依赖收集
    在 getter 中,Vue 会将当前正在计算的 Watcher(依赖)添加到 Dep(依赖管理器)中。

  2. 派发更新
    在 setter 中,Dep 会通知所有 Watcher 执行更新,触发组件重新渲染。

简化版 Dep 和 Watcher:

class Dep {
  constructor() {
    this.subscribers = [];
  }
  depend() {
    if (Dep.target) {
      this.subscribers.push(Dep.target);
    }
  }
  notify() {
    this.subscribers.forEach(watcher => watcher.update());
  }
}

class Watcher {
  constructor(updateFn) {
    this.updateFn = updateFn;
    Dep.target = this;
    this.updateFn(); // 触发 getter,收集依赖
    Dep.target = null;
  }
  update() {
    this.updateFn();
  }
}

v-model 的实现

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

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

对于自定义组件,v-model 可通过 model 选项(Vue 2)或 v-model 参数(Vue 3)配置:

Vue 2 自定义组件:

export default {
  model: {
    prop: 'value',
    event: 'input'
  },
  props: ['value'],
  methods: {
    updateValue(newVal) {
      this.$emit('input', newVal);
    }
  }
}

Vue 3 自定义组件:

<CustomComponent v-model:title="pageTitle" />
<!-- 子组件通过 props 和 emit 实现 -->
<script setup>
defineProps(['title']);
defineEmits(['update:title']);
</script>

总结

  1. 数据劫持:通过 Object.definePropertyProxy 监听数据变化。
  2. 依赖管理:在 getter 中收集依赖,在 setter 中触发更新。
  3. 指令解析v-model 将表单输入与数据动态绑定,通过事件监听和属性绑定实现双向同步。

vue数据双向绑定实现

标签: 绑定双向
分享给朋友:

相关文章

怎么用vue.js实现双向绑定

怎么用vue.js实现双向绑定

使用 v-model 指令实现双向绑定 Vue.js 提供了 v-model 指令用于在表单输入元素(如 input、textarea、select)上实现双向数据绑定。v-model 会根据控件类型…

vue双向实现数据

vue双向实现数据

Vue 双向数据绑定的实现 Vue 的双向数据绑定主要通过 v-model 指令实现,它结合了 v-bind 和 v-on 的功能,能够同步表单输入和应用状态。 基本语法 在表单元素上使用 v-m…

vue实现双向滚动

vue实现双向滚动

实现双向滚动的 Vue 方法 双向滚动通常指两个关联的滚动区域(如表格的头部和内容部分)同步滚动。以下是几种实现方式: 使用事件监听和 scroll 方法 通过监听一个滚动区域的 scrol…

vue双向实现原理

vue双向实现原理

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

vue实现数据双向

vue实现数据双向

在Vue中实现数据双向绑定主要依靠v-model指令,它结合了属性绑定和事件监听,适用于表单元素或自定义组件。以下是具体实现方式: 基础表单元素的双向绑定 对于原生表单元素(如input、text…

vue双向绑定如何实现

vue双向绑定如何实现

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