uni-app学习笔记——路由与页面跳转
小颖最近在学习小程序,怕自己前看后忘,毕竟还没开始进入项目实践中,就自己瞎倒腾嘻嘻,今天来看下 uni-app 的路由与页面跳转,小颖就简单列举下它们的用法,具体的大家可以看官网哦!啦啦啦啦啦 啦啦啦啦啦啦 就是想i偷懒嘻嘻
简单总结 uniapp常用跳转API
| API | 作用 |
|---|---|
| uni.navigateTo | 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 |
| uni.redirectTo | 关闭当前页面,跳转到应用内的某个页面。 |
| uni.reLaunch | 关闭所有页面,打开到应用内的某个页面。 |
| uni.switchTab | 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 |
| uni.navigateBack | 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。 |
官网:路由与页面跳转
路由与页面跳转
uni.navigateTo
保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。
注意:只能打开非 tabBar 页面。
示例
// 跳转页面
openNewPage (data) {
const { url } = data
console.log(url + '?id=' + data.id + '&name=' + data.name)
uni.navigateTo({
url: (url + '?id=' + data.id + '&name=' + data.name)
})
}
// 在跳转过来的页面的接收参数
onLoad (option) {
this.pageData = option
console.log(option.id); //打印出上个页面传递的参数。
console.log(option.name); //打印出上个页面传递的参数。
},
页面效果
未跳转页面 接收参数页面

发现
可以看到导航栏有回退按钮。
uni.redirectTo
关闭当前页面,跳转到应用内的某个页面。
注意:redirectTo 只能打开非 tabBar 页面。
示例
// 跳转页面
openNewPage (data) {
const { url } = data
console.log(url + '?id=' + data.id + '&name=' + data.name)
uni.redirectTo({
url: (url + '?id=' + data.id + '&name=' + data.name)
})
}
// 在跳转过来的页面的接收参数
onLoad (option) {
this.pageData = option
console.log(option.id); //打印出上个页面传递的参数。
console.log(option.name); //打印出上个页面传递的参数。
},
页面效果
未跳转页面 接收参数页面

发现
没有回退按钮,但有回到主页按钮
uni.reLaunch
关闭所有页面,打开到应用内的某个页面。
注意:
- 如果调用了 uni.preloadPage(OBJECT)不会关闭,仅触发生命周期
onHide; - reLaunch 可以打开任意页面。
示例
// 跳转页面
openNewPage (data) {
const { url } = data
console.log(url + '?id=' + data.id + '&name=' + data.name)
uni.reLaunch({
url: (url + '?id=' + data.id + '&name=' + data.name)
})
}
// 在跳转过来的页面的接收参数
onLoad (option) {
this.pageData = option
console.log(option.id); //打印出上个页面传递的参数。
console.log(option.name); //打印出上个页面传递的参数。
},
页面效果
未跳转页面 接收参数页面

发现
没有回退按钮,但有回到主页按钮
uni.switchTab
跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
注意:switchTab 只能打开 tabBar 页面。
示例
比如从跳转页面一中,点击按钮,切换当前的 tabBar
<template>
<view>
跳转页面1
<view class="page-box">
获取的页面信息id:{{pageData.id}},name:{{pageData.name}}
</view>
<view>
<button type="default" @click="changeTabBar" size="mini">跳转到个人中心</button>
</view>
</view>
</template> <script>
export default {
data () {
return {
pageData: {
id: '',
name: ''
}
}
},
// 在跳转过来的页面的接收参数
onLoad (option) {
this.pageData = option
console.log(option.id); //打印出上个页面传递的参数。
console.log(option.name); //打印出上个页面传递的参数。
},
methods: {
// 改变当前tabBar 页面
changeTabBar(){
uni.switchTab({
url: '/pages/personalCenter/personalCenter'
});
}
}
}
</script> <style> </style>
pages.json
"tabBar": {
"color": "#cdd5e2",
"selectedColor": "#55ABFF",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/index/index",
"iconPath": "./static/common/homeNo.png",
"selectedIconPath": "./static/common/home.png",
"text": "首页"
}, {
"pagePath": "pages/personalCenter/personalCenter",
"iconPath": "./static/common/userNo.png",
"selectedIconPath": "./static/common/user.png",
"text": "我的"
}]
}
页面效果
跳转前 跳转后

