当前位置:首页 > 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-cropperjs 库 vue-cropperjs 是一个基于 cropperjs 的 Vue 组件,专门用于图片裁剪。安装方式如下: npm inst…

vue怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如:…

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-contain…

vue实现展开与收起

vue实现展开与收起

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

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。 安装依…

vue的艾特功能实现

vue的艾特功能实现

Vue 的 @ 功能实现 在 Vue 中实现类似社交平台的 @ 功能,通常涉及输入框的监听、用户匹配和选择插入。以下是具体实现方法: 监听输入框内容 使用 v-model 绑定输入框内容,并通过 @…