uniapp 不同路由之间的区别

在UniApp中,路由跳转是实现页面导航的核心功能,常见的路由跳转方式包括navigateTo、redirectTo、reLaunch、switchTab和navigateBack。这些方法在跳转行为和适用场景上有所不同。

一、路由跳转的类型与区别

1. uni.navigateTo(OBJECT)
  • 特点 :
    • 保留当前页面,跳转到应用内的某个页面。
    • 可以通过 uni.navigateBack() 返回上一个页面。
    • 会生成新的页面实例,页面栈最多十层。
  • 限制 :
    • 不能跳转到 tabBar 页面。
    • 页面栈超过十层后无法继续跳转。
  • 应用场景 :
    • 适合需要返回操作的页面跳转,如从列表页跳转到详情页。
2. uni.redirectTo(OBJECT)
  • 特点 :
    • 关闭当前页面,跳转到应用内的某个页面。
    • 无法通过返回按钮回到上一个页面。
    • 会销毁当前页面实例,减少内存占用。
  • 限制 :
    • 同样不能跳转到 tabBar 页面。
  • 应用场景 :
    • 登录成功后跳转到主页,防止用户返回登录页。
    • 表单提交成功后跳转到结果页。
3. uni.reLaunch(OBJECT)
  • 特点 :
    • 关闭所有页面,打开应用内的某个页面。
    • 页面栈会被清空,只剩新打开的页面。
    • 无论从哪个页面跳转,结果页的返回逻辑都是一致的。
  • 应用场景 :
    • 退出登录时跳转到登录页。
    • 应用初始化时跳转到引导页或主页。
4. uni.switchTab(OBJECT)
  • 特点 :
    • 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
    • tabBar 页面的生命周期比较特殊,切换时不会销毁。
    • 只能跳转到配置在 pages.json 中的 tabBar 页面。
  • 应用场景 :
    • 底部导航栏的页面切换。
5. uni.navigateBack(OBJECT)
  • 特点 :
    • 关闭当前页面,返回上一页面或多级页面。
    • 通过 delta 参数指定返回的级数。
    • 不会创建新的页面实例,性能较好。
  • 应用场景 :
    • 在详情页点击返回按钮回到列表页。
    • 通过参数控制返回多级页面。

二、不同跳转方式的对比表

方法 是否关闭当前页面 是否可返回 是否支持 tabBar 页面 页面栈变化 生命周期影响
uni.navigateTo 否 是 否 增加一个页面实例 触发新页面的 onLoad
uni.redirectTo 是 否 否 替换当前页面实例 触发当前页面的 onUnload
uni.reLaunch 是 取决于目标 是 清空所有页面,只剩新页面 触发所有旧页面的 onUnload
uni.switchTab 是 否 是 关闭所有非 tabBar 页面 tabBar 页面不会销毁
uni.navigateBack 是 是 否 减少指定数量的页面实例 触发当前页面的 onUnload

三、特殊场景下的选择建议

  1. 需要返回上一页 :使用 navigateTo,配合 navigateBack 返回。
  2. 禁止返回操作 :使用 redirectTo 或 reLaunch,例如登录成功后。
  3. tabBar 页面切换 :必须使用 switchTab,其他方法无效。
  4. 重置应用状态 :使用 reLaunch,例如退出登录或切换账号。
  5. 多级返回 :使用 navigateBack 并设置 delta 参数。

四、注意事项

  1. 页面栈限制 :
    • navigateTo 的页面栈最多十层,超过后无法继续跳转。
    • 可以通过 getCurrentPages() 获取当前页面栈信息。
  2. 生命周期差异 :
    • switchTab 切换到的 tabBar 页面不会触发 onLoad,而是触发 onShow。
    • 缓存页面(使用 <keep-alive>)会触发 onShow 和 onReady,但不会触发 onLoad。
  3. 参数传递 :
    • 跳转时可以通过 URL 参数传递简单数据,如 url: '/pages/detail?id=123'。
    • 复杂数据可以通过全局变量、Vuex 或本地存储传递。

五、代码示例

javascript 复制代码
// 1. 跳转到非 tabBar 页面(保留当前页)
uni.navigateTo({
  url: '/pages/detail/detail?id=123'
});

// 2. 关闭当前页并跳转
uni.redirectTo({
  url: '/pages/result/result'
});

// 3. 清空所有页面并跳转
uni.reLaunch({
  url: '/pages/index/index'
});

// 4. 跳转到 tabBar 页面
uni.switchTab({
  url: '/pages/tabBar/home/home'
});

// 5. 返回上一页
uni.navigateBack({
  delta: 1
});

掌握这些路由跳转方式的区别,能让你在开发 UniApp 应用时更加得心应手,根据不同的场景选择最合适的跳转方式。

相关推荐
小码哥_常2 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮4 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀6 小时前
Vue插槽
前端·javascript·vue.js
qq_448011166 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan6 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352907 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝7 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing038 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel9 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放9 小时前
Python基础语法练习题(73)
java·前端·python