uni-app判断是否应用路由

879 阅读2分钟

🌸 需求

在uni-app框架里,当点击应用里的链接时,需要判断链接是否是应用内的链接,如果是则跳转到应用链接的界面,如果不是,则跳到当前链接地址。

🙌 分析

  • uni-app里的链接是指page.json里声明好的页面路由
  • 判断是否uni-app应用内的链接(也称之为路由),关键需要拿到当前路由页面,当前路由页面可以通过getCurrentPages方法获得。
  • 跳转到应用内的页面,有可能是tab页,也有可能是普通的页面,所以在跳转应用页面的时候,需要注意跳转方法(方式)并不一样。尽量不要使用reLaunch,因为这会导致有些已存储的数据有可能丢失!!!

💖 实现

以下方法仅仅是判断是否uni-app应用内的路由,封装好,以便做后续的调用。

判断是否应用内页面方法封装

image.png

/**
 * @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页面——navigateToredirectTo

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

uni.reLaunch({
	url: 'test?id=1'
});

getCurrentPages简单介绍

getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。

框架以栈的形式维护当前的所有页面。路由切换与页面栈的关系如下:

路由方式页面栈表现
初始化新页面入栈
打开新页面新页面入栈
页面重定向当前页面出栈,新页面入栈
页面返回当前页面出栈
Tab 切换页面全部出栈,只留下新的 Tab 页面