当前位置:首页 > VUE

vue 组件实现v model

2026-02-21 20:00:16VUE

Vue 组件实现 v-model

在 Vue 中,v-model 是双向数据绑定的语法糖,默认情况下用于表单元素(如 inputselect)。自定义组件也可以通过实现 v-model 来支持双向绑定。

实现原理

v-model 在组件上默认绑定 value prop 和 input 事件。Vue 2 和 Vue 3 的实现方式略有不同:

  • Vue 2v-model:value@input 的语法糖。
  • Vue 3v-model:modelValue@update:modelValue 的语法糖,同时支持多个 v-model 绑定。

Vue 2 实现方式

基本实现

  1. 定义组件
    在子组件中,通过 props 接收 value,并在值变化时触发 input 事件。
<!-- 子组件 CustomInput.vue -->
<template>
  <input 
    :value="value" 
    @input="$emit('input', $event.target.value)"
  />
</template>

<script>
export default {
  props: ['value']
}
</script>
  1. 父组件使用
    父组件直接通过 v-model 绑定数据。
<!-- 父组件 -->
<template>
  <CustomInput v-model="message" />
</template>

<script>
import CustomInput from './CustomInput.vue';

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

自定义 model 选项

如果需要修改默认的 prop 和事件名,可以通过 model 选项配置。

<!-- 子组件 CustomInput.vue -->
<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 默认使用 modelValueupdate:modelValue

  1. 子组件定义
    通过 props 接收 modelValue,并通过 emit 触发更新。
<!-- 子组件 CustomInput.vue -->
<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>
  1. 父组件使用
    直接通过 v-model 绑定。
<!-- 父组件 -->
<template>
  <CustomInput v-model="message" />
</template>

<script>
import CustomInput from './CustomInput.vue';

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

多个 v-model 绑定

Vue 3 支持多个 v-model,例如 v-model:firstNamev-model:lastName

  1. 子组件定义
    为每个绑定定义对应的 prop 和事件。
<!-- 子组件 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', 'lastName'],
  emits: ['update:firstName', 'update:lastName']
}
</script>
  1. 父组件使用
    通过 v-model:propName 绑定多个值。
<!-- 父组件 -->
<template>
  <UserName 
    v-model:firstName="first" 
    v-model:lastName="last" 
  />
</template>

<script>
import UserName from './UserName.vue';

export default {
  components: { UserName },
  data() {
    return {
      first: '',
      last: ''
    }
  }
}
</script>

总结

  • Vue 2:默认通过 value prop 和 input 事件实现,可通过 model 选项自定义。
  • Vue 3:默认通过 modelValue prop 和 update:modelValue 事件实现,支持多个 v-model 绑定。
  • 核心逻辑是通过 props 接收父组件数据,并通过 emit 触发事件更新父组件数据。

vue 组件实现v model

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

相关文章

vue 实现直播

vue 实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能,通常需要结合WebRTC、RTMP或HLS等技术。以下是几种常见的实现方式: 使用WebRTC实现实时直播 WebRTC适合低延迟的实时直播场景,…

vue实现granfana

vue实现granfana

Vue 实现类似 Grafana 的仪表盘 要在 Vue 中实现类似 Grafana 的仪表盘功能,需要结合数据可视化库、状态管理和 UI 组件。以下是关键步骤和推荐工具: 数据可视化库 使用 E…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListen…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue实现视频

vue实现视频

Vue 实现视频播放的方法 在 Vue 项目中实现视频播放可以通过多种方式完成,以下是几种常见的方法: 使用 HTML5 的 <video> 标签 在 Vue 组件中直接使用 HT…