对于路由的触发方式以及页面生命周期函数以下:html
路由方式 | 触发时机 | 路由前页面 | 路由后页面 |
---|---|---|---|
初始化 | 小程序打开的第一个页面 | onLoad, onSHow | |
打开新页面 | 调用 API wx.navigateTo 或使用组件 <navigator open-type="navigateTo"/> |
onHide | onLoad, onShow |
页面重定向 | 调用 API wx.redirectTo 或使用组件 <navigator open-type="redirectTo"/> |
onUnload | onLoad, onShow |
页面返回 | 调用 API wx.navigateBack 或使用组件<navigator open-type="navigateBack"> 或用户按左上角返回按钮 |
onUnload | onShow |
Tab 切换 | 调用 API wx.switchTab 或使用组件 <navigator open-type="switchTab"/> 或用户切换 Tab |
各类状况请参考下表 | |
重启动 | 调用 API wx.reLaunch 或使用组件 <navigator open-type="reLaunch"/> |
onUnload | onLoad, onShow |
页面跳转触发的生命周期,实际还存在bug,并不如官网所说的sql
情景:小程序
首页跳转到子页面后,而后子页面使用微信小程序
<navigator type='switchTab' url="/pages/index/index" > <view>跳转首页</button> </navigator>
解决办法:api
经过js来跳转缓存
<view class="weui-btn-area"> <button class="weui-btn" bindtap="backIndex" type="default">返回主页</button> </view>
跳转成功后,从新调用onload方法微信
backIndex:function(){ wx.switchTab({ url: '/pages/index/index', success: function (e) { var page = getCurrentPages().pop(); if (page == undefined || page == null) return; page.onLoad(); } }) },
页面路由的其余基础知识请看官方文档 :https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/route.htmlapp
wx.navigateBack传参
咱们来考虑一下如下场景:nosql
1. 在【页面A】中调用wx.navigateTo方法跳转到【页面B】 2. 而后从【页面B】返回【页面A】, 并将【页面B】中的一些数据传回【页面A】
例如,咱们在将要退出页面B的时候,做以下调用:ide
//=== 1. 存储到app对象上的方式 ======== var app = getApp() app.globalData.mydata = {a:1, b:2}; //存储数据到app对象上 wx.navigateBack(); //返回上一个页面 //=== 2.存储到数据缓存的方式 ========= wx.setStorage({ key: "mydata", data: {a:1, b:2}, success: function () { wx.navigateBack(); //返回上一个页面 } })
这样一来,当返回到上一个页面的时候,能够经过读取这些全局存储区域,来获取到咱们须要的数据。
不过,这种方式也是有很明显的缺点的。因为是全局数据存储,因此当你存入了那些数据后,必须谨慎的去管理这些全局数据(什么时候被销毁),不然一不当心,就会产生反作用。
经过调用小程序的API: getCurrentPages(),来获取当前页面路由栈的信息,这个路由栈中按照页面的路由顺序存放着相应的Page对象,获取到上一级页面的完整Page对象,从而使直接调用Page对象的属性和方法成为可能。
以下所示:
var pages = getCurrentPages(); var currPage = pages[pages.length - 1]; //当前页面 var prevPage = pages[pages.length - 2]; //上一个页面 //直接调用上一个页面的setData()方法,把数据存到上一个页面中去
var newtitle ='It is new title';
prevPage.data.title= newtitle; //不须要页面更新
prevPage.setData({ title: newtitle })
页面栈以栈(先进后出)的形式维护页面与页面之间的关系;
小程序提供了getCurrentPages()函数获取页面栈,第一个元素为首页,最后一个元素为当前页面。
使用wx.navigateTo每新开一个页面,页面栈大小加1,直到页面栈大小为5为止;
使用wx.navigateTo重复打开界面
上图中,假如使用wx.navigateTo从四级页面跳转到二级页面,此时会在页面栈顶添加一个与二级页面初始状态同样的界面,但两个页面状态是独立的。页面栈大小会加1,若是页面栈大小为5,则wx.navigateTo无效
上图中,假如使用wx.redirectTo从四级页面重定向到二级页面,此时会将关闭四级页面,并使用二级页面替换四级页面,但两个页面状态是独立的。此时的页面栈大小不变,请注意和使用wx.navigateTo的区别。
上图中,假如当前页面为五级页面,使用wx.navigateBack:
以上使用wx.navigateTo、wx.redirectTo、wx.navigateBack页面出入栈操做对页面栈的影响,平时不必定用得上,可是仍是有必要了解背后的原理。
经过学习页面栈,你至少能够知道:
总结
摘抄来自:
http://www.cnblogs.com/nosqlcoco/p/6195572.html
https://www.cnblogs.com/caicaizi/p/6652103.html