美文网首页
MUI-返回到首页(任意的父级页面)

MUI-返回到首页(任意的父级页面)

作者: w_wh | 来源:发表于2018-12-13 12:52 被阅读0次

最近项目中遇到了一个返回首页的问题,就是业务流程的最后一步完成后要返回到首页。在这期间跳转了很多页面,用mui.back()只能返回到上一级页面,多次调用也没用。
原创文章,欢迎转载.转载请注明出处: https://www.jianshu.com/p/b66f246bdbbc

解决方案

5+给页面对象提供两个方法可以完美的解决这个问题,这两个方法分别是:

  1. opener方法,获取上一级页面:
    page.opener();
  1. close方法,关闭页面:
    page.close();

假如从首页跳转到A页面,从A页面跳转到B页面,从B页面跳转到C页面,C页面里有个完成按钮,点击返回到首页。实现完成按钮返回首页的功能只需要三步:

  • 第一步,获取当前页面(C页面);
  • 第二步,获取当前页面的上一级页面(B页面)和上一级页面的上一级页面(A页面);
  • 第三步,关闭当前页面(C页面)、B页面和A页面,完成。

通过上面三步就可以实现,视觉上的效果和返回到上级页面的效果一样(不用担心会出现多次返回动画。亲测,不管有多少层级,只有一次返回动画就返回到了首页),对应的代码如下:

    //获取当前页面
    var cPage = plus.webview.currentWebview();
    //获取上一级页面(B页面)
    var bPage = cPage.opener();
    //获取上一级页面的上一级页面(A页面)
    var aPage = bPage.opener();
    //关闭当前页面(C页面)、B页面和A页面
    cPage.close();
    bPage.close();
    aPage.close();

封装-返回到任意的父级页面

我们在用 mui.openWindow() 跳转页面的时候一般都会指定一个页面id,只要我们知道这个id就可以获取到这个页面(关于应用的入口页面id,请参考文章末尾的注意)。再利用上面5+给页面对象提供的两个方法就可以返回到任意的父级页面。

实现思路:

  • 第一步,判断目标页面id是否存在(即是否能找到这个id的页面),存在则执行第二步,否则退出。
  • 第二步,判断目标页面是否是当前页面,不是则执行第三步,否则退出。
  • 第三步,利用opener()方法循环遍历父级页面,并将要关闭的页面保存到pages数组中,直到找到目标页面为止。如果找到了目标页面则关闭pages数组中保存的所有页面之后退出,否则不关闭任何页面直接结束。

具体代码如下:

/**
* 从当前页面pop到目标页面
* @param {String} targetId 目标页面ID
*/
function popToTarget(targetId){
    //获取目标页面
    var target = plus.webview.getWebviewById(targetId);
    if (!target) {
        console.log("目标页面不存在!");
        return;
    }
    //获取当前页面
    var current = plus.webview.currentWebview();
    if (current === target) {
        console.log("目标页面是当前页面!");
        return;
    }
    //将要关闭的页面
    var pages = new Array(current);
    //父级页面
    var opener = current.opener();
    while (opener){
        if (opener === target) {//找到了目标页面
            //关闭目标页面的所有子级页面pages
            pages.map(function(page){
                page.close();
            });
            return;
        }
        pages.push(opener);
        opener = opener.opener();
    }
    //没有找到目标页面
    console.log("目标页面不是当前页面的祖先页面!");
}

注意:有一个页面,我们可能不知道它的id是多少,这个页面就是应用的入口页面(是在manifest中配置的),其实它的id就是appid。但是我们通过基座调试时IDE安装了一个叫"HBuilder"的应用,这个应用的appid是"HBuilder"并不是我们配置的appid(只有打包后才是我们自己配置的appid)。如果我们想要返回到应用的入口页面,直接传我们配置的appid,打包后是没有问题的。但是通过基座调试时就不能正常返回。所以建议直接通过getLaunchWebview()方法拿到应用的入口页面,然后获取它的id属性,这样不管是基座调试还是打包后都可以正常返回。具体实现只需要如下一句代码:

popToTarget(plus.webview.getLaunchWebview().id);

上面这些只是单纯的返回到目标页面,如果返回到目标页面后想对其刷新或做一些其他操作,可以参考下一篇文章:MUI-返回到首页(任意的父级页面)并刷新(或做其他操作)

相关文章

网友评论

      本文标题:MUI-返回到首页(任意的父级页面)

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