uniapp 踩坑记录 uni.$on为什么不能修改data里面的数据

前言

这个其实是个逻辑错误,还好我有个时间的参数,我才看出来是什么问题

错误的想法

我有两个页面,A页面和B页面。A页面里面是列表,B页面是详情。逻辑如下

触发uni.$emit
并打开详情页面
触发uni.$once
接受到A传过来的参数
A列表页面
B详情页面

错误1:触发顺序

要先创建监听器,再触发监听器,A直接跳到B是没有事件触发的。因为A触发的时候B还没有创建监听器。
但是因为uniapp热重置,我每次都从B页面开始测试。页面打开顺序为B->A->B。所以每次都刚好触发监听器

错误2:页面刷新

我使用路由跳转用的是uni.navigateTo。这个函数是保留当前页面,跳转到新页面。但是我的顺序是B->A->B。uni.navigateTo相同页面的时候会重新创建该页面。监听器会触发,但是触发了之后页面立刻被销毁了。所以数据好像就永远修改不了

实际执行顺序

错误顺序

1.修改代码
uniapp热重置
这个时候已经注册了监听器
2.重新回到A
3.触发监听器
打印接受到信息
因为B页面已经存在
销毁旧页面,创建新页面
A列表页面
B详情页面
新B详情页面,data数据初始化

所以每次触发,监听器都能响应,但是data数据就是不能修改

还好我有个列表的参数是创建时间,两个页面差了4s,我看控制台才看出来到底出了什么问题

"number":"TW20230531162103"//打印编号
"number":"TW20230531162107"//页面编号

还好我多看了一眼,才发现原来是两个页面

解决方法

使用全局缓存,在A页面设置缓存,在B页面调用缓存

设置全局缓存
打开B页面
A列表页面
B详情页面
尝试获得缓存数据

这里我推荐使用,uni.getStorageSync(KEY),从本地缓存中同步获取指定 key 对应的内容。外面包裹个try catch来解决报错

try{
	that.test_data = uni.getStorageSync('report_add_data')
}catch(e){
	console.log(e)
	//TODO handle the exception
}

事故总结

事件监听只能放在主页面,可以返回的页面,子页面由于启动的顺序和重复打开刷新的问题,在子页面新建的监听器永远都用不上。子传父可以用事件监听,父传子不行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值