uni.navigateBack 是最直接的关页方式,用于返回上一页并触发 onUnload;若栈深不足则无效,需用 reLaunch 彻底重置栈,redirectTo 和 switchTab 本质是跳转而非单纯关页。

uni.navigateBack 是最直接的关页方式
关闭当前页面,本质就是“返回上一页”,uni.navigateBack 就是为此设计的 API。它不跳转新页面,只弹出当前页、触发 onUnload,然后展示栈中上一个页面。
常见错误现象:调用 uni.navigateBack() 后没反应——大概率是当前页面栈只有 1 层(比如从首页直接打开的模态页,或被 reLaunch 重置后只剩它自己),此时会退到原生首页甚至白屏。
- 默认行为是
delta: 1,即返回上一级;可显式写成uni.navigateBack({ delta: 1 }) - 想跳过中间页(比如从 C 页直接回 A 页),用
delta: 2;但不能超过当前栈长度,否则静默失败 - 小程序端动画支持
animationType和animationDuration,H5 端无效
想关掉当前页 + 上一页?别硬删栈,用 reLaunch 更稳
有人想“关闭 B 页再顺手把 A 页也干掉”,于是去查 getCurrentPages() 想手动 splice 页面栈——这行不通。微信小程序和多数平台禁止直接修改页面栈数组,强行操作无效果,还可能引发生命周期异常。
真正可靠的做法是:用 uni.reLaunch 彻底重置栈,跳转到目标页(比如首页或登录页)。
-
uni.reLaunch({ url: '/pages/index/index' })会触发所有已打开页面的onUnload,干净利落 - 适合场景:表单提交成功后跳首页、退出登录、支付完成跳订单页等“状态归零”时刻
- 注意:不能带参数跳 TabBar 页面(如
/pages/tabbar/home),否则在部分平台报错
redirectTo 和 switchTab:关页是副作用,不是目的
uni.redirectTo 的核心作用是“替换当前页”,不是“关闭当前页”。它把当前页从栈顶踢掉,压入新页——所以你感觉“关了”,其实是被替换了。
同样,uni.switchTab 是专为底部 tab 设计的,它会关闭所有非 tab 页面,只留目标 tab 页。这两者都不是为“单纯关页”而生,误用容易翻车。
-
redirectTo不能跳 TabBar 页面,否则静默失败;传参正常,但目标页onLoad才能拿到 -
switchTab不支持 URL 参数(url只能是 tab 配置里的路径),且目标页触发的是onShow而非onLoad - 如果只是想关当前页、不跳新页,别用这两个——它们一定会跳,不是“关完就停”
关闭非当前页?别折腾,重新设计流程
有开发者问:“怎么关掉页面栈里第 2 个页面,但保留第 1 和第 3 个?”答案很实在:uni-app 不支持这种精细操作,官方也没提供 API。强行用 getCurrentPages() + uni.navigateBack 多次跳转模拟,极易因栈深度变化导致 delta 错位,尤其在异步提交、条件跳转等场景下不可靠。
更务实的解法是:从交互逻辑出发,避免产生“需要关中间页”的需求。
- 用
uni.navigateTo时加success回调,在新页加载完成后主动uni.navigateBack清掉前一页(适用于弹窗类流程) - 关键业务页(如登录、支付)优先用
reLaunch进入,确保栈干净,而不是在深栈里“修修补补” - 若必须保留多层栈又需跳转控制,考虑用
vuex或uni.$emit通信,让上一页自己决定是否navigateBack
页面栈不是数组工具箱,它是运行时状态快照。想绕过生命周期直接删页,等于在引擎运转时拆螺丝——看起来省事,其实埋雷。


















