【本节大纲】
针对上节所讲的程序注册器与页面注册器,简单做下补充,即页面数据data的操作限制:
页面栈(页面层级):页面层级可能会有三层或者更多层,我们把这样的一个页面层级称为页面栈。
第一个元素为首页,最后一个元素为当前页面
为了方便理解,我们这样描述页面栈:[ pageA, pageB, pageC ],其中pageA在最底下,pageC在最顶部,也就是用户所看到的界面
结合上面案例,比如当前正在浏览我的页面,文件结构如下
则one为PageA在最底部,second为PageC在最顶部
接下来结合上边[ pageA, pageB, pageC ]页面栈描述以下几个和导航相关的API
打开新页面,将原来的页面保留在页面栈中。在跳入到下一个页面的时候,目标页面同时进入页面栈中,在这种情况下点击手机的返回按钮才可以跳转到上一个页面。即保留当前页面,跳转到应用内的某个页面,使用 wx.navigateBack 可以返回
wx.navigateTo —页面栈[pageA]变为[pageA,pageB]
页面栈[pageA,pageB]变为页面栈[pageA,pageB,pageC]
假如使用wx.navigateTo从四级页面跳转到二级页面,此时会在页面栈顶添加一个与二级页面初始状态一样的界面,但两个页面状态是独立的。
<button bindtap="page_zhan">获取当前页面栈</button>
/**获取获取当前的页面栈 */
page_zhan(){
console.log(getCurrentPages());
},
接着上面验证,点击设置跳到设置页面,此时再在设置页面中添加跳页按钮,利用wx.navigateTo方法跳到设置页面
一直跳页,当页面栈为10,即深度为10时达到最大限制。此时再点击按钮时无法跳页
关闭当前页面,返回上一页面或多级页面。
可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。
案例:退出当前页面栈的最顶层页面
<button bindtap="back1">返回上一页</button>
/**返回上一页 */
back1(){
wx.navigateBack({
delta: 1,
})
},
拓展:结合页面栈返回到上一页或多级页面
wx.navigateBack可以结合delta参数实现多级退回(例如:结合页面栈返回pageA基层页面栈首页)
<button bindtap="backTo">跳转到基层页面我的</button>
/**返回页面栈基层页面 */
backTo(){
const page = getCurrentPages(); /**获取当前页面栈 */
wx.navigateBack({
delta: page.length - 1
})
},
这个 API 可以填写的参数只有 delta,表示要返回的页面数。
若 delta 的取值大于现有可返回页面数时,则返回到用户进入小程序的第一个页面。
当不填写 delta 的值时,就默认其为 1(注意,默认并非取 0),即返回上一页面。
描述:关闭当前页面,跳转到应用内的某个页面。页面重定向,将页面重新定向到一个目标页面,并不能返回到上一个页面。
案例:wx.redirectTo({ url: ‘pageE’ }) 是替换当前页变成pageE,此时页面栈变成 [ pageA, pageB, pageE ],当页面栈到达10层没法再新增的时候,往往就是使用redirectTo这个API进行页面跳转
假如使用wx.redirectTo从四级页面重定向到二级页面,此时会将关闭四级页面,并使用二级页面替换四级页面,但两个页面状态是独立的。此时的页面栈大小不变
注意:wx.redirectTo和wx.navigateTo的区别。
页面路由触发方式及页面生命周期函数的对应关系
路由方式 | 触发时机 | 路由前页面生命周期 | 路由后页面生命周期 |
---|---|---|---|
初始化 | 小程序打开的第一个页面 | onLoad, onShow | |
打开新页面 调用 | wx.navigateTo | onHide | onLoad, onShow |
页面重定向 调用 | wx.redirectTo | onUnload | onLoad, onShow |
页面返回 调用 | wx.navigateBack | onUnload | onShow |
Tab | wx.switchTab | 详见下节 | 详见下节 |
重启动 | wx.reLaunch | onUnload | onLoad, onShow |
案例:以 A、B 页面为 Tabbar 页面,C 是从 A 页面打开的页面,D 页面是从 C 页面打开的页面
注意:tabBar页面初始化之后不会被销毁。
页面路由触发方式及页面生命周期函数的对应关系:
当前页面 | 路由后页面 | 触发的生命周期(按顺序) |
---|---|---|
A | A | 无 |
A | B | A.onHide(), B.onLoad(), B.onShow() |
A | B(再次打开) | A.onHide(), B.onShow() |
C | A | C.onUnload(), A.onShow() |
C | B | C.onUnload(), B.onLoad(), B.onShow() |
D | B | D.onUnload(), C.onUnload(), B.onLoad(), B.onShow() |