必须用uni.switchtab跳转tabbar页面,因其仅支持跳转到pages.json中tabbar.list声明的页面;若误用navigateto或redirectto会报“page is not found”错误。
uni-app 页面跳转不是“用一个 api 就行”,而是得先看目标页面类型和业务意图——uni.navigateto 不能跳 tabbar 页,uni.switchtab 传不了参数,uni.redirectto 会销毁当前页,这些不匹配直接导致白屏或报错。
怎么选对跳转方式:看目标页是否在 tabBar 里
这是最常踩的坑。如果目标路径(比如 /pages/tabbar/home)在 pages.json 的 tabBar.list 中声明过,就只能用 uni.switchTab;用 uni.navigateTo 或 uni.redirectTo 会报 the page is not found,哪怕路径完全正确。
- tabBar 页面:必须用
uni.switchTab({ url: '/pages/tabbar/home' }) - 非 tabBar 页面(如详情页、表单页):优先用
uni.navigateTo(支持返回) - 中间跳板页(如登录成功页):用
uni.redirectTo,避免用户返回重复提交 - 退出登录/切换账号:用
uni.reLaunch清空整个页面栈
随机跳转时 Math.random() 下标越界怎么防
Math.random() * pages.length 返回的是浮点数,直接当数组下标会取到 undefined,导致 url must be string 错误。
- 必须套
Math.floor():pages[Math.floor(Math.random() * pages.length)] - 路径列表建议抽成常量,别写死在方法里,方便统一维护和比对
pages.json - 跳转前加
fail回调,尤其在 App 和小程序平台,H5 上可能不触发
传参中文或对象时 URL 解析出错怎么办
URL 中的中文、空格、特殊符号(如 +)会被错误解析——+ 变空格,中文变乱码。
- 基础参数用
encodeURIComponent()包一层:id=1&name=${encodeURIComponent('张三')} - 传对象先
JSON.stringify,再encodeURIComponent,接收端用decodeURIComponent+JSON.parse - tabBar 页面禁止带参数,
uni.switchTab会忽略 query 部分,别白费劲
页面栈超 10 层后跳转静默失败
uni-app 页面栈硬限制 10 层,uni.navigateTo 超限时不会报错,只是不跳——用户卡在当前页,以为功能坏了。
- 深层流程(如多级表单、嵌套详情)改用
uni.redirectTo替换当前页,而不是堆栈 - 用
getCurrentPages().length在跳转前做简单监控,开发期打日志预警 - 分包加载的页面也要算进栈深,不能只看主包路径
真正难的不是写哪行代码,而是每次跳转前得快速判断:这页是不是 tabbar 页?这次跳要不要留返回入口?参数里有没有中文?栈还剩几层?漏掉任一条件,运行时就只剩白屏和控制台里一行沉默的 warning。











