前言:

对于小程序的页面路由,如果没有一定开发经验的话,理解起来还是会有些困难的。哪怕是有一定小程序开发经验的开发者,能够完全理解掌握的恐怕也不多。

这里就以另外一种方式来详细的介绍小程序的页面栈及路由方式,相信看了本文你能更深入的了解小程序的页面路由的。

模拟场景:

小程序的页面路径基本上都可以用PC端浏览器来模拟,如:

小程序页面栈
类似于
浏览器页面栈
小程序的初始化(新页面入栈)
———
打开浏览器默认加载首页
小程序打开新页面(新页面入栈)
———
浏览器在新标签中访问网址或者点击当前页面链接新标签页打开页面
页面返回(当前页面出栈,新页面入栈)
———
浏览器返回上一页
。。。。。。
   

如果说小程序的官方文档比较抽象,那么转换成浏览器来理解就应该容易的多了。

下面会结合官方相关文档,以浏览器为例进行详细解析。

页面路由:

小程序所有页面的路由全部由框架进行管理。

页面栈:

框架以栈的形式维护了当前的所有页面。当发生路由切换的时候,页面栈的表现如下:

路由方式 页面栈表现 pc端浏览器模拟

初始化(打开小程序,进入首页)

新页面入栈

打开浏览器自动打开默认首页

打开新页面 新页面入栈

1. 浏览器打开新标签页访问网址;

2. 他页面中点击链接新窗口打开页面

页面重定向 当前页面出栈,新页面入栈

1. 当前页面点击链接在当前页面打开;

2. 当前页面地址栏输入其他网址访问;

3. 在当前页面点击书签栏中的书签(设置在当前页面打开书签)

页面返回 页面不断出栈,直到目标返回页 点击浏览器的返回按钮返回上一页
Tab 切换 页面全部出栈,只留下新的 Tab 页面

这个可能有点不好理解,不过还是可以用浏览器解释的:

小程序的Tab页可看做一个浏览器打开的不同窗口,这些窗口相互之间不影响,从Tab页打开其他非Tab页面可看做在浏览器一个窗口页面中在当前页面进入其他页面,从这个角度来看,就容易理解的多了

重加载 页面全部出栈,只留下新的页面

这个就不太好举例了,可以理解为重启浏览器,只不过重启后可以打开指定页面

如果还是有点看不懂,下边将会在路由方式中进行详细介绍:

路由方式:

对于路由的触发方式以及页面生命周期函数如下:

路由方式   路由前页面 路由后页面 浏览器模拟
初始化 小程序首页   onLoad, onShow 浏览器打开的第一个页面初次加载
打开新页面 wx.navigateTo onHide onLoad, onShow 在浏览器新标签页中打开新页面都会隐藏上一页并加载新页面
页面重定向 wx.redirectTo onUnload onLoad, onShow 浏览器页面中打开新的页面
页面返回 wx.navigateBack onUnload onShow 当前页面内打开新页面,点击返回按钮会销毁新页面,返回显示上一页
Tab 切换 wx.switchTab   各种情况请参考下表  
重启动 wx.reLaunch onUnload onLoad, onShow 销毁所有页面重启浏览器,打开加载新页面

这里尤其需要注意的就是Tab页了,对于小程序的Tab页与普通页面有很大的区别的,最常用的就是只能使用wx.switchTab来跳转到Tab页面,否则,超链接将无法进行跳转。

对于Tab页,可以理解为浏览器的不同的标签页,不同标签页之间相互无影响,可以在新的标签页中打开新页面,也可以在已打开标签页内打开新的页面,下边将结合官方文档中关于Tab 切换对应的生命周期进行详细解析。

Tab 切换对应的生命周期:

如下,以 A、B 页面为 Tabbar 页面,C 是从 A 页面打开的页面,D 页面是从 C 页面打开的页面为例:

当前页面 路由后页面 触发的生命周期(按顺序) 浏览器场景模拟
A A Nothing happend 刷新页面
A B A.onHide(), B.onLoad(), B.onShow() 新标签打开页面,原页面隐藏,新页面加载显示
A B(再次打开) A.onHide(), B.onShow() 切回A页面,然后再点B页面,那么A隐藏,B显示
C A C.onUnload(), A.onShow()

C页面由A页面进入,则C页面进入A页面,C页面销毁,A页面显示

C B C.onUnload(), B.onLoad(), B.onShow()

这个就不好用浏览器来解释了,表格后边直接用小程序Tab页来细说

D B D.onUnload(), C.onUnload(), B.onLoad(), B.onShow()  这个就不好用浏览器来解释了,表格后边直接用小程序Tab页来细说
D(从转发进入) A D.onUnload(), A.onLoad(), A.onShow()  D页面入口还是A页面,所以这个同C-->A
D(从转发进入) B D.onUnload(), B.onLoad(), B.onShow()  同C-->B

对于C-->B可以这样理解:

如上,Tab页中都会显示导航栏的,C页面由Tab A进入,则由C页面通过wx.switchTab打开Tab B的时候,Tab B页面就会显示导航栏,也就是回到了Tab A/Tab B入口了。

这样就可以理解为Tab A页内打开的页面打开其他Tab页的时候会销毁当前页面并重新加载其他即将打开的Tab页,这个可能有点绕,可以看下边的脑图:

