当前位置:首页 > VUE

vue双向实现

2026-01-11 21:37:32VUE

Vue 双向绑定的实现原理

Vue 的双向绑定主要通过 v-model 指令实现,底层结合了数据劫持(Object.definePropertyProxy)和发布-订阅模式。以下是核心实现机制:

数据劫持

Vue 2.x 使用 Object.defineProperty 劫持对象的属性访问和修改,Vue 3.x 改用 Proxy 实现更高效的数据监听。

Vue 2.x 示例:

const data = { text: '' };
Object.defineProperty(data, 'text', {
  get() {
    return this._text;
  },
  set(newVal) {
    this._text = newVal;
    console.log('数据更新了');
  }
});

Vue 3.x 示例:

vue双向实现

const data = { text: '' };
const proxy = new Proxy(data, {
  get(target, key) {
    return target[key];
  },
  set(target, key, value) {
    target[key] = value;
    console.log('数据更新了');
    return true;
  }
});

发布-订阅模式

通过 Dep(依赖收集器)和 Watcher(观察者)实现数据变化时的视图更新:

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

class Watcher {
  constructor(vm, key, cb) {
    this.vm = vm;
    this.key = key;
    this.cb = cb;
    Watcher.target = this;
    this.vm[this.key]; // 触发 getter 收集依赖
    Watcher.target = null;
  }
  update() {
    this.cb.call(this.vm, this.vm[this.key]);
  }
}

v-model 的实现

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

vue双向实现

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

自定义双向绑定组件

通过 model 选项和 $emit 实现自定义组件的双向绑定:

子组件:

export default {
  model: {
    prop: 'value',
    event: 'change'
  },
  props: ['value'],
  methods: {
    handleInput(e) {
      this.$emit('change', e.target.value);
    }
  }
}

父组件使用:

<custom-input v-model="text"></custom-input>

注意事项

  • Vue 2.x 中 Object.defineProperty 无法检测数组下标变化,需通过 Vue.set 或数组方法触发更新。
  • Vue 3.x 的 Proxy 支持深层监听,但需注意性能开销。
  • 复杂场景可结合 .sync 修饰符或 v-bind.sync 实现多属性双向绑定。

标签: 双向vue
分享给朋友:

相关文章

vue 实现

vue 实现

Vue 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…

vue实现muli

vue实现muli

Vue 实现多语言(i18n)支持 在 Vue 项目中实现多语言(i18n)功能,通常使用 vue-i18n 插件。以下是具体实现步骤: 安装 vue-i18n npm install vue…

vue实现闪烁

vue实现闪烁

Vue实现元素闪烁效果 使用CSS动画实现 通过Vue绑定class结合CSS动画实现闪烁效果,代码简洁且性能较好。 <template> <div :class="{…

vue页面实现

vue页面实现

Vue 页面实现方法 创建 Vue 组件 使用 Vue 单文件组件(SFC)方式创建页面,文件扩展名为 .vue。一个基本的 Vue 组件包含三个部分:模板(template)、脚本(script)和…

vue实现modal

vue实现modal

Vue 实现 Modal 弹窗组件 使用 Vue 实现 Modal 弹窗组件可以通过多种方式,包括原生 Vue 组件、第三方库或自定义指令。以下是几种常见方法: 原生 Vue 组件实现 创建一个基础…

实现vue cli

实现vue cli

安装 Vue CLI 确保系统中已安装 Node.js(版本建议 12.x 或更高)。通过 npm 全局安装 Vue CLI: npm install -g @vue/cli 安装完成后验证版本:…