当前位置:首页 > VUE

vue双向实现

2026-02-25 15:34:36VUE

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

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

基于 Object.defineProperty 的实现

  1. 数据劫持(响应式化)
    通过 Object.defineProperty 监听对象属性的读取和修改:

    function defineReactive(obj, key, val) {
      const dep = new Dep(); // 依赖收集器
      Object.defineProperty(obj, key, {
        get() {
          dep.depend(); // 收集当前依赖
          return val;
        },
        set(newVal) {
          if (newVal === val) return;
          val = newVal;
          dep.notify(); // 通知更新
        }
      });
    }
  2. 依赖收集与触发
    依赖管理器 Dep 和观察者 Watcher 实现订阅-发布:

    class Dep {
      constructor() {
        this.subscribers = [];
      }
      depend() {
        if (Dep.target) this.subscribers.push(Dep.target);
      }
      notify() {
        this.subscribers.forEach(watcher => watcher.update());
      }
    }
  3. v-model 的语法糖
    v-model 本质是 :value@input 的简写:

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

基于 Proxy 的实现(Vue 3)

Vue 3 使用 Proxy 替代 Object.defineProperty,解决深层对象监听和数组限制:

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

自定义双向绑定实现示例

  1. 组件内实现
    通过 props$emit 实现父子组件双向绑定:

    Vue.component('CustomInput', {
      props: ['value'],
      template: `
        <input 
          :value="value" 
          @input="$emit('input', $event.target.value)"
        >
      `
    });
  2. 修饰符扩展
    v-model 支持修饰符(如 .lazy.number):

    vue双向实现

    <input v-model.lazy="message">

注意事项

  • 性能影响:深层对象监听可能引发性能问题,建议扁平化数据结构。
  • 数组限制:Vue 2 中直接通过索引修改数组需使用 Vue.set 或数组方法(如 push)。
  • 兼容性Proxy 无法在低版本浏览器中使用,Vue 3 需通过 polyfill 降级支持。

通过以上机制,Vue 实现了数据与视图的自动同步,开发者无需手动操作 DOM。

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

相关文章

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级比…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

vue实现框选

vue实现框选

Vue 实现框选功能 在 Vue 中实现框选功能通常需要监听鼠标事件,计算选区范围,并根据选区范围高亮或选中元素。以下是实现框选功能的关键步骤。 监听鼠标事件 在 Vue 模板中,为容器元素绑定鼠标…

vue 实现table

vue 实现table

Vue 实现 Table 的方法 使用原生 HTML 表格 通过 Vue 的 v-for 指令动态渲染表格数据,适合简单表格场景。 <template> <table>…

vue实现回复

vue实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及前端表单交互、数据绑定和后端通信。以下是实现回复功能的详细步骤: 数据绑定与表单设计 使用 Vue 的 v-model 绑定回复框的输入内容,…