当前位置:首页 > VUE

vue实现vmodel

2026-01-13 07:21:55VUE

Vue 实现 v-model 双向绑定

v-model 是 Vue 提供的语法糖,用于在表单元素或自定义组件上实现双向数据绑定。其本质是 value 属性和 input 事件的组合。

在表单元素中使用 v-model

Vue 内置了对常见表单元素(如 inputtextareaselect)的 v-model 支持。

<template>
  <input v-model="message" placeholder="Edit me">
  <p>Message is: {{ message }}</p>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

自定义组件实现 v-model

在自定义组件中实现 v-model 需要显式定义 model 选项或使用 v-bindv-on 的语法糖。

方法 1:使用 model 选项

<template>
  <custom-input v-model="searchText"></custom-input>
</template>

<script>
export default {
  data() {
    return {
      searchText: ''
    }
  }
}
</script>
<!-- CustomInput.vue -->
<template>
  <input
    :value="value"
    @input="$emit('input', $event.target.value)"
  >
</template>

<script>
export default {
  props: ['value'],
  model: {
    prop: 'value',
    event: 'input'
  }
}
</script>

方法 2:Vue 2.2+ 的语法糖

vue实现vmodel

<custom-input
  :value="searchText"
  @input="searchText = $event"
></custom-input>

Vue 3 中的变化

Vue 3 对 v-model 进行了改进,支持多个 v-model 绑定和自定义修饰符。

基本用法

<custom-input v-model="searchText"></custom-input>

等效实现

vue实现vmodel

<custom-input
  :modelValue="searchText"
  @update:modelValue="searchText = $event"
></custom-input>

自定义组件实现

<!-- CustomInput.vue -->
<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  >
</template>

<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>

多个 v-model 绑定

<user-name
  v-model:first-name="firstName"
  v-model:last-name="lastName"
></user-name>
<!-- UserName.vue -->
<template>
  <input
    :value="firstName"
    @input="$emit('update:firstName', $event.target.value)"
  >
  <input
    :value="lastName"
    @input="$emit('update:lastName', $event.target.value)"
  >
</template>

<script>
export default {
  props: {
    firstName: String,
    lastName: String
  },
  emits: ['update:firstName', 'update:lastName']
}
</script>

修饰符处理

可以自定义修饰符处理逻辑:

<custom-input v-model.capitalize="text"></custom-input>
<!-- CustomInput.vue -->
<template>
  <input
    :value="modelValue"
    @input="emitValue"
  >
</template>

<script>
export default {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  emits: ['update:modelValue'],
  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)
    }
  }
}
</script>

通过以上方法可以在 Vue 中灵活实现各种 v-model 双向绑定需求。

标签: vuevmodel
分享给朋友:

相关文章

vue实现同步

vue实现同步

Vue 实现同步的方法 在 Vue 中实现同步操作通常涉及数据绑定、状态管理和异步操作的处理。以下是几种常见的方法: 使用计算属性(Computed Properties) 计算属性基于响应式依赖进…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signatu…

vue实现分步

vue实现分步

Vue 实现分步功能 在 Vue 中实现分步功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 通过动态组件切换不同的步骤内容,结合 v-if 或 component 标签实现分步逻辑。…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue实现子表格

vue实现子表格

Vue 实现子表格的方法 在 Vue 中实现子表格可以通过多种方式完成,以下是几种常见的方法: 使用嵌套组件 创建一个父表格组件和一个子表格组件,通过 props 将数据传递给子表格组件。父表格的每…

vue实现购物平台

vue实现购物平台

实现购物平台的基本架构 使用Vue.js构建购物平台需要结合前端框架、状态管理、路由和后端接口。以下是一个基本实现方案: 项目初始化与依赖安装 通过Vue CLI创建项目并安装必要依赖: vue…