收藏
回答

文档教程的逻辑错误

在小程序的文档中,路由介绍和内容中,即链接:

https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/route.html

有一段话,有明显的逻辑错误:

5. Tab 切换

  • openType: switchTab

Tab 切换路由 switchTab 表示切换到指定的 tab 页面。

触发方式

  1. 调用 API wx.switchTab, Router.switchTab
  2. 使用组件 <navigator open-type="switchTab"/>
  3. 用户点击 Tab Bar 中的 Tab 按钮

switchTab 的目标必须为 tabBar 页面。

页面栈及生命周期处理

由于 navigateToredirectTo 不能指定 tabBar 页面作为目标,因此当一个 tabBar 页面出现在页面栈中时,它必定为页面栈的第一个页面(即栈底页面);同时,框架会保证任一 tabBar 页面在小程序中最多同时存在一个页面实例。switchTab 的行为主要基于这两点进行。

switchTab 事件发生时,如果当前页面栈中存在多于一个页面,页面栈当前的栈顶页面将被弹出并销毁,并触发这个页面的 onUnload 生命周期;以上操作将被重复执行多次,直到页面栈中只剩下一个页面。之后,根据页面栈中仅剩的页面进行不同的处理:

  • 如果这个页面即为目标 tabBar 页面:
  • 如果路由事件开始时页面栈中存在多于一个页面(即目标 tabBar 页面不是栈顶页面),触发目标 tabBar 页面的 onShow 生命周期;
  • 否则(路由事件开始时目标 tabBar 页面是栈顶页面),不触发任何生命周期,直接结束;

  • 否则(该页面不为目标 tabBar 页面时):
  1. 将这个页面从页面栈中弹出;

  • 如果这个页面为其他 tabBar 页面,该页面成为悬垂页面,并:
  • 如果路由事件开始时页面栈中只有一个页面(即该 tabBar 页面是栈顶页面),触发它的 onHide 生命周期;
  • 否则(路由事件开始时该 tabBar 页面不是栈顶页面),不触发它的任何生命周期;
  • 否则(这个页面为非 tabBar 页面时),销毁该页面,触发 onUnload 生命周期;
  • 如果目标 tabBar 页之前已经被创建过(现在是一个悬垂页面),将其推入页面栈,触发 onShow 生命周期;
  • 否则(目标 tabBar 页不存在实例),创建目标 tabBar 页并推入页面栈,依次触发 onLoad, onShow 生命周期。

看上面加粗,标红的这句话:

否则(这个页面为非 tabBar 页面时),销毁该页面,触发 onUnload 生命周期;

这句话是有明显的逻辑问题,因为这些判断分支,都是以前面的一段话为基础:

switchTab 事件发生时,如果当前页面栈中存在多于一个页面,页面栈当前的栈顶页面将被弹出并销毁,并触发这个页面的 onUnload 生命周期;以上操作将被重复执行多次,直到页面栈中只剩下一个页面。之后,根据页面栈中仅剩的页面进行不同的处理:

也就是在tab切换时,直到页面栈中只剩下 一个页面,然后以仅剩的页面进行不同的处理,所以红色加粗的语句根本不可能成立 !因为只剩下一个页面时,这个页面不可能为非tabbar页,而是一定是tabbar页面,你们仔细想想看,是不是这个道理!不可能还存在非tabbar页的情况,因为都只剩下一个页面了,一定是tabbar页才对!!!


回答关注问题邀请回答
收藏

2 个回答

  • 智能回答 智能回答 本次回答由AI生成
    04-29
    有用 1
  • 未来可期
    未来可期
    04-29

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

    04-29
    有用
    回复
登录 后发表内容