当前位置:首页 > 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 的“查看更多”功能 数据截取与显示控制 通过 v-if 或 v-show 控制内容的显示与隐藏。初始状态下只显示部分内容,点击“查看更多”后展开完整内容。 <template&g…

vue树形实现

vue树形实现

Vue 树形组件实现方法 使用递归组件实现树形结构 递归组件是 Vue 中实现树形结构的常见方法。通过组件调用自身的方式,可以轻松构建多层嵌套的树形结构。 <template> &l…

vue alert实现

vue alert实现

使用 Vue 实现 Alert 组件 在 Vue 中实现 Alert 组件可以通过自定义组件或结合第三方库完成。以下是几种常见方法: 自定义 Alert 组件 创建一个可复用的 Alert 组件,通…

vue实现vnc

vue实现vnc

Vue 实现 VNC 客户端 在 Vue 项目中实现 VNC 客户端功能,可以通过集成现有的 VNC 客户端库或组件完成。以下是具体实现方法: 安装依赖库 使用 noVNC 或其他 VNC 客户端…

vue实现标题

vue实现标题

Vue 实现标题的方法 在Vue中实现标题可以通过多种方式,以下是几种常见的方法: 方法一:使用模板语法 在Vue组件的模板中直接使用HTML的<h1>到<h6>标签来定义…

vue实现select

vue实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML select 元素 原生 HTML 的 <sel…