当前位置:首页 > VUE

vue如何实现vmodel

2026-03-29 20:10:09VUE

Vue 中实现 v-model 的方法

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

在表单元素中使用 v-model

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

<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 进行了以下改进:

  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 事件后同步 -->

自定义修饰符:

vue如何实现vmodel

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 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…

vue tab实现

vue tab实现

Vue Tab 实现方法 使用动态组件实现 Tab 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现 Ta…

vue原理实现

vue原理实现

Vue 原理实现的核心机制 Vue.js 的核心原理基于响应式系统、虚拟 DOM 和模板编译。以下是其核心实现机制的分解: 响应式系统 Vue 使用 Object.defineProperty(Vu…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

vue单选实现

vue单选实现

Vue 单选实现 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定一个变量,可以实现单选效果。当用户选择不同的选…

vue实现换页

vue实现换页

Vue实现页面切换的方法 在Vue中实现页面切换通常可以通过Vue Router来完成。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的实现方式:…