当前位置:首页 > VUE

vue 组件实现v model

2026-01-21 04:31:06VUE

Vue 组件实现 v-model

在 Vue 中,v-model 是双向绑定的语法糖,通常用于表单元素。自定义组件也可以通过实现 v-model 来支持双向绑定。

基本实现方式

默认情况下,v-model 在组件上使用 value 作为 prop,input 作为事件。可以通过以下方式实现:

<!-- 父组件 -->
<template>
  <CustomInput v-model="message" />
</template>

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

<script>
export default {
  props: ['value']
}
</script>

自定义 prop 和事件

Vue 2.4+ 允许自定义 v-model 的 prop 和事件名称:

<!-- 父组件 -->
<template>
  <CustomInput v-model="message" />
</template>
<!-- 子组件 CustomInput -->
<template>
  <input
    :value="text"
    @input="$emit('update', $event.target.value)"
  />
</template>

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

Vue 3 中的变化

Vue 3 中 v-model 的默认行为有所改变:

<!-- 父组件 -->
<template>
  <CustomInput v-model="message" />
</template>
<!-- 子组件 CustomInput -->
<template>
  <input
    :modelValue="modelValue"
    @update:modelValue="$emit('update:modelValue', $event.target.value)"
  />
</template>

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

多个 v-model 绑定

Vue 3 支持在单个组件上使用多个 v-model

<!-- 父组件 -->
<template>
  <UserForm
    v-model:name="userName"
    v-model:email="userEmail"
  />
</template>
<!-- 子组件 UserForm -->
<template>
  <input
    :value="name"
    @input="$emit('update:name', $event.target.value)"
  />
  <input
    :value="email"
    @input="$emit('update:email', $event.target.value)"
  />
</template>

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

使用计算属性

对于更复杂的逻辑,可以在子组件中使用计算属性:

<!-- 子组件 -->
<template>
  <input v-model="internalValue" />
</template>

<script>
export default {
  props: ['value'],
  computed: {
    internalValue: {
      get() {
        return this.value
      },
      set(val) {
        this.$emit('input', val)
      }
    }
  }
}
</script>

处理修饰符

可以处理 v-model 修饰符:

vue 组件实现v model

<!-- 父组件 -->
<template>
  <CustomInput v-model.trim="message" />
</template>
<!-- 子组件 -->
<template>
  <input
    :value="value"
    @input="$emit('input', $event.target.value.trim())"
  />
</template>

<script>
export default {
  props: ['value']
}
</script>

通过以上方法,可以在 Vue 组件中灵活实现 v-model 功能,满足各种双向绑定的需求。

标签: 组件vue
分享给朋友:

相关文章

vue实现预览

vue实现预览

Vue实现文件预览的方法 使用Vue实现文件预览功能可以通过多种方式完成,具体取决于文件类型(图片、PDF、视频等)。以下是几种常见文件类型的实现方案。 图片预览 通过<input type=…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

vue jwt实现

vue jwt实现

Vue JWT 实现方法 安装依赖 确保项目中安装了 jsonwebtoken(后端)和 axios(前端)。若使用 Vue 3,可搭配 vue-router 和 pinia(或 vuex)管理状态。…

mvvm实现vue

mvvm实现vue

MVVM 模式在 Vue 中的实现 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 的设计灵感来源于此。以下是 MVVM 在 Vue 中的核心实现方式: 数据绑定(M…

vue实现例子

vue实现例子

以下是一些常见的 Vue 实现例子,涵盖基础功能到进阶应用场景: 基础数据绑定 使用 v-model 实现双向数据绑定: <template> <div> &l…