🌸 需求
在uni-app框架里,当点击应用里的链接时,需要判断链接是否是应用内的链接,如果是则跳转到应用链接的界面,如果不是,则跳到当前链接地址。
🙌 分析
- uni-app里的链接是指page.json里声明好的页面路由
- 判断是否uni-app应用内的链接(也称之为路由),关键需要拿到当前路由页面,当前路由页面可以通过getCurrentPages方法获得。
- 跳转到应用内的页面,有可能是tab页,也有可能是普通的页面,所以在跳转应用页面的时候,需要注意跳转方法(方式)并不一样。尽量不要使用
reLaunch,因为这会导致有些已存储的数据有可能丢失!!!
💖 实现
以下方法仅仅是判断是否uni-app应用内的路由,封装好,以便做后续的调用。
判断是否应用内页面方法封装
/**
* @function judgeSelfRouter 判断是否uni-app应用内的路由
* @param {String} url 访问路径 可以是https:xxx.com。也可以是应用路由/home
* @returns {Boolean} true本应由路由 false外部链接
*/
export const judgeSelfRouter = (url) => {
const preUrl = url.split('?')[0]
let routes = getCurrentPages()
let selfRouter = routes && routes[0] && routes[0].$router ? routes && routes[0] && routes[0].$router : null
if (selfRouter) {
let matched = selfRouter.matcher.match(preUrl).matched
if (matched && matched.length > 0){
// uni.navigateTo({url}); // 跳转到应用内的路由
return true
}
}
// window.open(url,'_blank'); // 跳转到外部页面
return false
}
跳转应用内页面的方法
注意:
-
⚡
getCurrentPages()仅用于展示页面栈的情况,请勿修改页面栈,以免造成页面状态错误。 -
⚡ 不能在
App.vue里面进行页面跳转。
1️⃣ 非tabbar页面——navigateTo或redirectTo
navigateTo 或 redirectTo 只能打开非 tabBar 页面。
uni.redirectTo({ url: '/pages/logs/logs' });
// 或
uni.navigateTo({ url: '/pages/index/index' });
2️⃣ tabbar页面——switchTab
页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。
switchTab 只能打开 tabBar 页面。
uni.switchTab({
url: '/pages/index/index'
});
3️⃣任意页面——relaunch
- relaunch 可以打开任意页面。
uni.reLaunch({
url: 'test?id=1'
});
getCurrentPages简单介绍
getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
框架以栈的形式维护当前的所有页面。路由切换与页面栈的关系如下:
| 路由方式 | 页面栈表现 |
|---|---|
| 初始化 | 新页面入栈 |
| 打开新页面 | 新页面入栈 |
| 页面重定向 | 当前页面出栈,新页面入栈 |
| 页面返回 | 当前页面出栈 |
| Tab 切换 | 页面全部出栈,只留下新的 Tab 页面 |