当前位置:首页 > VUE

vue双向数据怎么实现

2026-01-21 14:04:29VUE

Vue 双向数据绑定的实现

Vue 的双向数据绑定主要通过 v-model 指令实现,结合数据劫持(Object.definePropertyProxy)和发布-订阅模式完成数据与视图的同步更新。

基础实现方式

在表单元素上使用 v-model,语法如下:

<input v-model="message">
<p>{{ message }}</p>

对应的 JavaScript 部分:

new Vue({
  el: '#app',
  data: {
    message: ''
  }
});

v-model:value@input 的语法糖,等价于:

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

自定义组件实现双向绑定

对于自定义组件,需通过 props$emit 手动实现:

  1. 父组件模板

    <custom-input v-model="parentMessage"></custom-input>
  2. 子组件实现

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

原理:

  • 父组件通过 v-model 传递 parentMessage 到子组件的 value prop。
  • 子组件输入时触发 input 事件并传递新值,父组件同步更新 parentMessage

底层原理

  1. 数据劫持: Vue 2.x 使用 Object.defineProperty 监听数据变化:
    Object.defineProperty(obj, key, {
    get() { return val; },
    set(newVal) {
     val = newVal;
     dep.notify(); // 触发更新
    }
    });

Vue 3.x 改用 Proxy

new Proxy(data, {
  set(target, key, value) {
    target[key] = value;
    triggerUpdate(); // 触发更新
  }
});
  1. 依赖收集
  • 在 getter 中收集依赖(Watcher)。
  • 在 setter 中通知依赖更新视图。

修饰符扩展

v-model 支持修饰符:

  • .lazy:将 input 事件改为 change 事件(失焦后更新)。
  • .number:自动将输入转为数字类型。
  • .trim:自动去除首尾空格。

示例:

<input v-model.lazy="msg">
<input v-model.number="age">

多选框与单选按钮

  1. 单选按钮

    <input type="radio" v-model="picked" value="a">
  2. 多选框

    <input type="checkbox" v-model="checked" value="a">
  3. 多选列表(绑定数组):

    vue双向数据怎么实现

    <select v-model="selected" multiple>
    <option value="a">A</option>
    </select>

注意事项

  • 避免直接修改 prop,始终通过 $emit 通知父组件。
  • 对于复杂对象,需确保属性是响应式的(Vue.set 或 Vue 3 的 reactive)。
  • Vue 3 的 v-model 默认使用 modelValue 作为 prop 名,可通过参数修改:
    <custom-input v-model:title="pageTitle"></custom-input>

标签: 双向数据
分享给朋友:

相关文章

vue实现数据增加

vue实现数据增加

vue实现数据增加的几种方法 在Vue中实现数据增加通常涉及以下几个核心概念和方法: 响应式数据声明 在Vue组件中,使用data选项或ref(Vue 3)声明响应式数据: // Vue 2 da…

vue实现表格读取数据

vue实现表格读取数据

Vue 实现表格数据读取 在 Vue 中实现表格数据读取通常涉及以下关键步骤: 数据绑定与表格渲染 通过 v-for 指令动态渲染表格行,数据通常存储在组件的 data 或 Vuex 状态中:…

实现vue双向绑定

实现vue双向绑定

Vue 双向绑定的实现原理 Vue 的双向绑定主要通过 v-model 指令实现,其核心是结合数据劫持(Object.defineProperty 或 Proxy)和发布-订阅模式。以下是具体实现机制…

vue实现数据绑定

vue实现数据绑定

Vue 数据绑定的实现方式 Vue.js 提供了多种数据绑定方式,主要包括双向绑定 (v-model)、单向绑定 ({{ }} 插值或 v-bind)、以及响应式数据管理。以下是具体实现方法: 双向…

vue实现数据筛选

vue实现数据筛选

数据筛选的实现方式 在Vue中实现数据筛选可以通过计算属性、方法或第三方库完成。以下是几种常见的方法: 计算属性筛选 使用计算属性对数组数据进行筛选,具有缓存特性,适合静态或较少变化的数据。 co…

vue实现数据搜索

vue实现数据搜索

实现数据搜索的基本思路 在Vue中实现数据搜索功能通常涉及以下几个核心步骤:监听用户输入、过滤数据列表、动态更新视图。以下是具体实现方法: 监听搜索输入 使用v-model双向绑定搜索框输入值,配合…