父组件通过props传值给子组件,需用:prop="value"动态绑定;子组件须显式声明props;子组件用$emit('event-name')回传,事件名用短横线;兄弟组件用uni.$emit/uni.$on通信;v-model需配合modelvalue和update:modelvalue实现。

父组件怎么把数据传给子组件:用 props,但绑定写法容易错
uni-app 里父传子只靠 props,没别的路。关键不是“能不能”,而是“怎么绑才生效”。常见错误是漏掉冒号或写成字符串字面量:
-
:title="parentTitle"✅ 动态绑定,值随data变化实时更新 -
title="parentTitle"❌ 静态字符串,永远传入字面量 "parentTitle" -
:title="{{parentTitle}}"❌ Vue2 旧写法已废弃,uni-app(尤其 Vue3 版本)会直接报错或静默失败
子组件接收时,props 必须显式声明。不声明就直接在模板里用 {{title}},开发时可能不报错,但 H5 端正常、小程序端白屏是常事——因为各端对未声明 props 的容错策略不同。
子组件怎么把数据回传给父组件:用 $emit,但事件名别用驼峰
子组件调用 this.$emit('update-data', payload) 向上抛事件,父组件用 @update-data="handler" 监听。这里最容易踩的坑是事件名用了大写字母或短横线外的符号:
-
this.$emit('updateData', ...)❌ 在微信小程序中会被转成小写,父组件监听@updatedata才能收到,极难排查 -
this.$emit('update_data', ...)❌ 某些平台对下划线支持不稳定,建议统一用短横线 -
this.$emit('update-data', ...)✅ 全平台兼容,父组件写@update-data即可
另外,别在子组件 data 里重复定义和 props 同名的变量,否则会造成响应式丢失——Vue 会警告 “Avoid mutating a prop directly”,但 uni-app 某些版本只是静默忽略修改。
兄弟组件怎么通信:不用 EventBus,优先用 uni.$emit / uni.$on
uni-app 官方提供了跨组件通信的轻量方案:uni.$emit 和 uni.$on,比手写 EventBus 更可靠,也不用额外引入或管理实例生命周期。
- 发送方(A 组件):
uni.$emit('sync-user-info', { name: 'Tom' }) - 接收方(B 组件):
uni.$on('sync-user-info', handler),且必须在onLoad或mounted中注册 - ⚠️ 注意:页面卸载前(
onUnload或beforeUnmount)必须调用uni.$off('sync-user-info'),否则事件监听器残留,导致多次触发
不推荐用 Vue2 风格的全局 new Vue() 做 EventBus,uni-app 多端编译时对原型链扩展支持不一,App 端可能正常,H5 端却报 Cannot read property '$on' of undefined。
为什么 v-model 在自定义组件里不生效:得配合 modelValue + update:modelValue
在 Vue3 的 uni-app 项目中,想让子组件支持 v-model,不能只靠 props.value 和 $emit('input') 这套老逻辑。必须按 Vue3 规范来:
- 子组件
props声明modelValue(类型要匹配,比如String或Number) - 子组件内部用
v-bind:value="modelValue"或直接{{ modelValue }} - 触发变更时,用
this.$emit('update:modelValue', newValue) - 父组件写
<my-input v-model="searchText"></my-input>就能双向绑定
如果仍沿用 Vue2 的 value + input,H5 端可能凑合能用,但微信/支付宝小程序会完全忽略 v-model,变成单向显示——这个细节在真机调试前根本看不出来。











