当前位置:首页 > VUE

vue实现vmodel

2026-01-08 02:22:33VUE

Vue 实现 v-model

Vue 的 v-model 是一个语法糖,用于在表单元素或组件上实现双向数据绑定。以下是其实现方式和原理的详细说明。

在表单元素上使用 v-model

v-model 在原生表单元素(如 inputtextareaselect)上的实现本质上是监听 inputchange 事件,并动态更新绑定的数据。

<input v-model="message" />

等价于:

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

在自定义组件上使用 v-model

在 Vue 2 中,v-model 默认绑定到 value prop 和 input 事件。可以通过 model 选项修改默认行为。

vue实现vmodel

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

在 Vue 3 中,v-model 的行为有所变化,支持多个 v-model 绑定,并默认使用 modelValue prop 和 update:modelValue 事件。

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

自定义 v-model 修饰符

Vue 允许为 v-model 添加修饰符,例如 .trim.number.lazy。在自定义组件中,可以通过 modelModifiers prop 访问修饰符。

vue实现vmodel

app.component('custom-input', {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  emits: ['update:modelValue'],
  template: `
    <input 
      :value="modelValue" 
      @input="$emit('update:modelValue', $event.target.value)"
    />
  `,
  created() {
    console.log(this.modelModifiers); // 输出修饰符对象
  }
});

实现双向绑定的底层原理

v-model 的核心是结合 :value(或 :modelValue)和 @input(或 @update:modelValue)实现数据同步。以下是 Vue 3 的实现示例:

const app = Vue.createApp({
  data() {
    return {
      message: ''
    };
  },
  template: `
    <custom-input v-model="message" />
  `
});

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

app.mount('#app');

多 v-model 绑定(Vue 3 特有)

Vue 3 支持为单个组件绑定多个 v-model,例如:

<user-name
  v-model:first-name="firstName"
  v-model:last-name="lastName"
/>

对应的组件实现:

app.component('user-name', {
  props: {
    firstName: String,
    lastName: String
  },
  emits: ['update:firstName', 'update:lastName'],
  template: `
    <input 
      :value="firstName"
      @input="$emit('update:firstName', $event.target.value)"
    />
    <input 
      :value="lastName"
      @input="$emit('update:lastName', $event.target.value)"
    />
  `
});

通过以上方法,可以灵活地在 Vue 中实现 v-model 的双向绑定功能。

标签: vuevmodel
分享给朋友:

相关文章

vue路由实现内部切换

vue路由实现内部切换

Vue 路由实现内部切换的方法 Vue Router 是 Vue.js 官方的路由管理器,用于实现单页应用(SPA)的页面切换。以下是几种常见的内部路由切换方式: 使用 <router-lin…

vue架构实现

vue架构实现

Vue 架构实现核心方案 Vue.js 的架构实现通常围绕模块化、组件化和状态管理展开。以下为常见实现方案: 基于单文件组件(SFC)的模块化 通过 .vue 文件组织模板、脚本和样式: <…

vue实现flvvideo

vue实现flvvideo

vue-flv-player 实现 FLV 视频播放 安装依赖包 npm install flv.js vue-flv-player 基础组件引入 <template> <v…

vue实现刷新

vue实现刷新

Vue 实现页面刷新的方法 在Vue中实现页面刷新可以通过多种方式,以下是几种常见的方法: 使用 window.location.reload() 通过调用浏览器的原生方法强制刷新当前页面:…

vue实现上划

vue实现上划

Vue 实现上划功能 在Vue中实现上划功能,可以通过监听触摸事件(touchstart、touchmove、touchend)来判断用户的手势方向。以下是实现上划功能的几种方法: 监听触摸事件 通…

vue实现监控

vue实现监控

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、事件监听或第三方监控工具集成。以下是几种常见实现方式: 使用 Vue 的 watch 监听数据变化 通过 watch 可以…