当前位置:首页 > 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 的双向数据绑定主要通过 v-model 指令实现,其核心是结合了数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。 数据…

前端vue登录功能实现

前端vue登录功能实现

Vue 登录功能实现步骤 创建登录表单组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含用户名和密码输入框以及提交按钮。 <template> &l…

vue 实现

vue 实现

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

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue实现功能

vue实现功能

Vue 功能实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现常见功能的几种方法: 数据绑定与响应式更新 在 Vue 中,数据绑定通过 v-mode…

vue实现递归

vue实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据(如菜单、评论列表、文件目录等)。以下是具体实现方法: 定义递归组件 通过 name 选项让组件可以递归调用自身:…