当前位置: 首页 > news >正文

vue3中v-model 用法详解

一、v-model的本质

v-model本质上是一个语法糖,用于实现:

  • 父组件向子组件传值

  • 子组件向父组件回传更新

在 Vue 3 中,v-model默认等价于:

:modelValue="xxx" @update:modelValue="xxx = $event"

二、基础用法(表单元素)

1. 文本输入框

<input v-model="username" />

等价于:

<input :value="username" @input="username = $event.target.value" />

2. 常见表单绑定

表单类型示例
text<input v-model="text" />
checkbox<input type="checkbox" v-model="checked" />
radio<input type="radio" value="A" v-model="picked" />
select<select v-model="selected">
textarea<textarea v-model="msg"></textarea>

三、组件上的v-model(核心重点)

1. Vue 3 默认规则(强烈推荐)

子组件
<script setup> defineProps({ modelValue: String }) const emit = defineEmits(['update:modelValue']) </script> <template> <input :value="modelValue" @input="emit('update:modelValue', $event.target.value)" /> </template>
父组件
<Child v-model="username" />

2. 等价展开写法(理解用)

<Child :modelValue="username" @update:modelValue="username = $event" />

四、自定义v-model参数(Vue 3 新特性)

1. 父组件

<Child v-model:title="title" />

2. 子组件

<script setup> defineProps({ title: String }) const emit = defineEmits(['update:title']) </script> <template> <input :value="title" @input="emit('update:title', $event.target.value)" /> </template>

五、多个v-model(非常实用)

父组件

<Child v-model:title="title" v-model:content="content" />

子组件

<script setup> defineProps({ title: String, content: String }) const emit = defineEmits([ 'update:title', 'update:content' ]) </script>

六、v-model修饰符(.trim/.number等)

1. 使用方式

<Child v-model:title.trim="title" />

2. 子组件接收修饰符

<script setup> const props = defineProps({ title: String, titleModifiers: { default: () => ({}) } }) </script>

3. 使用修饰符

if (props.titleModifiers.trim) { value = value.trim() }

七、在computed中使用v-model(双向绑定)

const value = computed({ get() { return props.modelValue }, set(val) { emit('update:modelValue', val) } })

模板中直接使用:

<input v-model="value" />

八、v-model与 Vue 2 的核心差异

项目Vue 2Vue 3
默认 propvaluemodelValue
默认事件inputupdate:modelValue
多 v-model不支持支持
修饰符内置可自定义
语法固定更灵活

九、最佳实践(工程经验)

  1. 组件统一使用modelValue

  2. 始终通过emit修改值

  3. 避免在子组件中直接修改 props

  4. 多字段表单优先使用多个 v-model

  5. 复杂逻辑用computed封装 v-model


十、完整示例(可直接复制)

父组件

<script setup> import { ref } from 'vue' import MyInput from './MyInput.vue' const username = ref('') </script> <template> <MyInput v-model="username" /> <p>{{ username }}</p> </template>

子组件MyInput.vue

<script setup> defineProps({ modelValue: String }) const emit = defineEmits(['update:modelValue']) </script> <template> <input :value="modelValue" @input="emit('update:modelValue', $event.target.value)" /> </template>
http://www.cnnetsun.cn/news/92355.html

相关文章:

  • YOLO目标检测入门:手把手教你跑通第一个demo
  • 1小时搭建:VSCode远程开发环境原型
  • 电商项目实战:Vue3父子组件传值最佳实践
  • 【LLM基础教程】从序列切分到上下文窗口01_为什么序列建模必须切分数据
  • 备赛三--
  • 高并发时代的“确定性”挑战——为何稳定性正在成为 JVM 的下一场核心竞争?
  • C语言之最大公约数和最小公倍数问题
  • LobeChat能否对接Telegram Bot?跨平台消息同步实现
  • AI如何用博图加速工业自动化开发
  • C++:二叉搜索树(BST)完全指南(从概念原理、核心操作到底层实现)
  • Splashtop AEM 在 G2冬季报告中斩获“最佳预估 ROI”殊荣
  • 赋能传统硬件:具身智能如何激活工业机器人的二次生命
  • 【模板:求组合数】信息学奥赛一本通 1648:【例 1】「NOIP2011」计算系数 | 1866:【11NOIP提高组】计算系数 | 洛谷 P1313 [NOIP 2011 提高组] 计算系数
  • 金运环球:金价高位回落,非农与零售数据即将来袭
  • 活动力度大的门头招牌企业
  • 【毕业设计】基于JavaWeb的兽医站管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • Java毕设选题推荐:基于JavaWeb的兽医站管理系统的设计与实现现代化兽医站管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Arduino配置8266开发板
  • 【课程设计/毕业设计】基于SpringBoot+Vue茶叶销售系统的设计与实现基于Java语言的茶叶销售系统的前端设计与实现【附源码、数据库、万字文档】
  • 41. 缺失的第一个正数
  • 打了一堆板子,才发现是VDD_EXT的锅
  • 技术亲民倒计时!飞猫 RedCap 轻量化 5G 随身 WiFi 即将上市!
  • # 深入 Ascend C 内存模型:掌握UB、GM与流水线优化,打造极致AI算子
  • 冥想第一千七百三十五天(1735)
  • 代理IP和普通IP有什么区别?这篇文章帮你捋明白
  • 体系结构分类和指令系统
  • 基于AI数字人系统源码的低成本开发方案与实践经验
  • SQL 调优全解:从 20 秒到 200 ms 的 6 步实战笔记(附脚本)
  • YOLO目标检测模型如何对接Apipost平台
  • 简单的创建一个Spring Boot网页