美文网首页Android相关
uniapp 一种避免页面来回跳转的解决方法

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

作者: _小爽_ | 来源:发表于2021-06-16 18:03 被阅读0次

    一、问题背景:

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

    相关文章

      网友评论

        本文标题:uniapp 一种避免页面来回跳转的解决方法

        本文链接:https://www.haomeiwen.com/subject/cvjfyltx.html