当前位置:首页 > 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,可以更好地处理数组和对象。

vue-model实现

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 提供了更强大的数据劫持能力。

标签: vuemodel
分享给朋友:

相关文章

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现hover

vue实现hover

Vue 实现 hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式实现,包括使用 CSS、Vue 指令或事件监听。以下是几种常见的方法: 使用 CSS :hover 伪类 通…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

vue实现selectable

vue实现selectable

Vue 实现可选择的 Select 组件 在 Vue 中实现一个可选择的 Select 组件,可以通过以下几种方式: 使用原生 HTML select 元素 <template>…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…