uni-app 之 页面路由

概述

uni-app 的路由功能用于管理应用中的页面跳转和导航。与传统 Web 开发不同,uni-app 支持多端运行,因此其路由机制针对不同平台进行了优化和适配。

路由配置

pages.json 配置

在 pages.json 文件中配置应用的页面路径和窗口表现:

json 复制代码
{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "首页"
      }
    },
    {
      "path": "pages/detail/detail",
      "style": {
        "navigationBarTitleText": "详情页"
      }
    }
  ]
}

页面跳转方式

在模板中使用 navigator 组件实现页面跳转:

html 复制代码
<navigator url="/pages/detail/detail?id=123" hover-class="navigator-hover">
  跳转到详情页
</navigator>

2. API 编程式跳转

uni.navigateTo()

保留当前页面,跳转到应用内的某个页面:

javascript 复制代码
uni.navigateTo({
  url: "/pages/detail/detail?id=123",
});
uni.redirectTo()

关闭当前页面,跳转到应用内的某个页面:

javascript 复制代码
uni.redirectTo({
  url: "/pages/detail/detail?id=123",
});
uni.switchTab()

跳转到 tabBar 页面:

javascript 复制代码
uni.switchTab({
  url: "/pages/index/index",
});
uni.reLaunch()

关闭所有页面,打开到应用内的某个页面:

javascript 复制代码
uni.reLaunch({
  url: "/pages/index/index",
});
uni.navigateBack()

关闭当前页面,返回上一页面或多级页面:

javascript 复制代码
uni.navigateBack({
  delta: 1,
});

路由传参

URL 参数传递

javascript 复制代码
// 传递参数
uni.navigateTo({
  url: '/pages/detail/detail?id=123&name=test'
})

// 接收参数
onLoad(options) {
  console.log(options.id)   // 123
  console.log(options.name) // test
}

对象参数传递

javascript 复制代码
// 使用 encodeURIComponent 传递复杂对象
const params = { id: 123, data: { name: 'test' } }
uni.navigateTo({
  url: `/pages/detail/detail?params=${encodeURIComponent(JSON.stringify(params))}`
})

// 接收参数
onLoad(options) {
  const params = JSON.parse(decodeURIComponent(options.params))
}

路由生命周期

页面生命周期函数

javascript 复制代码
export default {
  onLoad(options) {
    // 页面加载时触发
  },
  onShow() {
    // 页面显示时触发
  },
  onReady() {
    // 页面初次渲染完成时触发
  },
  onHide() {
    // 页面隐藏时触发
  },
  onUnload() {
    // 页面卸载时触发
  },
};

页面栈管理

获取当前页面栈:

javascript 复制代码
// 获取当前页面栈实例
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];

注意事项

  1. 页面栈限制:小程序端页面栈最多 10 层
  2. tabBar 页面 :只能使用 uni.switchTab() 跳转
  3. 返回按钮:非 tabBar 页面左上角有返回按钮
  4. 参数长度限制:URL 参数过长可能导致截断
  5. 跨端兼容:不同平台路由行为可能存在差异

常见问题解决

页面传参丢失

确保参数正确编码:

javascript 复制代码
// 错误示例
url: "/pages/detail/detail?data=" + JSON.stringify(obj);

// 正确示例
url: `/pages/detail/detail?data=${encodeURIComponent(JSON.stringify(obj))}`;

页面返回不刷新

在 onShow 生命周期中处理数据更新逻辑:

javascript 复制代码
export default {
  onShow() {
    // 每次页面显示时重新加载数据
    this.loadData();
  },
};
相关推荐
码间留白3 天前
六轮真机实验后,我把鸿蒙直播推流的 UI 全逼成了原生——uni-app 适配 HarmonyOS NEXT 完整复盘
uni-app·鸿蒙·harmonyos next·直播推流·arkts/arkui
wuxianda10305 天前
2026 苹果审核 4.3 (a) 被拒全解析|Guideline 4.3a spam 马甲包拒审原因 + 避坑方案
flutter·uni-app·苹果上架
头发还在的女程序员7 天前
基于 Spring Boot + Vue 3 + uni-app 的灵活用工系统:四端架构与业务流程设计
vue.js·spring boot·uni-app·灵活用工·灵工系统
Dumbness8 天前
订阅消息弹窗必须在用户点击里调:联调实验室里 timing 和 Mock 支付通知踩的坑
javascript·uni-app
码间留白9 天前
uni-app 鸿蒙离线打包:一个改动从源码到真机要穿过几条链
uni-app·鸿蒙·deveco·离线打包·uts插件
多客:duokelijie10 天前
代练订单系统选型思路:跨品类游戏接入、订单分层管理、自动结算逻辑拆解!
数据库·mysql·微信小程序·前端框架·uni-app·php·持续部署
码间留白10 天前
鸿蒙端对接 BLE 血压计:从一次握手到读数入库(二)设备篇
物联网·uni-app·鸿蒙·蓝牙ble·血压计
华玥作者11 天前
Vue 3 + TypeScript + uni-app 组件库推荐:hy-app(华玥组件库)
vue.js·typescript·uni-app
FinelyYang11 天前
uniapp使用kkfileview在线预览ppt,excel,word,pdf类型文件
pdf·uni-app·powerpoint
2501_9160088912 天前
iPhone 设备信息查看,用 KeyMob 看型号、序列号、电池健康和 UDID
android·ios·小程序·https·uni-app·iphone·webview