一、问题背景:
两个页面多次来回点击后循环跳转,返回时会一层一层返回重复的页面,想避免这种情况,在安卓中可以设置页面的启动模式,uniapp我不知道有没有设置启动模式这种方法。
1、与别人的聊天页面可以点击头像跳转个人主页,个人主页中也可以点击聊天进入和他的聊天页面。设聊天页面为a页面,个人主页为b页面。
2、应用中可以从某个不确定页面跳转到a,再从a到b...(情况一),也可以从某个不确定页面先跳转到b,再跳转到a....(情况二)。
二、两种情况的预期效果:
情况一:c a b a b a ==> c a b
从c跳转到a,再到b,再到a b a ....循环跳转后,如果当前在a页面时,点击返回回到c,如果当前在b页面,点击返回回到a,再点返回回到c。
情况二:d b a b a b ==> d b a
从d跳转到b,再到a,再到b a b ....循环跳转后,如果当前在b页面时,点击返回回到d,如果当前在a页面,点击返回回到b,再点返回回到d。
三、分析:
通过getCurrentPages()判页面栈里的页面,
在a页面中:判断栈中如果a页面先进来,b页面再进来,就是情况一,此时a到b,就用uni.navigateTo正常跳(如果此时栈中还没有b,也是此方法)。如果栈中是b页面先进来,a页面再进来,就是情况二,此时a到b,就用uni.navigateBack返回的方式实现页面切换。
在b页面中:同上分析
四、解决方法:
在a页面:a跳b时(没有b是正常跳b):如果第一个a在第一个b前面,就是一,正常跳,如果第一个a在第一个b后面,就是二,直接返回。
在b页面:b跳a时(没有a是正常跳a):如果第一个b在第一个a前面,就是二,正常跳,如果第一个b在第一个a后面,就是一,直接返回
五、其他:
也可以通过从不同页面传递一个变量到a、b中区分这两种情况,然后执行不同的跳转,但我觉得这还得去修改其他页面,不利于扩展。就直接改这两个页面,不用动其他页面。
但官方文档建议:
注意: getCurrentPages()仅用于展示页面栈的情况,请勿修改页面栈,以免造成页面状态错误。
用了下感觉没啥问题就先这样用了。
六、代码:
聊天页面:
//去个人主页
toPerson(user){
//获取页面栈中所有页面
let pages = getCurrentPages()
//如果想打印直接这样打印,不要加什么拼接字符串、JSON.stringify()什么的
console.log(getCurrentPages());
//栈中页面的路径单独保存为数组,方便后续比较
let pageUrl = []
for (let i = 0; i < pages.length; i++) {
//pages[i].$page.fullPath 是页面的全路径,会连页面传递的参数都打印出来,不方便后续比较
// console.log("第"+i+"个页面 = " + pages[i].$page.fullPath);
console.log("第"+i+"个页面 = " + pages[i].route);
//用pages[i].route就比较单纯了
pageUrl.push(pages[i].route)
}
//获取a、b页面第一次入栈的位置
let first_a = pageUrl.indexOf("pages/home/chat")//聊天页面
let first_b = pageUrl.indexOf("pages/mine/person_center")//个人主页
if (first_b < 0) {
console.log("没有b是正常跳b");
uni.navigateTo({
url: '../mine/person_center?user=' + JSON.stringify(user)//业务逻辑跳转传的参数
})
} else {
if (first_a < first_b) {
console.log("正常跳 b ");
uni.navigateTo({
url: '../mine/person_center?user=' + JSON.stringify(user)//业务逻辑跳转传的参数
})
} else {
console.log("返回 b");
uni.navigateBack({
delta: 1
})
}
}
},
个人主页:
//去聊天页面
toChat() {
//获取页面栈中所有页面
let pages = getCurrentPages()
//如果想打印直接这样打印,不要加什么拼接字符串、JSON.stringify()什么的
console.log(getCurrentPages());
//栈中页面的路径单独保存为数组,方便后续比较
let pageUrl = []
for (let i = 0; i < pages.length; i++) {
//pages[i].$page.fullPath 是页面的全路径,会连页面传递的参数都打印出来,不方便后续比较
// console.log("第"+i+"个页面 = " + pages[i].$page.fullPath);//会带参数
console.log("第"+i+"个页面 = " + pages[i].route);
//用pages[i].route就比较单纯了
pageUrl.push(pages[i].route)
}
//获取a、b页面第一次入栈的位置
let first_a = pageUrl.indexOf("pages/home/chat")//聊天页面
let first_b = pageUrl.indexOf("pages/mine/person_center")//个人主页
if (first_a < 0) {
console.log("没有a是正常跳a");
uni.navigateTo({
url: '../home/chat?user=' + JSON.stringify(this.user)//业务逻辑跳转传的参数
})
} else {
if (first_b < first_a) {
console.log("正常跳 a ");
uni.navigateTo({
url: '../home/chat?user=' + JSON.stringify(this.user)//业务逻辑跳转传的参数
})
} else {
console.log("返回 a");
uni.navigateBack({
delta: 1
})
}
}