0

0

Vue 3 中实现父子组件间 select 输入框的双向绑定(v-model)

碧海醫心

碧海醫心

发布时间:2026-02-16 11:53:03

|

791人浏览过

|

来源于php中文网

原创

Vue 3 中实现父子组件间 select 输入框的双向绑定(v-model)

本文详解如何在 Vue 3 组合式 API 中,通过 v-model 将父组件中的响应式状态(如 user.favoriteColor)与可复用的 SelectInput 子组件进行双向绑定,确保选择值实时同步且符合 Vue 最佳实践。

本文详解如何在 vue 3 组合式 api 中,通过 `v-model` 将父组件中的响应式状态(如 `user.favoritecolor`)与可复用的 `selectinput` 子组件进行双向绑定,确保选择值实时同步且符合 vue 最佳实践。

在 Vue 3 中,v-model 不再是语法糖的简单替代,而是基于 modelValue prop 和 update:modelValue 事件的标准化双向绑定机制。要让自定义

✅ 正确实现步骤

1. 父组件:使用 v-model 绑定响应式字段

在 Home.vue 中,直接将 user.favoriteColor 作为 v-model 值传入,无需额外 props:

<!-- Home.vue -->
<script setup>
import { ref } from 'vue'
import SelectInput from './SelectInput.vue'

const user = ref({
  name: '',
  favoriteColor: '' // 初始值为空字符串,与 select 的 placeholder 一致
})

const selectOptions = ref(['red', 'green', 'blue', 'white', 'black'])
</script>

<template>
  <div class="user-input-container">
    <div class="user-input">
      <p>Favorite Color</p>
      <!-- ✅ 使用 v-model 绑定深层响应式属性 -->
      <SelectInput v-model="user.favoriteColor" :options="selectOptions" />
      <!-- 注意:此处不再传 selectOptions 作为 selectOptions prop,而是重命名为更语义化的 options -->
    </div>
  </div>
</template>

? 提示:v-model 默认绑定 modelValue prop 并监听 update:modelValue 事件。若需自定义绑定名(如 v-model:color),可在子组件中通过 defineModel()(Vue 3.4+)或手动声明 modelValue + update:modelValue 实现。

立即学习前端免费学习笔记(深入)”;

芦笋演示
芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

下载

2. 子组件:支持 v-model 的 SelectInput.vue

修改 SelectInput.vue,使其具备受控组件能力:

<!-- SelectInput.vue -->
<script setup>
import { defineProps, defineEmits } from 'vue'

// ✅ 接收 modelValue(v-model 的默认值)和 options(选项列表)
const props = defineProps({
  modelValue: {
    type: String,
    default: ''
  },
  options: {
    type: Array,
    required: true,
    default: () => []
  }
})

// ✅ 声明 update:modelValue 事件
const emit = defineEmits(['update:modelValue'])

// ✅ 处理 select 变更:同步 emit 新值
const handleChange = (e) => {
  emit('update:modelValue', e.target.value)
}
</script>

<template>
  <select 
    :value="modelValue" 
    @change="handleChange"
    class="select-input"
  >
    <option disabled value="">Please select one</option>
    <option 
      v-for="option in options" 
      :key="option" 
      :value="option"
    >
      {{ option }}
    </option>
  </select>
</template>

<style scoped>
.select-input {
  padding: 0.5rem;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 1rem;
}
</style>

? 关键点解析:

  • :value="modelValue" 使
  • @change="handleChange" 捕获用户选择后,主动调用 emit('update:modelValue', ...) 通知父组件更新;
  • defineProps 显式声明类型与默认值,增强组件健壮性与 IDE 支持;
  • options prop 命名比 selectOptions 更简洁通用,利于组件复用(如也可用于 封装)。

3. 进阶建议:添加 name 和 id 支持表单集成

若组件需参与原生表单提交或无障碍访问(a11y),可扩展 props:

// 在 defineProps 中追加
name: { type: String, default: '' },
id: { type: String, default: () => 'select-' + Math.random().toString(36).substr(2, 9) }

并在

<select 
  :id="id"
  :name="name"
  :value="modelValue"
  @change="handleChange"
>

⚠️ 注意事项与常见误区

  • 不要在子组件内直接修改 modelValue:modelValue 是只读 prop,直接赋值会触发 Vue 警告(Set operation on key 'xxx' failed: target is readonly);
  • 避免使用 .sync 或自定义事件名(如 @input):Vue 3 已废弃 .sync,且 v-model 的标准化机制更清晰、可维护;
  • 确保初始值类型匹配:modelValue 类型应与 options 元素类型一致(本例均为 string),否则下拉项可能无法高亮选中;
  • 空值处理:当 modelValue 为 null 或 undefined 时,:value 绑定仍能正常工作,但建议初始化为 '' 以保持一致性。

✅ 总结

通过 v-model 实现 SelectInput 的双向绑定,本质是遵循 Vue 的“props down, events up”数据流原则:父组件提供状态(down),子组件通过事件反馈变更(up)。该模式不仅适用于

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

244

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

746

2024.03.01

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5621

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

3205

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

1164

2025.12.25

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

193

2023.11.24

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

148

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

104

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 8.4万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号