# 饿了么(25 题)
# 1. 小程序里面开页面最多多少
⚡ 30 秒速记
- 微信小程序页面栈最多
10层,满了再navigateTo会走fail navigateTo入栈 /redirectTo替换当前页 /reLaunch清空重建 /navigateBack出栈tabBar页用switchTab切换,也可用reLaunch重建;navigateTo和redirectTo都打不开- 详情页套详情页(推荐商品、相关文章)是最容易撞上限的场景,该替换就替换
- 分享卡片冷启动进来时栈里只有一页,返回按钮要自己兜底回首页
微信小程序的页面栈最多 10 层,超过以后 navigateTo 直接失败。 可以把页面栈想成浏览器的历史记录,只不过平台为它设了层数上限,页面及其状态也会占用资源;具体渲染方式取决于 WebView 或 Skyline 等渲染引擎。真碰到上限一般不是数字的问题,而是导航设计有问题,比如商品详情里点推荐商品一路往下点。我会封装一个跳转方法,用 getCurrentPages().length 判断深度,接近上限时改成 redirectTo 替换当前页;回首页这类动作用 reLaunch 或 switchTab,不往栈里堆。
原理拆开看
微信小程序同时打开的页面栈通常最多 10 层,超过后不能继续通过 navigateTo 入栈;返回用 navigateBack,切换 tab 用 switchTab。这个值属于平台限制,面试时还应补一句:开发要以当前官方文档和实际基础库为准,页面层级过深本身也说明导航设计需要收敛。 小程序页面栈可以理解为一段受平台管理的导航历史:navigateTo 新增普通页,navigateBack 回退,redirectTo 替换当前页,reLaunch 重建整条栈,switchTab 切换到 tabBar 页面。具体层数是平台能力,不应把“能开多少层”当作导航设计目标。
最小实现
function openDetail(id) {
const pages = getCurrentPages()
if (pages.length >= 9) {
wx.redirectTo({ url: `/pages/detail/index?id=${id}` })
return
}
wx.navigateTo({ url: `/pages/detail/index?id=${id}` })
}
// tabBar 页面必须使用 switchTab
function goHome() {
wx.switchTab({ url: '/pages/home/index' })
}
普通情况下用 navigateTo 保留返回路径;当页面栈已经很深时,示例改用 redirectTo 替换当前页,避免继续入栈。tabBar 页面不能用普通入栈 API,必须 switchTab。生产还应根据流程语义决定是否替换,不能只按数字硬切。