当前位置:首页 > 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.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 访问修饰符。

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 的双向绑定功能。

vue实现vmodel

标签: vuevmodel
分享给朋友:

相关文章

vue实现直播

vue实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能通常需要结合第三方直播服务或自建流媒体服务器。以下是几种常见的实现方式: 使用第三方直播SDK 腾讯云直播SDK 安装SDK包:npm…

vue实现预约页面

vue实现预约页面

Vue 预约页面实现步骤 准备工作 安装Vue CLI创建项目,确保已配置好开发环境。使用vue create appointment-page初始化项目,选择默认配置或手动配置。 页面结构设计…

vue循环数组实现

vue循环数组实现

vue循环数组的实现方法 在Vue中循环数组主要通过v-for指令实现,以下是几种常见用法: 基本数组循环 使用v-for指令遍历数组,可以通过(item, index)的语法获取当前项和索引值:…

vue实现添加用户

vue实现添加用户

Vue 实现添加用户功能 数据绑定与表单设计 在 Vue 中实现添加用户功能,首先需要设计一个表单,用于收集用户输入的数据。通过 v-model 实现双向数据绑定,确保表单数据与 Vue 实例中的数据…

vue实现条件判断

vue实现条件判断

Vue 条件判断实现方法 Vue 提供了多种方式实现条件判断,可以根据不同场景选择合适的方式。 v-if / v-else-if / v-else 这是 Vue 中最常用的条件渲染指令,根据表达式的…

vue怎么实现页面返回

vue怎么实现页面返回

Vue 实现页面返回的方法 在 Vue 中实现页面返回功能,可以通过以下几种方式完成,具体取决于项目使用的路由模式和技术栈。 使用 Vue Router 的编程式导航 通过 this.$router…