当前位置:首页 > 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

vue 组件实现v model

  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
分享给朋友:

相关文章

实现 vue 框架

实现 vue 框架

Vue 框架的基本实现 Vue 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现 Vue 框架的基本步骤和核心概念。 核心概念 响应式数据绑定 Vue 的核心特性之一是响应式数…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例:…

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue实现答题

vue实现答题

Vue 实现答题功能 数据结构设计 使用 Vue 的响应式特性管理题目和答案数据。通常需要以下数据结构: data() { return { questions: [ {…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click 绑…