Vue 2 迁移到 Vue 3 时的 v-model 语法不兼容 问题,警告 Extraneous non-props attributes (modelValue)
[Vue warn]: Extraneous non-props attributes (modelValue) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.这个警告的原因是Vue 3 中v-model的语法变化与组件存在多根节点Fragment共同导致的。错误原因分析v-model默认属性名改变在 Vue 3 中组件上的v-model默认绑定的 prop 是modelValue触发的事件是update:modelValue。而你的u-dialog组件中定义的 prop 是value且触发的是input事件这是 Vue 2 的语法。产生非 prop 特性因为父组件使用了v-model实际上向子组件传递了modelValue。但子组件的props中并没有modelValue所以 Vue 把它当成了“非 prop 的特性 (non-props attribute)”。多根节点无法继承你的template中有page-meta和view两个根节点构成了 Fragment。Vue 无法将未声明的非 prop 特性自动挂载到多个根节点上因此抛出了这个警告。方案一 将组件改造为符合 Vue 3 标准的v-model推荐将组件的value改为modelValue并将触发的事件从input改为update:modelValue。1. 修改u-dialog组件的templatetemplate !-- 将 value 改为 modelValue -- page-meta :page-stylemodelValue ? overflow:hidden;height:100vh;position:fixed; : / view v-ifmodelValue !-- 下面的代码保持不变 -- view classdialog-model clickhandleMaskClose touchmove.stop.prevent(){} wheel.stop.prevent(){} !-- ... --修改u-dialog组件的scriptexport default { name: u-dailog, // 建议加上 inheritAttrs: false防止以后传入 class/style 时因多根节点再次报错 inheritAttrs: false, props: { // 将 value 改为 modelValue modelValue: { type: Boolean, default: false }, // ... 其他 props 保持不变 }, // 声明 emits (Vue 3 推荐做法) emits: [update:modelValue, cancel, confirm], data() { return {} }, // ... computed 保持不变 methods: { onCancel() { // 将 input 改为 update:modelValue this.$emit(update:modelValue, false) this.$emit(cancel) }, onConfirm() { // 将 input 改为 update:modelValue this.$emit(update:modelValue, false) this.$emit(confirm) }, handleMaskClose(){ this.maskClose this.onCancel() } } }修改后父组件的u-dialog v-modelshowDialog/u-dialog无需任何改动即可完美运行。方案二保留组件的value属性修改父组件的用法如果你不想修改u-dialog内部的 prop 名称可以利用 Vue 3 支持的v-model自定义参数特性。1. 修改父组件的调用方式给v-model加上参数:value明确告诉 Vue 绑定value属性。!-- 将 v-model 改为 v-model:value -- u-dialog v-model:valueshowDialog/u-dialog2. 修改u-dialog组件的script触发事件虽然属性名保持了value但 Vue 3 的事件触发机制变了需要将input改为update:value。methods: { onCancel() { // 将 input 改为 update:value this.$emit(update:value, false) this.$emit(cancel) }, onConfirm() { // 将 input 改为 update:value this.$emit(update:value, false) this.$emit(confirm) }, handleMaskClose(){ this.maskClose this.onCancel() } }你遇到的问题是典型的Vue 2 迁移到 Vue 3 时的v-model语法不兼容问题。建议直接采用方案一将组件彻底升级为 Vue 3 的标准写法同时加上inheritAttrs: false来规避多根节点Fragment带来的潜在特性继承警告。以 input 实现完整实例// components/u-input/u-input.vue template view classinput-wrapper !-- 用 key 强制重新渲染解决 uni-app input 值不同步的问题 -- input classuni-input :keyinputKey :placeholderplaceholder :valuemodelValue :typeinputType :passwordshowPassword inputhandleInput :maxlengthmaxlength v-bind$attrs / uni-icons v-ifshowClearIcon typeclose classuni-icon :sizeiconSize :coloriconColor clickhandleClearValue / uni-icons v-ifisPassWord classuni-icon :sizeiconSize :coloriconColor clickchangePassword :typeshowPassword ? eye-filled : eye-slash-filled / /view /template script export default { name: u-input, inheritAttrs: false, emits: [update:modelValue], props: { modelValue: { type: [String, Number], default: , }, type: { type: String, default: text, }, placeholder: { type: String, default: 请输入, }, iconSize: { type: Number, default: 20 }, //显式声明避免被 $attrs 透传出问题 maxlength: { type: [String, Number], default: -1, }, iconColor: { type: String, default: #808080 } }, data() { return { showPassword: false, showClearIcon: false, inputKey: 0, // 用于强制刷新 input }; }, computed: { isPassWord() { return this.type password || this.type safe-password; }, inputType() { return this.isPassWord ? text : this.type; } }, watch: { // 监听 value 变化保持清除按钮状态同步 modelValue: { immediate: true, handler(val) { this.showClearIcon val val.length 0; }, }, //type 变化时重置密码可见状态 isPassWord: { immediate: true, handler(val) { this.showPassword val; }, } }, methods: { handleInput(event) { const val event.detail.value; this.$emit(update:modelValue, val); this.showClearIcon val.length 0; }, handleClearValue() { this.$emit(update:modelValue, ); this.showClearIcon false; this.inputKey; }, changePassword() { this.showPassword !this.showPassword; }, }, }; /script style scoped langscss .input-wrapper { display: flex; flex-direction: row; align-items: center; width: 100%; } .uni-input { flex: 1; width: 100%; } .uni-icon { margin: 0 $uni-spacing-row-sm; } /style使用template u-input v-modeluser_phone classform-item-input typetel placeholder请输入手机号 maxlength11 /u-input /template script setup import { ref } from vue; import uInput from /components/u-input/u-input.vue const user_phone ref() /script

相关新闻

C++并查集实现与优化:从原理到面试实战

C++并查集实现与优化:从原理到面试实战

1. 项目概述:为什么并查集是面试官的“心头好”?如果你刷过一些算法题,或者正在准备技术面试,大概率会碰到“朋友圈”、“岛屿数量”、“连通网络的操作次数”这类题目。乍一看,它们可能涉及图论、搜索,但老…

2026/7/23 11:46:28 阅读更多 →
Nodejs也能写Agent - 10.LangChain篇 - 初识LangChain

Nodejs也能写Agent - 10.LangChain篇 - 初识LangChain

我尝试了很多其它开发 Agent 的 Node.js 技术栈,兜兜转转一圈下来,我发现似乎只有 LangChain.js、LangGraph.js 才是最终的归途。 Mastra 很好,如果只是做独立的 Agent 确实不错,但如果要集成到自己的系统里面去,我觉得…

2026/7/23 10:19:40 阅读更多 →
现代C++数值计算:从经典算法到高性能工程实践

现代C++数值计算:从经典算法到高性能工程实践

1. 项目概述:为什么C依然是数值计算的基石聊到数值分析,很多人的第一反应可能是Python的NumPy、SciPy,或者MATLAB。确实,这些工具在快速原型、教学和数据分析领域有着无与伦比的优势。但如果你深入到高性能计算、工业级仿真、游戏…

2026/7/23 9:37:24 阅读更多 →

最新新闻

TM4C1299寄存器配置实战:LCD时钟与PWM模块深度解析

TM4C1299寄存器配置实战:LCD时钟与PWM模块深度解析

1. 项目概述:从寄存器手册到实战配置如果你正在使用TI的Tiva™ C系列微控制器,尤其是像TM4C1299NCZAD这样功能强大的型号,那么你肯定绕不开一件事:啃数据手册,然后配置寄存器。手册里那些密密麻麻的表格和位域描述&…

2026/7/23 18:08:26 阅读更多 →
深入解析PWM中断与触发机制:精准时序控制与ADC同步采样实战

深入解析PWM中断与触发机制:精准时序控制与ADC同步采样实战

1. 项目概述与核心价值在嵌入式开发,尤其是电机控制、数字电源、LED调光这些对时序精度要求极高的领域,PWM(脉冲宽度调制)模块的灵活性和精准度直接决定了系统的性能上限。很多开发者对PWM的理解还停留在“配置频率和占空比”的初…

2026/7/23 18:08:26 阅读更多 →
适配家装工程:2026断桥铝门窗十大品牌名录

适配家装工程:2026断桥铝门窗十大品牌名录

断桥铝系统门窗是现代建筑装修中常用的门窗类型,凭借结构稳定、适用性广的特点,广泛应用于各类建筑改造与新建场景。国内门窗行业经过多年发展,形成了多家具备生产体系的企业。本文基于行业整体现状,整理十家主流断桥铝门窗企业信…

2026/7/23 18:08:26 阅读更多 →
【Buildroot】学习记录(1)简介与理论

【Buildroot】学习记录(1)简介与理论

文章目录源码获取其他的构建工具源码获取 官网下载Github 下载 git下载&#xff1a;git clone https://github.com/buildroot/buildroot.git -b 2020.02.x 其他的构建工具 项目名称优点缺点软件包数量其他描述Busybox简单容易上手适合构建简单的文件系统< 20构建最小文件…

2026/7/23 18:08:26 阅读更多 →
C/C++语言输出带颜色

C/C++语言输出带颜色

命令后界面输出颜色 嵌入式终端界面输出日志时&#xff0c;为了区分输出的有用信息、错误信息&#xff0c;可以给不同级别的输出加上不同的颜色&#xff0c;以方便查看。 下面是颜色的定义 /*************************************************************************> …

2026/7/23 18:08:26 阅读更多 →
两种包装运输振动试验标准拆解:GB/T 4857.23-2021与ISO 13355:2016区别

两种包装运输振动试验标准拆解:GB/T 4857.23-2021与ISO 13355:2016区别

日常快递、整车货运路上持续颠簸&#xff0c;很容易震坏外包装和内部产品&#xff0c;垂直随机振动试验就是在实验室复刻运输震动&#xff0c;提前验证包装的抗振能力。 ISO 13355:2016 是全球通用国际范本&#xff0c;面向全世界所有国家&#xff0c;只定下基础试验底层逻辑&a…

2026/7/23 18:07:26 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从单点好评到指数级传播&#xff1a;AI副业主理人必须掌握的4层口碑渗透模型&#xff08;含ROI测算表&#xff09; 当AI副业主理人不再仅满足于单次服务交付&#xff0c;而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI写作开头钩子设计&#xff1a;为什么你的AI文案完读率不足18%&#xff1f;——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后&#xff0c;我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南&#xff1a;免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