uni.navigateBack
关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。
注意:仅 uni.navigateTo 调用可返回上一层,uni.redirectTo、uni.reLaunch 调用不起作用,因为都会关闭页面再打开新的
示例
从首页中跳到 跳转页面2
// 跳转页面
openNewPage (data) {
const { url } = data
console.log(url + '?id=' + data.id + '&name=' + data.name)
uni.navigateTo({
url: (url + '?id=' + data.id + '&name=' + data.name)
})
}
跳转页面2中,点击 返回上一页 按钮,执行返回上一层
<template>
<view>
跳转页面2
<view>
<button type="default" @click="backPage" size="mini">返回上一页</button>
</view>
</view>
</template> <script>
export default {
data () {
return { }
},
onLoad (option) {
console.log(option.id); //打印出上个页面传递的参数。
console.log(option.name); //打印出上个页面传递的参数。
},
methods: {
backPage () {
console.log('22222222')
uni.navigateBack({
delta: 1
});
}
}
}
</script> <style> </style>
页面效果

点击 返回上一页 按钮,页面就会回到首页
EventChannel
2.8.9+ 支持 页面间事件通信通道
方法
EventChannel.emit(string eventName, any args)
触发一个事件
string eventName 事件名称
any args 事件参数
EventChannel.off(string eventName, function fn)
取消监听一个事件。给出第二个参数时,只取消给出的监听函数,否则取消所有监听函数
string eventName 事件名称
function fn 事件监听函数
参数 any args 触发事件参数
EventChannel.on(string eventName, function fn)
持续监听一个事件
string eventName 事件名称
function fn 事件监听函数
参数 any args 触发事件参数
EventChannel.once(string eventName, function fn)
监听一个事件一次,触发后失效
string eventName 事件名称
function fn 事件监听函数
参数 any args 触发事件参数
示例:
小颖就先以 eventChannel.emit 示范下如何使用
在page1.vue中
<template>
<view>
跳转页面1
<view class="page-box">
获取的页面信息id:{{pageData.id}},name:{{pageData.name}}
</view>
<view>
<button type="default" @click="changeTabBar" size="mini">跳转到个人中心</button>
<button type="default" @click="changePages" size="mini">跳到第三个页面</button>
</view>
</view>
</template> <script>
export default {
data () {
return {
pageData: {
id: '',
name: ''
},
getEventsDt: {
acceptDataFromOpenedPage: '',
someEvent: '',
}
}
},
// 在跳转过来的页面的接收参数
onLoad (option) {
this.pageData = option
console.log(option.id); //打印出上个页面传递的参数。
console.log(option.name); //打印出上个页面传递的参数。
},
onShow () {
// 打印从 页面3 给 页面1 通过事件传递的数据
console.log(this.getEventsDt)
},
methods: {
// 改变当前tabBar 页面
changeTabBar () {
uni.switchTab({
url: '/pages/personalCenter/personalCenter'
});
},
changePages () {
const _this = this;
uni.navigateTo({
url: ('/pages/toPage/page3'),
events: {
// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
acceptDataFromOpenedPage: function (data) {
_this.getEventsDt.acceptDataFromOpenedPage = data.data
console.log(data)
},
someEvent: function (data) {
_this.getEventsDt.someEvent = data.data
console.log(data)
}
},
success: function (res) {
// 通过eventChannel向被打开页面传送数据
let _obj = {
id: '222',
title: '测试'
}
res.eventChannel.emit('acceptDataFromOpenerPage', _obj)
}
})
}
}
}
</script> <style> </style>
在跳转的页面3中 page3.vue
<template>
<view>
我是页面3
</view>
</template> <script>
export default {
data () {
return { }
},
// 在跳转过来的页面的接收参数
onLoad (option) {
// // #ifdef APP-NVUE
// const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
// // #endif
// #ifndef APP-NVUE
const eventChannel = this.getOpenerEventChannel();
// #endif
eventChannel.emit('acceptDataFromOpenedPage', { data: 'data from page3' });
eventChannel.emit('someEvent', { data: 'data from page3 for someEvent' });
// 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
eventChannel.on('acceptDataFromOpenerPage', function (data) {
console.log(data)
})
},
methods: { }
}
</script> <style> </style>
打印结果:
页面1 中的打印结果

页面3 的打印结果

从页面3 返回 页面1 时 ,在 onShow 生命周期函数中 打印出来 页面3 给 页面1 传递的数据

