微信小程序返回多级页面的实现方法


Posted in Javascript onOctober 27, 2017

微信小程序返回多级页面的实现方法

微信小程序开发中,返回上一页是很普遍的操作,最常见的是点击手机的返回键和点击自定义的按钮返回上一页这两种情况。点击手机的返回键我们不需要做处理,如果是自定义按钮实现返回效果,就要调用微信提供的API:

wx.navigateBack(OBJECT)

也可以通过 wx.navigateBack 方法实现返回多级页面,只要设置 delta 的值就可以:

//在C页面内 navigateBack,将返回A页面,delta = 1 时与 wx.navigateBack() 效果一致
wx.navigateBack({
 delta: 2
})

但是有些时候,我们需要实现点击手机的返回键,也返回上两页或者多页,这样子就不能直接用上面的方法来处理了。我用过下面的两种方法来实现:

方法一:在页面C的 onUnload 方法里面调用 wx.navigateBack() ,这样可以实现返回到页面A,不过会有个问题,如果把页面C分享到微信聊天会话里面,然后关闭小程序,再从聊天会话打开页面C,还会调用 wx.navigateBack() 方法,并且报这个异常:

WAService.js:9 navigateBack with an unexist webviewId 0

方法二:另一种方法是在页面B的 onShow 方法中调用 wx.navigateBack() 实现返回 ,这样就可以避免方法一中出现的问题。实现的思路如下:

① 在页面C的 onUnload 方法里面判断是否可以返回前n页,通过 getCurrentPages() 方法可以获取当前的页面栈,根据页面栈的长度判断可以返回的层数,并且可以给所有页面的 data 设置参数,这里以返回上两页为例:

//这里是页面C的 onUnload 方法
  onUnload: function() {
    var that = this

    //判断页面栈里面的页面数是否大于2
    if(getCurrentPages().length > 2) {
      //获取页面栈
      let pages = getCurrentPages()
      //给上一个页面设置状态
      let curPage = pages[pages.length - 2];
      let data = curPage.data;
      curPage.setData({'isBack': true});
    }
  },

② 在页面B的 onShow 方法里面根据 isBack 的值,判断是否调用 wx.navigateBack() :

//这里是页面B的 onShow 方法
  onShow: function() {
    var that = this
    //如果 isBack 为 true,就返回上一页
    if(that.data.isBack) {
      wx.navigateBack()
    }
  },

方法一和方法二都不是直接从页面C到页面A,都是要先经过页面B,所以会出现页面B闪一下的情况,大家如果有更好的方法可以告诉我。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
js 对象是否存在判断
Jul 15 Javascript
使用JQuery进行跨域请求
Jan 25 Javascript
JavaScript 精粹读书笔记(1,2)
Feb 07 Javascript
JS实现div内部的文字或图片自动循环滚动代码
Apr 19 Javascript
DOM基础教程之事件对象
Jan 20 Javascript
js实现页面刷新滚动条位置不变
Nov 27 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
JavaScript的继承实现小结
May 07 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
Vue自定义指令封装节流函数的方法示例
Jul 09 Javascript
jQuery超简单遮罩层实现方法示例
Sep 06 jQuery
Vue vm.$attrs使用场景详解
Mar 08 Javascript
微信小程序-getUserInfo回调的实例详解
Oct 27 #Javascript
基于JavaScript实现报警器提示音效果
Oct 27 #Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 #Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 #jQuery
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 #Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 #Javascript
node 利用进程通信实现Cluster共享内存
Oct 27 #Javascript
You might like
封装一个PDO数据库操作类代码
2009/09/09 PHP
php 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
js中scrollHeight,scrollWidth,scrollLeft,scrolltop等差别介绍
2012/05/16 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
重写document.write实现无阻塞加载js广告(补充)
2014/12/12 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
python实现石头剪刀布小游戏
2021/01/20 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
python中dict使用方法详解
2019/07/17 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
金融专业推荐信
2013/11/14 职场文书
《十六年前的回忆》教学反思
2014/02/14 职场文书
《路旁的橡树》教学反思
2014/04/07 职场文书
考核评语大全
2014/04/29 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书