以何为家
以何为家
  • 发布:2021-06-16 18:00
  • 更新:2021-06-16 18:00
  • 阅读:1022

一种避免页面来回跳转的解决方法

分类:uni-app

一、问题背景:

两个页面多次来回点击后循环跳转,返回时会一层一层返回重复的页面,想避免这种情况,在安卓中可以设置页面的启动模式,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  
                        })  
                    }  
                }
0 关注 分享

要回复文章请先登录注册