当前位置: 首页 > news >正文

详细分析uni-app中的页面路由基本知识(附Demo)

目录

  • 前言
  • 1. uni.navigateTo
  • 2. uni.redirectTo
  • 3. uni.reLaunch
  • 4. uni.switchTab
  • 5. uni.navigateBack
  • 6. 页面和路由
  • 7. 彩蛋
    • 7.1 tabBar知识
    • 7.2 EventChannel知识
    • 7.3 总结

前言

在 UniApp 中,页面和路由是用于导航应用内不同页面的机制

UniApp 提供一系列 API 来实现页面间的跳转、重定向、重载、切换 Tab 页面以及返回上一个页面等操作

以下主要围绕基本的几个API接口做阐述,更多的可以参考官网:uni-app中的页面和路由

1. uni.navigateTo

跳转到应用内的某个非 tabBar 页面,可以携带参数

跳转的页面会被存入历史栈中,用户可以通过 uni.navigateBack 返回

参数说明:

  • url (String):跳转的目标页面路径,可以携带参数
  • events (Object): 页面间通信使用的事件通道
  • success (Function):接口调用成功的回调函数
  • fail (Function): 接口调用失败的回调函数
  • complete (Function):接口调用结束的回调函数

代码示例:

uni.navigateTo({url: '/pages/detail/detail?id=123', // 跳转页面路径,携带参数 id=123success: function() {console.log("跳转成功");},fail: function() {console.log("跳转失败");}
});

2. uni.redirectTo

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

新的页面不会被存入历史栈中,无法通过 uni.navigateBack 返回(中过一次坑,索性记住了)

参数说明:

  • url (String):目标页面路径
  • success (Function): 成功回调
  • fail (Function):失败回调
  • complete (Function):完成回调

代码示例:

uni.redirectTo({url: '/pages/login/login', // 跳转到登录页面success: function() {console.log("重定向成功");},fail: function() {console.log("重定向失败");}
});

3. uni.reLaunch

关闭所有页面,重新打开应用内的某个页面

适用于需要彻底重启应用导航的场景,例如登录后重启整个应用

参数说明:

  • url (String):目标页面路径
  • success (Function): 成功回调
  • fail (Function):失败回调
  • complete (Function):完成回调
uni.reLaunch({url: '/pages/home/home', // 重新打开首页success: function() {console.log("应用重启并跳转成功");},fail: function() {console.log("跳转失败");}
});

4. uni.switchTab

跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面

适用于应用含有多个 tabBar 页面时的导航

参数说明:

  • url (String):目标 tabBar 页面路径
  • success (Function): 成功回调
  • fail (Function):失败回调
  • complete (Function):完成回调
uni.switchTab({url: '/pages/tab/home', // 跳转到 tabBar 页面的首页success: function() {console.log("切换 Tab 成功");},fail: function() {console.log("切换 Tab 失败");}
});

5. uni.navigateBack

关闭当前页面,返回上一层页面,支持传递返回的层级

参数说明:delta (Number)
返回的页面层级,默认值为 1,即返回上一层

uni.navigateBack({delta: 1, // 返回上一层页面success: function() {console.log("返回成功");},fail: function() {console.log("返回失败");}
});

6. 页面和路由

<template><view class="container"><button @click="goToDetail">跳转到详情页面</button><button @click="redirectToLogin">重定向到登录页面</button><button @click="switchToTab">切换到 Tab 页面</button><button @click="relaunchApp">重新启动应用并跳转</button></view>
</template><script>
export default {methods: {goToDetail() {uni.navigateTo({url: '/pages/detail/detail?id=456',success: () => {console.log('成功跳转到详情页');}});},redirectToLogin() {uni.redirectTo({url: '/pages/login/login',success: () => {console.log('成功重定向到登录页');}});},switchToTab() {uni.switchTab({url: '/pages/tab/home',success: () => {console.log('成功切换到 Tab 页面');}});},relaunchApp() {uni.reLaunch({url: '/pages/home/home',success: () => {console.log('成功重启应用并跳转');}});}}
}
</script>

详情页:

