uni-app 子窗体使用$on无法给data赋值
uni-app 子窗体使用$on无法给data赋值
示例代码:
附件中
操作步骤:
附件中
预期结果:
正常改变
实际结果:
无法改变
bug描述:
定义全局子窗由于每个页面都会初始化子窗,导致每个页面都会注册$on监听,导致子窗无法更新data中的数据(如果是这样的是这个子窗真的很鸡肋啊完全没法用啊,只能做一个简单的模态框甚至都有问题)我已经在uni.$on之前调了uni.$off但还是无效。这也没法获取上个页面栈,完全没法用啊。
| 信息类别 | 详细信息 |
|---|---|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC系统版本 | win10 |
| HBuilderX | 正式 |
| HBuilderX版本 | 3.2.11 |
| 手机系统 | Android |
| 手机系统版本 | Android 11 |
| 手机厂商 | 华为 |
| 手机机型 | 红米k40 |
| 页面类型 | vue |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于uni-app 子窗体使用$on无法给data赋值的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
作用域的问题,我最后把子窗体放在首页了
这个问题通常是由于全局事件监听在多个页面重复注册导致的。以下是解决方案:
- 在子窗体组件中使用唯一标识:
// 子窗体组件中
export default {
data() {
return {
eventKey: 'customEvent_' + Date.now() + Math.random()
}
},
mounted() {
uni.$on(this.eventKey, this.handleEvent)
},
beforeDestroy() {
uni.$off(this.eventKey, this.handleEvent)
},
methods: {
handleEvent(data) {
// 处理数据赋值
this.someData = data
}
}
}
- 使用页面栈管理事件:
// 在需要通信的页面
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
const eventKey = `event_${currentPage.route}`
// 发送事件
uni.$emit(eventKey, data)
// 子窗体中监听特定页面的事件
uni.$on(eventKey, (data) => {
this.targetData = data
})
- 使用Vuex状态管理替代事件通信:
// store中定义状态
state: {
subWindowData: null
}
// 子窗体中watch监听store变化
watch: {
'$store.state.subWindowData': function(newVal) {
this.localData = newVal
}
}
- 使用ref直接操作子窗体:
// 父页面中
<sub-window ref="subWin"></sub-window>
// 调用方法
this.$refs.subWin.updateData(data)
// 子窗体中定义方法
methods: {
updateData(data) {
this.targetData = data
}
}