注:

1. 上边脑图系实例验证得出,建议最好是自己写个完整的demo验证下,如果能按这个完整走一遍,相信你对Tab 切换对应的生命周期会有不一样的理解。

2. 上面例子中仅使用了 wx.navigateTo 和 wx.switchTab 两个 页面跳转Api,仅在验证Tab切换生命周期,感兴趣的可以自行验证其他路由跳转方式。

示例代码:

https://developers.weixin.qq.com/s/FGRKgcmu7Y4U

微信小程序开发——以简单易懂的浏览器页面栈理解小程序的页面路由的更多相关文章

  1. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  2. 微信小程序开发——连续快速点击按钮调用小程序api返回后仍然自动重新调用的异常处理

    前言: 小程序开发中诸如获取用户手机号码.调起微信支付.领取卡券等api都是会有一定的延迟的.也就是说通过点击按钮调用这些api的时候,从点击按钮调用api,到支付页面或者领取卡券界面展示出来是需要一 ...

  3. 微信公众号开发上传图文素材带有卡片小程序报错:errcode=45166,errmsg = invalid content hint

    微信公众号开发自从支持允许在群发图文中插入小程序,方便了小程序的运营及推广.最近在三方服务开发中,要支持图文素材插入小程序遇到了一个很是棘手的问题.官方给出的插入小程序的示例支持文字.图片.卡片.如下 ...

  4. .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)

    基于上一篇文件“.NET Core 小程序开发零基础系列(1)——开发者启用并校验牵手成功”的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题,后面我也会通过实战 ...

  5. Win32 程序开发入门:一个最简单的Win32程序

    一.什么是 Win32 Win32 是指 Microsoft Windows 操作系统的 32 位环境,与 Win64 都为 Windows 常见环境. 这里再介绍下 Win32 Applicatio ...

  6. 微信小程序开发公测,小程序账号申请办法攻略

    11月3号晚上 10 点,微信公众平台发布公告,宣布微信小程序正式开放公测.此次小程序公测允许开发者将产品提交至微信公众平台审核,但是暂时不支持发布,也就是说普通消费者若想体验小程序,还需要等待一段时 ...

  7. 【微信】1.微信小程序开发--入门

    开始开发微信小程序咯!! ============================= 1.找到官网API地址 https://developers.weixin.qq.com/miniprogram/ ...

  8. 微信小程序开发——点击按钮获取用户授权没反应或反应很慢的解决方法

    异常描述: 点击按钮获取用户手机号码,有的时候会出现点击无反应或很久之后才弹出用户授权获取手机号码的弹窗,这种情况下,也会出现点击穿透的问题(详见:微信小程序开发——连续快速点击按钮调用小程序api返 ...

  9. 关于微信小程序开发中遇到的缺少game.json问题的解决

    一.小程序开发的两种选项 ①小游戏开发:内部对应的入口配置文件为game.json丶game.wxml之类的文件或者项目. ②小程序开发:内部对应的入口配置文件为app.json丶app.wxml之类 ...

随机推荐

  1. mysql innodb count(*)速度慢且不准确的解决办法

    innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据.而innodb必须 ...

  2. day07-多表查询

    本节重点: 多表连接查询 符合条件连接查询 子查询 准备工作:准备两张表,部门表(department).员工表(employee) create table department( id int, ...

  3. 关于 C++ 默认构造函数 的几个误区 转载

    https://blog.csdn.net/ccrazyman/article/details/8138425

  4. Object-c @property与@synthesize的配对使用。

    功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明. 如: 1.在头文件中: @property int count; 等效于在头文件中声明2个方法: - (int)count; ...

  5. webpack打包avalon+mmRouter

    这是上一篇<webpack打包avalon+oniui+jquery>的姐妹篇,avalon 的高级应用篇.大家要知道,现在最流行的网页架构就是SPA,SPA能提高用户体验.用户许多数据都 ...

  6. 自定义标签在IE6-8的困境

    或许未来前端组件化之路都是自定义标签,但这东西早在20年前,JSTL已在搞了.现在Web Component还只有webkit支持.但一个组件库,还需要一个特殊的标识它们是一块的.不过这个XML已经帮 ...

  7. C++ new 和malloc 区别

    1.分配地方不同,malloc是堆上面,new是自由存储区域 2.malloc/delete是函数,new/delete是操作符,可以重载 3.malloc 要指定大小,返回的是void*指针,开辟的 ...

  8. 8.抽象类、接口和多态.md

    目录 1.抽象类 1.抽象类 2.接口和抽象类的关系 2.1实现上的区别: 22.类和接口的关系: 2.3.Java为什么只能单继承可以多实现: 2.4.接口和接口的关系: 3.多态 2.接口和抽象类 ...

  9. GIS案例学习笔记-ArcGIS整图大图出图实例教程

    GIS案例学习笔记-ArcGIS整图大图出图实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 通过出图比例尺(1:2000),地图范围测算图纸大小. 图 ...

  10. nagiosQL访问时报错PHP message: PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead

    nagiosQL安装环境: CentOS release 6.4 (Final) php-5.5.4 nagiosql_320 nginx version: nginx/1.2.3 安装一切正常,当访 ...