<template><view class="container"><text>这是详情页面,参数 ID 为 {{ id }}</text><button @click="goBack">返回上一页</button></view>
</template><script>
export default {data() {return {id: ''};},onLoad(options) {this.id = options.id; // 获取页面跳转时传递的参数},methods: {goBack() {uni.navigateBack({delta: 1, // 返回上一层success: () => {console.log('成功返回上一页');}});}}
}
</script>

7. 彩蛋

7.1 tabBar知识

在 UniApp 中,tabBar 页面和非 tabBar 页面是指不同类型的页面布局方式,具体体现在导航方式上

  1. tabBar 页面

应用底部带有 固定导航栏(即 tabBar)的页面,这种页面结构允许用户通过底部的导航栏在多个页面之间快速切换
tabBar 是 全局设置的,始终固定在应用的底部,并且通常包含多个页面的入口

主要特点有如下:

  • 位置固定:tabBar 始终位于应用界面的底部,并且不可隐藏
  • 快速切换:用户可以通过点击 tabBar 上的图标在不同页面间快速切换
  • 互相独立:每个 tabBar 页面是相互独立的,切换时不会记录页面历史栈,无法通过 uni.navigateBack 返回之前的 tabBar 页面
  • 全局配置:在 pages.json 文件中统一配置

示例配置 (pages.json):

{"tabBar": {"color": "#7A7E83","selectedColor": "#3cc51f","backgroundColor": "#ffffff","borderStyle": "black","list": [{"pagePath": "pages/home/home","text": "首页","iconPath": "static/home.png","selectedIconPath": "static/home_selected.png"},{"pagePath": "pages/user/user","text": "用户","iconPath": "static/user.png","selectedIconPath": "static/user_selected.png"}]}
}

list 数组定义 tabBar 上显示的页面(如首页、用户页面)
每个页面的 pagePath 必须对应应用中的实际页面路径

tabBar 页面切换示例:

uni.switchTab({url: '/pages/home/home',success: function() {console.log("成功切换到首页");}
});
  1. 非 tabBar 页面
    非 tabBar 页面是指不属于底部导航栏的页面,这些页面一般通过其他页面跳转(例如 uni.navigateTo)进入

非 tabBar 页面可以被加入历史栈,允许用户返回之前访问的页面

主要特点有如下:

  • 历史栈管理:非 tabBar 页面会记录在历史栈中,用户可以通过 uni.navigateBack 返回到前一个页面
  • 自由跳转:这些页面通常用于展示详细内容、用户设置等不常用的页面,可以通过按钮、链接等进行跳转
  • 没有固定导航栏:这些页面没有底部的导航栏(tabBar),也不会出现在全局导航中

非 tabBar 页面跳转示例:

uni.navigateTo({url: '/pages/detail/detail?id=123',success: function() {console.log('跳转成功');}
});
  1. 区别总结
特性tabBar 页面非 tabBar 页面
位置带有底部的固定导航栏没有固定导航栏
切换方式通过 tabBar 快速切换,使用 uni.switchTab通过页面跳转,使用 uni.navigateTo、uni.redirectTo
历史记录不记录历史栈,不能通过 uni.navigateBack 返回记录历史栈,可以通过 uni.navigateBack 返回
场景常用于应用的主要页面(如首页、分类、个人中心)常用于详细页面或次要页面(如详情页、设置页面)

使用建议

  1. tabBar 页面 适合放置应用的主导航页面,如首页、分类页、个人中心等核心功能页面,方便用户快速切换
  2. 非 tabBar 页面 适合用来展示详细内容、执行某些操作或提供额外功能

7.2 EventChannel知识

EventChannel 是 UniApp 提供的页面间通信机制,主要用于在页面跳转时传递复杂数据(如函数、对象等)和在跳转后保持页面之间的通信

例如,页面 A 跳转到页面 B 时,可以通过 EventChannel 传递消息,B 页面可以接收消息,并且可以在 B 页面处理后将数据返回给 A 页面

核心功能

  • 发送数据:通过 eventChannel.emit 方法发送数据到目标页面

  • 接收数据:通过 eventChannel.on 方法在目标页面接收数据

  • 获取 EventChannel:通过 getOpenerEventChannel 方法获取来源页面的 eventChannel

  • emit(eventName, data):发送数据到目标页面。
    eventName (String):事件名称
    data (Any):要发送的数据

  • on(eventName, callback): 监听并接收来自来源页面的数据
    eventName (String):事件名称
    callback (Function):事件触发时的回调,接收发送的数据

  • getOpenerEventChannel():获取来源页面的 EventChannel 对象

使用 EventChannel 的 Demo

  1. 页面 A:发送消息到页面 B
    页面 A 跳转到页面 B,并通过 EventChannel 向 B 页面发送数据
    B 页面处理后可以通过 EventChannel 返回数据
<template><view class="container"><button @click="goToDetail">跳转到详情页面并发送数据</button></view>
</template><script>
export default {methods: {goToDetail() {const that = this;uni.navigateTo({url: '/pages/detail/detail', // 跳转到详情页面events: {// 事件监听,等待详情页返回的数据acceptDataFromDetailPage: function(data) {console.log('接收到详情页返回的数据:', data);uni.showToast({title: `详情页返回数据: ${data}`,icon: 'none'});}},success: function (res) {// 通过 EventChannel 发送数据到详情页res.eventChannel.emit('sendDataToDetailPage', { id: 123, name: '张三' });}});}}
}
</script>
  1. 页面 B (detail.vue)
<template><view class="container"><text>这是详情页面</text><button @click="sendBack">返回上一页并传递数据</button></view>
</template><script>
export default {data() {return {id: '',name: ''};},onLoad() {// 获取来源页面的 EventChannelconst eventChannel = this.getOpenerEventChannel();// 监听来源页面发送的数据eventChannel.on('sendDataToDetailPage', (data) => {console.log('收到页面 A 传来的数据:', data);this.id = data.id;this.name = data.name;});},methods: {sendBack() {// 通过 EventChannel 向来源页面发送数据const eventChannel = this.getOpenerEventChannel();eventChannel.emit('acceptDataFromDetailPage', `数据已处理,ID 为 ${this.id}`);// 返回上一页uni.navigateBack();}}
}
</script>

具体逻辑如下:

当用户点击按钮时,页面 A 通过 uni.navigateTo 跳转到页面 B
跳转时,使用 events 属性定义了一个事件 acceptDataFromDetailPage,用于接收页面 B 的返回数据
在 success 回调中,使用 res.eventChannel.emit(‘sendDataToDetailPage’, …) 向 B 页面发送数据

在页面 B:
使用 getOpenerEventChannel() 获取 A 页面的 EventChannel 对象
使用 eventChannel.on(‘sendDataToDetailPage’, …) 来接收 A 页面传来的数据,并将数据展示在页面上
点击按钮后,使用 eventChannel.emit(‘acceptDataFromDetailPage’, …) 将处理后的数据发送回页面 A,随后返回上一页

EventChannel 适用于需要在页面跳转过程中传递复杂数据或需要双向通信的场景
通过 emit 和 on 方法,页面间可以方便地进行数据的传递和处理

7.3 总结

  • navigateTo, redirectTo 只能打开非 tabBar 页面
  • switchTab 只能打开 tabBar 页面
  • reLaunch 可以打开任意页面
  • 页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar
  • 不能在首页 onReady 之前进行页面跳转
  • H5端页面刷新之后页面栈会消失,此时navigateBack不能返回,如果一定要返回可以使用history.back()导航到浏览器的其他历史记录

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LeetCode 面试经典150题 67.二进制求和
  • keil的debug功能
  • shell脚本定时任务通知到钉钉
  • 学习threejs,绘制二维线
  • vue2项目实现国际化(若依框架示例)
  • Java 全栈开发中的最佳实践:从前端到后端的完整流程
  • Swing模拟银行柜台系统
  • Dify 中的讯飞星火平台工具源码分析
  • 【嵌入式硬件】续流二极管
  • 流量特征随机ua修改
  • Python 学习之虚拟环境
  • 一元运算符(自增自减)
  • 力扣P1706全排列问题 很好的引入暴力 递归 回溯 dfs
  • Docker 的安装部署与基本使用
  • 使用 from __future__ import annotations 语句来允许在类型注释中使用尚未定义的类名
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【css3】浏览器内核及其兼容性
  • 2017 年终总结 —— 在路上
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Bytom交易说明(账户管理模式)
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • jquery ajax学习笔记
  • Laravel5.4 Queues队列学习
  • Linux中的硬链接与软链接
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Redux 中间件分析
  • vue-router的history模式发布配置
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 大主子表关联的性能优化方法
  • 基于axios的vue插件,让http请求更简单
  • 前端性能优化——回流与重绘
  • 我的zsh配置, 2019最新方案
  • 协程
  • 原生Ajax
  • 阿里云重庆大学大数据训练营落地分享
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • # Panda3d 碰撞检测系统介绍
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 安徽锐锋科技IDMS系统简介
  • #APPINVENTOR学习记录
  • $(selector).each()和$.each()的区别
  • (003)SlickEdit Unity的补全
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (层次遍历)104. 二叉树的最大深度
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】