需求:页面a、b、c,并且a=>b=>c,b和c都有自定义返回按钮,c页面需要在页面返回(物理返回按钮或者自定义返回按钮)前给提示,并且每一个页面只能返回到它的入口页
解决方案:在onLoad里面pushState, onShow监听popstate
问题:
1、a navigateTo
b,b navigateTo
c,在c自定义返回按钮点击的回调函数是popstate的回调函数,点击自定义按钮并且确认离开uni.navigateBack,页面闪一下它会返回当前页面,我理解是pushstate添加了一个历史记录就有了两个记录,back的时候回第一个记录了,于是我uni.navigateBack({ delta:2 }),这时候它可以回到b页面了,但是物理返回按钮返回却直接跳到a页面了,同一个回调函数为什么会有这样的情况?
2、a navigateTo
b,b redirectTo
c,返回方法改为uni.redirectTo,c=>b=>a全程使用物理返回按钮返回功能正常,
①当我在c使用自定义返回按钮返回,会去到b,
②b用物理返回按钮返回时,b会去到c,
③c这时候如果用物理返回按钮会回到b,
④再物理返回按钮会回到a,
我的理解:①之前的历史记录是[a,c,c],①之后变成[a,c,b],
②之后变成[a,c],③之后变成[a,b],④之后变成[a],
而如果在③用自定义按钮返回,③④会无限循环,
为什么全程物理返回按钮没问题,加入了自定义返回按钮的操作就变的不一样了?
3、在2的问题上,我在b也监听popstate,强行让页面跳到a,这时候a物理返回在一些情况会去到b,一些情况去到c,就更复杂了,不描述。
4、在3的问题上,我在a也监听popstate,这时候其它不监听popstate的页面回到a的时候,a会被重新加载等于location.href,这时候首页store缓存的数据就每没有缓存的作用了,把其它没监听的页面都加上popstate监听就不会出现这个问题。
onHide() {
// 卸载监听
window.removeEventListener('popstate', this.goBack);
},
beforeDestroy() {
// 卸载监听
window.removeEventListener('popstate', this.goBack);
},
onUnload(){
// 卸载监听
window.removeEventListener('popstate', this.goBack);
},
async onLoad(option) {
this.$historyUrl();
}
async onShow() {
window.addEventListener('popstate', this.goBack);
}
async goBack() {
this.modalType = 2;
this.showBox = true;
const res = await new Promise(resolve => {
uni.$on('leave', (res) => { // 监听是否离开弹窗点击按钮
resolve(res)
});
})
if (!res) {
this.$historyUrl();
} else{
uni.redirectTo({
url: redirectMap[this.subType]
})
}
this.showBox = false;
},
有没有其它方案解决这个需求?