当前位置:首页 > VUE

vue-model实现

2026-01-18 08:37:35VUE

Vue 双向数据绑定实现原理

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

数据劫持

Vue 使用 Object.defineProperty 或 ES6 的 Proxy 来劫持对象的属性,当属性被访问或修改时触发相应的 getter 和 setter。

// 使用 Object.defineProperty 实现数据劫持
function defineReactive(obj, key, val) {
  Object.defineProperty(obj, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      console.log(`获取 ${key}: ${val}`);
      return val;
    },
    set: function reactiveSetter(newVal) {
      console.log(`设置 ${key}: ${newVal}`);
      val = newVal;
    }
  });
}

发布-订阅模式

Vue 通过 Dep 和 Watcher 实现发布-订阅模式,Dep 用于收集依赖,Watcher 用于更新视图。

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

class Watcher {
  update() {
    console.log('视图更新');
  }
}

v-model 实现

v-model 本质上是语法糖,结合了 v-bindv-on。以 input 元素为例:

<input v-model="message">

等价于:

<input 
  :value="message" 
  @input="message = $event.target.value"
>

自定义组件实现 v-model

在自定义组件中,可以通过 model 选项和 $emit 实现双向绑定。

Vue.component('custom-input', {
  props: ['value'],
  model: {
    prop: 'value',
    event: 'input'
  },
  template: `
    <input
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
  `
});

使用 Proxy 实现数据劫持

在 Vue 3 中,使用 Proxy 替代 Object.defineProperty,可以更好地处理数组和对象。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key) {
      console.log(`获取 ${key}`);
      return target[key];
    },
    set(target, key, value) {
      console.log(`设置 ${key}`);
      target[key] = value;
      return true;
    }
  });
}

总结

Vue 的双向数据绑定通过数据劫持和发布-订阅模式实现,v-model 是其语法糖形式。自定义组件可以通过 model 选项和 $emit 实现类似功能。Vue 3 使用 Proxy 提供了更强大的数据劫持能力。

vue-model实现

标签: vuemodel
分享给朋友:

相关文章

vue实现视频开场

vue实现视频开场

使用 Vue 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依赖…

vue前端实现搜索

vue前端实现搜索

实现搜索功能的基本方法 在Vue中实现搜索功能通常涉及以下几个关键步骤,结合数据绑定、计算属性和方法调用来动态过滤和显示结果。 数据绑定与输入处理 使用v-model双向绑定搜索输入框的值,监听用户…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-if…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现下拉刷新组件

vue实现下拉刷新组件

实现下拉刷新组件的核心思路 下拉刷新功能通常通过监听触摸事件、滚动位置和动画效果实现。Vue中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。 基于自定义指令的实现 创建指令监听触摸事件,…

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="w…