在uni-app中一般传值就是用 url 或者是上面的方法,两种方法的对比
上面的方法的优势:
- url有长度限制,太长的字符串会传递失败,eventChannel事件回调则不回
- 跳转新页面,能根据新页面内容反传给旧页面内容,上面代码没有体现,详见官方文档
劣势:
- 事件回调是在页面加载完成后才进行的回调,在computed里的内容计算完成后才会执行事件回调,因此页面会先显示默认值,再闪一下变成正确的值
注意:
navigateTo,redirectTo只能打开非 tabBar 页面。switchTab只能打开tabBar页面。reLaunch可以打开任意页面。- 页面底部的
tabBar由页面决定,即只要是定义为tabBar的页面,底部都有tabBar。 - 不能在
App.vue里面进行页面跳转。 - H5端页面刷新之后页面栈会消失,此时
navigateBack不能返回,如果一定要返回可以使用history.back()导航到浏览器的其他历史记录。
uni-app学习笔记——路由与页面跳转的更多相关文章
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- AngularJS学习笔记(三) 单页面webApp和路由(ng-route)
就我现在的认识,路由($route)这个东西(也许可以加上$location)可以说是ng最重要的东西了.因为angular目前最重要的作用就是做单页面webApp,而路由这个东西是能做到页面跳转的关 ...
- Angular6 学习笔记——路由详解
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- Xamarin 学习笔记 - Page(页面)
本文翻译自CodeProject文章:https://www.codeproject.com/Articles/1226447/Xamarin-Notes-Xamarin-Forms-Pages 转载 ...
- Angular学习笔记—路由(转载)
创建路由 1.首先安装 Angular Router.你可以通过运行以下任一操作来执行此操作: yarn add @angular/router # OR npm i --save @angular/ ...
- Vue路由实现页面跳转的两种方式(router-link和JS)
Vue.js 路由可以通过不同的 URL 访问不同的内容,实现多视图的单页 Web 应用 1.通过 <router-link> 实现 <router-link> 组件用于设置一 ...
- 【音乐App】—— Vue-music 项目学习笔记:搜索页面开发
前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 搜索歌手歌曲 搜索历史保存 ...
- 【音乐App】—— Vue-music 项目学习笔记:推荐页面开发
前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 上一篇总结了项目概述.项目准备.页面骨架搭建.这一篇重点梳理推荐页面开发.项目github地址:https://github.com/66We ...
- 【音乐App】—— Vue-music 项目学习笔记:歌手页面开发
前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 一.歌手页面布局与设计 需 ...
- 【swift学习笔记】一.页面转跳的条件判断和传值
在转跳页面之前我们可能会判断一下是否有输入正确的数据,如下图所示,如果没有数据输入则弹出提示,不进行转跳. 一:页面转跳 1.第一个页面的上放上一个Label一个textfield和一个按钮 2.在第 ...
随机推荐
- windows配置supervisor实现nginx自启
前言 有些老项目的nginx部署在windows server上,而且服务器比较老旧,经常异常重启.鉴于个人并不熟悉windows server,因此配置supervisor自启nginx,实现win ...
- [python]为指定目录下的文件名批量加前缀
前言 功能描述:批量重命名指定目录下的文件,文件名加前缀,默认格式为"目录名_原文件名". 示例代码 import argparse import os import sys im ...
- [linux]frp内网穿透
前言 假设有如下网络拓扑 A可以访问B,但B无法访问A.A和B都能访问C.如果B需要访问A的8000端口,一般有如下方法: 网络管理员做路由转发.硬件层面网络转发,性能一般来说更好,但需要熟悉路由配置 ...
- Django模板(请用Django2.0版本完成)
1. 在learn目录下新建一个templates文件夹,里面新建一个home.html (1) 很简单的,就直接右键learn,新建文件夹,完成后,继续右键templates,创建文档,后缀名为ht ...
- 《SQLi-Labs》01. Less 1~5
@ 目录 前言 索引 Less-1 题解 原理 Less-2 题解 Less-3 题解 Less-4 题解 Less-5 题解 原理 sqli.开启新坑. 前言 对于新手,为了更加直观的看到 sql ...
- 2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大。 你有两个魔法卷轴,
2023-08-30:用go语言编写.两个魔法卷轴问题. 给定一个数组arr,其中可能有正.负.0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大. 你有两个魔法卷轴, ...
- ZooKeeper核心概念和架构
ZooKeeper简介 ZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题.它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监控所存数据的状态 ...
- JavaWeb项目开发环境搭建
1. 安装JDK1.8 2. 安装Tomcat8 此处安装解压版apache-tomcat-8.0.47,直接将压缩包解压到指定目录即可.例如,D:\apache-tomcat-8.0.47 3. 安 ...
- Unity 游戏开发、01 基础篇 | 阿发入门篇全课程学习笔记
Unity Documentation .全课程视频 .第15,24章视频 afanihao Unity入门,全课程内容个人学习笔记,简单部分一笔带过,重点内容带 2.3 窗口布局 Unity默认窗口 ...
- 安卓APK资源混淆加密重签名工具 (安卓APK加固, 代码混淆, 资源混淆,保护APK)
安卓APK资源混淆加密重签名工具,可以对安卓APK文件的代码和资源文件进行混淆加密处理,可以对安卓APK文件进行加固,对代码和资源文件进行混淆,重新签名等功能. 可以保护APK,增加破解难度等功能. ...