文章目录
- 前言
- 错误的想法
- 错误1:触发顺序
- 错误2:页面刷新
- 实际执行顺序
- 解决方法
- 事故总结
前言
这个其实是个逻辑错误,还好我有个时间的参数,我才看出来是什么问题
错误的想法
我有两个页面,A页面和B页面。A页面里面是列表,B页面是详情。逻辑如下
错误1:触发顺序
要先创建监听器,再触发监听器,A直接跳到B是没有事件触发的。因为A触发的时候B还没有创建监听器。
但是因为uniapp热重置,我每次都从B页面开始测试。页面打开顺序为B->A->B。所以每次都刚好触发监听器
错误2:页面刷新
我使用路由跳转用的是uni.navigateTo。这个函数是保留当前页面,跳转到新页面。但是我的顺序是B->A->B。uni.navigateTo相同页面的时候会重新创建该页面。监听器会触发,但是触发了之后页面立刻被销毁了。所以数据好像就永远修改不了
实际执行顺序
错误顺序
所以每次触发,监听器都能响应,但是data数据就是不能修改
还好我有个列表的参数是创建时间,两个页面差了4s,我看控制台才看出来到底出了什么问题
"number":"TW20230531162103"//打印编号
"number":"TW20230531162107"//页面编号还好我多看了一眼,才发现原来是两个页面
解决方法
使用全局缓存,在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
}
事故总结
事件监听只能放在主页面,可以返回的页面,子页面由于启动的顺序和重复打开刷新的问题,在子页面新建的监听器永远都用不上。子传父可以用事件监听,父传子不行。