当前位置:首页 > 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):

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

注意事项

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

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

vue双向实现

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

相关文章

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成列…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery…

vue实现浮标

vue实现浮标

Vue 实现浮动按钮(浮标) 使用 Vue 实现浮动按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 定位和 Vue 组件 创建 Vue 组件并配合 CSS 固定定位实现浮动按钮:…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…