当前位置:首页 > VUE

vue实现双休绑定

2026-02-19 01:07:29VUE

Vue 实现双向绑定

Vue 实现双向绑定的核心机制是结合数据劫持(通过 Object.definePropertyProxy)和发布-订阅模式。以下是具体实现方式:

数据劫持

通过 Object.defineProperty 或 ES6 的 Proxy 监听数据变化。Vue 2.x 使用 Object.defineProperty,Vue 3.x 升级为 Proxy

vue实现双休绑定

// Vue 2.x 数据劫持示例
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    get() {
      return val;
    },
    set(newVal) {
      if (newVal !== val) {
        val = newVal;
        // 触发更新
        dep.notify();
      }
    }
  });
}

依赖收集

每个响应式数据关联一个 Dep(依赖收集器),用于存储所有依赖该数据的 Watcher 实例。

vue实现双休绑定

class Dep {
  constructor() {
    this.subs = [];
  }
  addSub(sub) {
    this.subs.push(sub);
  }
  notify() {
    this.subs.forEach(sub => sub.update());
  }
}

模板编译

Vue 编译器将模板解析为渲染函数,过程中遇到 v-model 等指令时会创建对应的 Watcher,并触发数据的 getter 完成依赖收集。

// 简化的 Watcher 示例
class Watcher {
  constructor(vm, exp, cb) {
    this.vm = vm;
    this.getter = parsePath(exp);
    this.cb = cb;
    this.value = this.get();
  }
  get() {
    Dep.target = this;
    const value = this.getter.call(this.vm, this.vm);
    Dep.target = null;
    return value;
  }
  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.cb.call(this.vm, this.value, oldValue);
  }
}

双向绑定实现

v-model 是语法糖,本质是 :value 绑定和 @input 事件监听的组合:

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

完整流程

  1. 初始化时通过数据劫持监听所有响应式数据。
  2. 模板编译过程中为每个依赖创建 Watcher,触发 getterWatcher 添加到 Dep 中。
  3. 数据变化时触发 setter,调用 Dep.notify() 通知所有 Watcher 更新视图。

注意事项

  • Vue 3.x 使用 Proxy 替代 Object.defineProperty,解决了数组监听和对象新增属性的限制。
  • 自定义组件实现双向绑定需显式定义 model 选项和触发 update:propName 事件。

标签: 绑定vue
分享给朋友:

相关文章

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template> &…

vue实现验证

vue实现验证

Vue 表单验证实现方法 在Vue中实现表单验证可以通过多种方式完成,以下是常见的几种方法: 使用Vuelidate库 Vuelidate是一个轻量级的Vue表单验证库,安装后可以通过简单的配置实现…

vue实现增加

vue实现增加

实现 Vue 中的新增功能 在 Vue 中实现新增功能通常涉及数据绑定、表单处理和状态管理。以下是几种常见的实现方式: 数据绑定与列表渲染 通过 v-model 绑定表单输入,使用数组的 push…

vue 实现$(id)

vue 实现$(id)

在 Vue 中实现类似 jQuery 的 $(id) 功能,可以通过以下几种方式操作 DOM 元素: 使用 ref 属性 Vue 推荐使用 ref 属性来直接访问 DOM 元素或组件实例。在模板中为…

vue递归实现

vue递归实现

vue递归实现方法 在Vue中实现递归组件通常用于树形结构、嵌套菜单等场景。以下是具体实现方式: 使用组件name属性递归 定义一个组件时,通过name属性让组件可以在自身模板中调用自己:…

vue实现搜索提示

vue实现搜索提示

Vue实现搜索提示的方法 使用v-model绑定输入框 通过v-model将输入框的值与Vue实例中的数据进行双向绑定,实时获取用户输入内容。 <input v-model="searchQu…