在小程序的文档中,路由介绍和内容中,即链接:
https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/route.html
有一段话,有明显的逻辑错误:
5. Tab 切换
- openType:
switchTab
Tab 切换路由 switchTab 表示切换到指定的 tab 页面。
触发方式
- 调用 API
wx.switchTab,Router.switchTab - 使用组件
<navigator open-type="switchTab"/> - 用户点击 Tab Bar 中的 Tab 按钮
switchTab 的目标必须为 tabBar 页面。
页面栈及生命周期处理
由于 navigateTo 和 redirectTo 不能指定 tabBar 页面作为目标,因此当一个 tabBar 页面出现在页面栈中时,它必定为页面栈的第一个页面(即栈底页面);同时,框架会保证任一 tabBar 页面在小程序中最多同时存在一个页面实例。switchTab 的行为主要基于这两点进行。
switchTab 事件发生时,如果当前页面栈中存在多于一个页面,页面栈当前的栈顶页面将被弹出并销毁,并触发这个页面的 onUnload 生命周期;以上操作将被重复执行多次,直到页面栈中只剩下一个页面。之后,根据页面栈中仅剩的页面进行不同的处理:
- 如果这个页面即为目标 tabBar 页面:
- 如果路由事件开始时页面栈中存在多于一个页面(即目标 tabBar 页面不是栈顶页面),触发目标 tabBar 页面的
onShow生命周期; - 否则(路由事件开始时目标 tabBar 页面是栈顶页面),不触发任何生命周期,直接结束;
- 否则(该页面不为目标 tabBar 页面时):
- 将这个页面从页面栈中弹出;
- 如果这个页面为其他 tabBar 页面,该页面成为悬垂页面,并:
- 如果路由事件开始时页面栈中只有一个页面(即该 tabBar 页面是栈顶页面),触发它的
onHide生命周期; - 否则(路由事件开始时该 tabBar 页面不是栈顶页面),不触发它的任何生命周期;
- 否则(这个页面为非 tabBar 页面时),销毁该页面,触发
onUnload生命周期; - 如果目标 tabBar 页之前已经被创建过(现在是一个悬垂页面),将其推入页面栈,触发
onShow生命周期; - 否则(目标 tabBar 页不存在实例),创建目标 tabBar 页并推入页面栈,依次触发
onLoad,onShow生命周期。
看上面加粗,标红的这句话:
否则(这个页面为非 tabBar 页面时),销毁该页面,触发 onUnload 生命周期;
这句话是有明显的逻辑问题,因为这些判断分支,都是以前面的一段话为基础:
switchTab 事件发生时,如果当前页面栈中存在多于一个页面,页面栈当前的栈顶页面将被弹出并销毁,并触发这个页面的 onUnload 生命周期;以上操作将被重复执行多次,直到页面栈中只剩下一个页面。之后,根据页面栈中仅剩的页面进行不同的处理:
也就是在tab切换时,直到页面栈中只剩下 一个页面,然后以仅剩的页面进行不同的处理,所以红色加粗的语句根本不可能成立 !因为只剩下一个页面时,这个页面不可能为非tabbar页,而是一定是tabbar页面,你们仔细想想看,是不是这个道理!不可能还存在非tabbar页的情况,因为都只剩下一个页面了,一定是tabbar页才对!!!

对的,文档的逻辑错误,我是开发后端的,所以,我的逻辑思维非常厉害