如何在自定义组件中使用v-model实现双向绑定
在 Vue 2 中,v-model 是双向数据绑定的语法糖,它默认将 value 作为 prop 传入组件,并通过监听 input 事件来更新父组件的数据。若要在自定义组件中实现 v-model 的双向绑定,需遵循以下步骤:
1. 基本实现:value + input 事件
自定义组件(ChildComponent.vue)
<template><input :value="value" @input="$emit('input', $event.target.value)">
</template><script>
export default {props: {value: { // 必须命名为 valuetype: String,default: ''}}
};
</script>
父组件(ParentComponent.vue)
<template><ChildComponent v-model="message" /><p>父组件数据:{{ message }}</p>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {message: 'Hello Vue 2'};}
};
</script>
原理:
- v-model=“message” 等价于 :value=“message” @input=“message = $event”。
- 子组件通过 props.value 接收父组件传递的值。
- 子组件在输入时触发 $emit(‘input’, newValue),更新父组件的 message。
2. 自定义 prop 和事件名(使用 model 选项)
如果不想使用默认的 value prop 和 input 事件,可以通过 model 选项自定义:
自定义组件(ChildComponent.vue)
<template><input :checked="checked" @change="$emit('change', $event.target.checked)">
</template><script>
export default {model: {prop: 'checked', // 自定义 prop 名event: 'change' // 自定义事件名},props: {checked: { // 与 model.prop 一致type: Boolean,default: false}}
};
</script>
父组件(ParentComponent.vue)
<template><ChildComponent v-model="isChecked" /><p>是否选中:{{ isChecked }}</p>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {isChecked: false};}
};
</script>
说明:
model 选项允许将 v-model 绑定到自定义的 prop(如 checked)和事件(如 change)。
父组件仍可直接使用 v-model,无需额外修改。
3. 处理复杂数据类型
若需要绑定对象或数组,直接在子组件中修改引用类型的 prop 可能导致副作用。推荐通过事件传递新值:
自定义组件(ObjectChild.vue)
<template><div><input v-model="localValue.name" @input="updateValue"><input v-model="localValue.age" @input="updateValue"></div>
</template><script>
export default {props: {value: { // 接收对象类型的 valuetype: Object,default: () => ({})}},data() {return {localValue: { ...this.value } // 复制 prop 到局部变量};},methods: {updateValue() {this.$emit('input', { ...this.localValue }); // 触发事件传递新对象}}
};
</script>
父组件(ParentComponent.vue)
<template><ObjectChild v-model="user" /><p>用户信息:{{ user }}</p>
</template><script>
import ObjectChild from './ObjectChild.vue';export default {components: { ObjectChild },data() {return {user: { name: 'Alice', age: 25 }};}
};
</script>
4. 注意事项
避免直接修改 prop:
- Vue 中 prop 是单向数据流,直接修改 this.value 会导致警告。应通过触发事件让父组件更新数据。
深拷贝问题:
- 若 prop 是对象或数组,直接赋值 localValue = this.value 会导致浅拷贝。需使用扩展运算符或
JSON.parse(JSON.stringify()) 深拷贝。
性能优化:
- 频繁触发 input 事件可能影响性能,可通过防抖(debounce)或节流(throttle)优化。
总结
在 Vue 2 中,自定义组件的 v-model 实现依赖两个核心机制:
- 接收 value prop:用于初始化组件内部状态。
- 触发 input 事件:将新值传递回父组件。
通过 model 选项,可以灵活定义 prop 和事件名,适应不同场景需求。对于复杂数据类型,需谨慎处理数据的复制和更新,避免直接修改prop。
如果你有任何问题或想法,欢迎在评论区留言讨论。
相关文章:
如何在自定义组件中使用v-model实现双向绑定
在 Vue 2 中,v-model 是双向数据绑定的语法糖,它默认将 value 作为 prop 传入组件,并通过监听 input 事件来更新父组件的数据。若要在自定义组件中实现 v-model 的双向绑定,需遵循以下步骤: 1. 基本实现:va…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_pool_t 类型
ngx_pool_t 定义在 src/core/ngx_core.h typedef struct ngx_pool_s ngx_pool_t; ngx_pool_s 定义在 src/core/ngx_palloc.h struct ngx_pool_s {ngx_pool_data_t d;size_t max;ngx_pool_t *current;ngx_chain_t *chain;ng…...
如何在 ubuntu 上使用 Clash 与 docker 开启代理拉起
如何在 ubuntu 上使用 Clash https://github.com/doreamon-design/clash/releases上面是clash 的地址 clash_2.0.24_linux_386.tar.gz 下载 386 的 如果你的电脑是inter tar -xzvf clash_2.0.24_linux_386.tar.gz 启动 ./clash 然后会在电脑上生成一个config的文件 /home/xxx/…...
linux tcpdump抓包
参数说明: -i 指定网卡 -w 指定保存文件 -s0 完整抓包 -G 指定间隔时长(秒) -C 指定每个文件大小(M) 用法1: 指定端口输出到指定文件 tcpdump -i em3 -w 182910.pcap 用法2: 指定端口每10分钟输出到不同文件 tcpdump -i em3 -s0 -G 600 -w %Y_%m%d_%H%M_%S.pcap 用法3: 指…...
PLSQL连接Oracle 19c报错ORA-28040
PLSQL连接Oracle 19c报错ORA-28040 原因解析解决办法原因解析 使用PLSQL Developer连接19c数据库报错: ORA-28040: No matching authentication protocol报错信息解析: [oracle@ora19c ~]$ oerr ora 2804028040, 0000, "No matching authentication protocol" /…...
汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常
故障现象 一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…...
音视频入门基础:RTP专题(9)——FFmpeg接收RTP流的原理和内部实现
一、引言 由《音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流》可以知道,推流端通过下面FFmpeg命令可以将一个媒体文件转推RTP,生成RTP流: ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec cop…...
Nginx 安装及配置教程(Windows)【安装】
文章目录 一、 Nginx 下载 1. 官网下载2. 其它渠道 二、 Nginx 安装三、 配置四、 验证五、 其它问题 1. 常用命令2. 跨域问题 软件 / 环境安装及配置目录 一、 Nginx 下载 1. 官网下载 安装地址:https://nginx.org/en/download.html 打开浏览器输入网址 htt…...
《跟李沐学 AI》AlexNet论文逐段精读学习心得 | PyTorch 深度学习实战
前一篇文章,使用 AlexNet 实现图片分类 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于学习 9年后重读深度学习奠基作之一:AlexNet【下】【论文精读】】的心得。 《跟李沐…...
嵌入式0xDEADBEEF
在嵌入式系统中,0xDEADBEEF 是一个常见的“魔数”(magic number),通常用于调试和内存管理。它的含义和用途如下: 1. 调试用途 未初始化内存的标记:在调试时,0xDEADBEEF 常用于标记未初始化或已…...
B+树作为数据库索引结构的优势对比
MySQL作为数据库,它的功能就是做数据存储和数据查找;使用B树作为索引结构是为了实现高效的查找、插入和删除操作。 B树的查找、插入、删除的复杂度都为 O(log n),它是一个多叉树的结构,能兼顾各种操作的效率的数据结构。如果使用…...
自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
在Oracle Database 12c Release 1 (12.1)版本中,引入了对SQL计划管理(SPM)功能的增强,特别是关于SQL计划基线的自动进化机制。这一改进允许数据库更加智能地管理和优化SQL查询的执行计划,确保即使数据分布发生变化&…...
什么是DeFi (去中心化金融)
DeFi (去中心化金融) 概述 💰 1. DeFi 基础概念 1.1 什么是 DeFi? DeFi 是建立在区块链上的金融服务生态系统,它: 无需中心化中介开放且透明无需许可即可参与代码即法律 1.2 DeFi 的优势 开放性:任何人都可以参与…...
计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
LLM论文笔记 15: Transformers Can Achieve Length Generalization But Not Robustly
Arxiv日期:2024.2.14机构:Google DeepMind / University of Toronto 关键词 长度泛化位置编码数据格式 核心结论 1. 实验结论:十进制加法任务上的长度泛化最佳组合: FIRE位置编码 随机化位置编码 反向数据格式 索引提示&…...
SpringAI做对了什么
开发|界面|引擎|交付|副驾——重写全栈法则:AI原生的倍速造应用流 你好,这里是nine[谈架构]系列。 欢迎关注评论私信交流~ SpringAI 在 AI 编程领域延续了Spring的诸多优势,从易于集成、到通用…...
DeepSeek预测25考研分数线
25考研分数马上要出了。 目前,多所大学已经陆续给出了分数查分时间,综合往年情况来看,每年的查分时间一般集中在2月底。 等待出成绩的日子,学子们的心情是万分焦急,小编用最近爆火的“活人感”十足的DeepSeek帮大家预…...
C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector
C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector code review! 文章目录 C++笔记之标准库中的std::copy 和 std::assign 作用于 std::vector1. `std::copy`1.1.用法1.2.示例2.`std::vector::assign`2.1.用法2.2.示例3.区别总结4.支持assign的容器和不支持ass…...
文件IO(20250217)
1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...
Django5 实用指南(四)URL路由与视图函数
4.1 Django5的URL路由系统 Django 的 URL 路由系统是其核心组件之一,它负责将用户的 HTTP 请求(即 URL)映射到相应的视图函数上。每当用户在浏览器中访问某个 URL 时,Django 会根据项目的 URL 配置文件(urls.py&#…...
【WinForm UI控件系列】散点图/折线图控件 (支持数值型、时间型、字符串型)
前言:c# winform UI控件系列(Net6),纯GDI绘图无依赖,虽然做不到最好,争取做好更好用!一、效果图 (x轴三种类型:数值、时间、字符串)支持五种颜色风格。标题&a…...
2026 AI搜索优化必看:这5款工具亲测有效
GEO(Generative Engine Optimization,生成式引擎优化)已经成为2026年数字营销领域最重要的技术方向之一。本文从功能完整性、AI模型支持、易用性和性价比四个技术维度,对当前国内外主流的GEO优化工具进行了深度评测和对比分析。1.…...
别再死记硬背了!用STM32F103的TIM1高级定时器驱动舵机,这份代码和思路直接拿走
STM32F103高级定时器实战:TIM1驱动舵机的工程化实现 引言:从理论到实践的跨越 当你第一次拿到STM32开发板时,那些密密麻麻的定时器参数是否让你望而生畏?作为嵌入式开发中最核心的外设之一,定时器的灵活运用往往是区分…...
终极指南:如何用MAA明日方舟助手彻底解放你的游戏时间
终极指南:如何用MAA明日方舟助手彻底解放你的游戏时间 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://git…...
KoboldAI本地部署指南:零代码实现私有化AI写作助手
KoboldAI本地部署指南:零代码实现私有化AI写作助手 【免费下载链接】KoboldAI-Client For GGUF support, see KoboldCPP: https://github.com/LostRuins/koboldcpp 项目地址: https://gitcode.com/gh_mirrors/ko/KoboldAI-Client 在数据隐私日益重要的今天&a…...
Qwen3.5-4B-AWQ一文详解:AWQ量化原理+Qwen3.5架构适配技术解析
Qwen3.5-4B-AWQ一文详解:AWQ量化原理Qwen3.5架构适配技术解析 1. 模型概述 Qwen3.5-4B-AWQ-4bit是阿里云通义千问团队推出的轻量化大语言模型,基于Qwen3.5 4B稠密模型通过AWQ量化技术实现4bit压缩。该模型在保持高性能的同时大幅降低资源需求ÿ…...
基于ASP.NET Core的医院不良事件管理系统的架构设计
基于ASP.NET Core的医院不良事件管理系统的架构设计 前言 医院不良事件管理是医疗质量安全管理的重要环节,一个优秀的不良事件管理系统需要覆盖事件上报、审核追踪、分析统计的完整闭环。本文将详细介绍如何基于ASP.NET Core构建一个完整的医院不良事件管理系统&…...
手把手教你搞定Elsevier投稿:从LaTeX编译到PDF检查的保姆级避坑指南
手把手教你搞定Elsevier投稿:从LaTeX编译到PDF检查的保姆级避坑指南 第一次用LaTeX向Elsevier投稿的研究者,往往会在文件打包和格式校验环节遭遇"隐形陷阱"。我曾亲眼见证一位博士生在截稿前3小时因PDF乱码而崩溃——问题竟出在一个未被编译的…...
嵌入式固件烧录总失败?VSCode 2026新插件已上线,自动识别芯片ID、修复Flash校验偏移、智能重试机制全解析
更多请点击: https://intelliparadigm.com 第一章:VSCode 2026嵌入式烧录插件发布背景与核心价值 随着 RISC-V 生态爆发式增长与多核异构 MCU(如 NXP i.MX RT117x、ESP32-H2、GD32V 系列)在工业物联网与边缘 AI 场景的深度落地&a…...
TIDAL Downloader Next Generation终极指南:一键获取无损音乐库
TIDAL Downloader Next Generation终极指南:一键获取无损音乐库 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 在流媒体音乐时…...
