当前位置:首页 > VUE

vue如何实现vmodel

2026-03-29 20:10:09VUE

Vue 中实现 v-model 的方法

v-model 是 Vue 中用于双向数据绑定的指令,常用于表单元素或自定义组件。以下是具体实现方式:

在表单元素中使用 v-model

v-model 可以直接用于原生表单元素,自动绑定数据并监听输入事件:

vue如何实现vmodel

<input v-model="message" placeholder="输入内容">
<p>输入的内容是:{{ message }}</p>
data() {
  return {
    message: ''
  }
}

在自定义组件中实现 v-model

自定义组件需要显式定义 v-model 的行为:

  1. 默认情况下,v-model 在组件上使用 value 作为 prop,input 作为事件:
<custom-input v-model="message"></custom-input>
Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
  `
})
  1. Vue 2.2.0+ 允许自定义 model 选项:
Vue.component('custom-input', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: ['checked'],
  template: `
    <input
      type="checkbox"
      :checked="checked"
      @change="$emit('change', $event.target.checked)"
    >
  `
})

Vue 3 中的变化

Vue 3 对 v-model 进行了以下改进:

vue如何实现vmodel

  1. 默认使用 modelValue 作为 prop,update:modelValue 作为事件:
app.component('custom-input', {
  props: ['modelValue'],
  template: `
    <input
      :value="modelValue"
      @input="$emit('update:modelValue', $event.target.value)"
    >
  `
})
  1. 支持多个 v-model 绑定:
<user-name
  v-model:first-name="firstName"
  v-model:last-name="lastName"
></user-name>
app.component('user-name', {
  props: {
    firstName: String,
    lastName: String
  },
  template: `
    <input
      type="text"
      :value="firstName"
      @input="$emit('update:firstName', $event.target.value)">
    <input
      type="text"
      :value="lastName"
      @input="$emit('update:lastName', $event.target.value)">
  `
})

修饰符的使用

v-model 支持内置修饰符:

<input v-model.trim="msg">  <!-- 自动去除首尾空格 -->
<input v-model.number="age" type="number">  <!-- 自动转为数字 -->
<input v-model.lazy="msg">  <!-- 改为 change 事件后同步 -->

自定义修饰符:

app.component('my-component', {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  methods: {
    emitValue(e) {
      let value = e.target.value
      if (this.modelModifiers.capitalize) {
        value = value.charAt(0).toUpperCase() + value.slice(1)
      }
      this.$emit('update:modelValue', value)
    }
  },
  template: `
    <input type="text" :value="modelValue" @input="emitValue">
  `
})
<my-component v-model.capitalize="myText"></my-component>

这些方法涵盖了 Vue 中 v-model 的主要使用场景和实现方式。

标签: 如何实现vue
分享给朋友:

相关文章

vue实现闪烁

vue实现闪烁

Vue实现元素闪烁效果 使用CSS动画实现 通过Vue绑定class结合CSS动画实现闪烁效果,代码简洁且性能较好。 <template> <div :class="{ 'bl…

vue实现groupbox

vue实现groupbox

Vue 实现 GroupBox 组件 在 Vue 中实现类似 GroupBox 的效果可以通过自定义组件完成。GroupBox 通常是一个带有标题的边框容器,用于将相关控件分组显示。 基本实现方法…

vue实现swipe

vue实现swipe

Vue实现Swipe功能的方法 使用第三方库(推荐) Vue生态中有多个成熟的轮播/滑动组件库,例如vue-awesome-swiper或swiper/vue。以下是基于swiper/vue的实现示例…

vue 实现滑动

vue 实现滑动

Vue 实现滑动效果的方法 在Vue中实现滑动效果可以通过多种方式,以下是几种常见的方法: 使用CSS过渡和动画 通过Vue的<transition>组件结合CSS过渡或动画实现滑动效果…

vue 实现vshow

vue 实现vshow

Vue 实现 v-show 在 Vue 中,v-show 是一个常用的指令,用于根据条件控制元素的显示或隐藏。与 v-if 不同,v-show 不会移除 DOM 元素,而是通过 CSS 的 displ…

vue列表查询实现

vue列表查询实现

实现 Vue 列表查询功能 基础列表渲染 在 Vue 中可以通过 v-for 指令实现列表渲染,结合计算属性动态过滤数据: <template> <div> &l…