uniapp使用addInterceptor路由拦截(vue2 OR vue3)

这篇具有很好参考价值的文章主要介绍了uniapp使用addInterceptor路由拦截(vue2 OR vue3)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

  • 初始版本方法,可能因为能力原因存在不足,请见谅,有问题评论区~~
  • 主要通过uni.addInterceptorapi进行路由拦截
  • 目前小程序上面对于uniapp提供的路由跳转方式可以实现拦截,自带的返回按钮,底部tabbar切换无法拦截他们的跳转,但是可以监听到to和from
  • h5支持路由全部拦截
  • 支持vue2、vue3
  • 通过this.$Route或者const {proxy}=getCurrentInstance();proxy.$Route可以拿到当前页面的路由信息
  • 目前测试了h5、微信小程序、支付宝小程序、抖音小程序、安卓app。其他的待测试

pages.json 配置:

"pages":{
  {
		"path": "pages/user/index", // 路由页面
		"style": {
				"disableScroll": true
		},
    	"needLogin":true,//自定义的
		"name":"xxx",//自定义的
		"meta":{}//自定义的
	}
}

vue2使用方法:

  • 在main.js添加
import addInterceptor from '@/addInterceptor.js'
addInterceptor((to, from, next)=>{
  console.log(to, '----to----')
  console.log(from, '----from----')
  next()//继续跳转
  // next(()=>{//重定向跳转
  //   uni.navigateTo({
  //     url:'/pageA/home/info?b=b100'
  //   })
  // })
},{
  global:Vue,//全局的
  globalObject:Vue.prototype,
  routerVariable:['path','meta','name','needLogin'],//路由展示的参数(自定义的,默认存在path和query)
  indexPath:'/pages/index/index'//默认的首页
})
// 页面获取信息:
this.$Route

vue3使用方法:

  • 在main.js添加
import addInterceptor from '@/addInterceptor.js'
export function createApp() {
  const app = createSSRApp(App)
  addInterceptor((to, from, next)=>{
    console.log(to, '----to----')
    console.log(from, '----from----')
    next()//继续跳转
    // next(()=>{//重定向跳转
    //   uni.navigateTo({
    //     url:'/pageA/home/info?b=b100'
    //   })
    // })
  },{
    global:app,//全局的
    globalObject:app.config.globalProperties,
    routerVariable:['path','meta','name','needLogin'],//路由展示的参数(自定义的,默认存在path和query)
    indexPath:'/pages/index/index'//默认的首页
  })
  return {
    app
  }
}
// 页面获取信息:
import {getCurrentInstance } from 'vue'
import {onLoad} from '@dcloudio/uni-app';
setup(props, context) {
	const {proxy}=getCurrentInstance()
	onLoad(()=>{
		console.log(proxy.$Route)
	})
	return {
	}
}

返回参数示例:

  • 代码示例:
      addInterceptor((to, from, next)=>{
        console.log(to, '----to----')
        console.log(from, '----from----')
        if(to.needLogin){
          next(()=>{
            uni.switchTab({
              url:'/pages/user/index'
            })
          })
          
        }else{
          next()
        }
        
      },{
        global:Vue,
        globalObject:Vue.prototype,
        routerVariable:['path','meta','name','needLogin'],
        indexPath:'/pages/index/index'
      })
    

uniapp使用addInterceptor路由拦截(vue2 OR vue3)

核心方法addInterceptor.js

  import defaultPage from"@/pages.json";export default function addInterceptor(t,e){const a=uni.getSystemInfoSync().uniPlatform,{global:l,routerVariable:r=["path"],indexPath:u,globalObject:n=null}=e;-1==r.indexOf("path")&&r.push("path");const o={id:0};let p=!1,h="",g={},i=null;const{routerArray:s,tabBarList:c}=function(){const{pages:t,subPackages:e,tabBar:a}=defaultPage,l=[];function u(t,e=""){t.forEach(t=>{const a={};r.forEach(l=>{t[l]&&(a[l]="path"==l?e+"/"+t[l]:t[l])}),l.push(a)})}u(t),e.forEach(t=>{u(t.pages,"/"+t.root)});let n=a?a.list:[];return n=n.map(t=>"/"+t.pagePath),{routerArray:l,tabBarList:n}}();function f(e,a){e.path="/"!=e.path.slice(0,1)?"/"+e.path:e.path,a.path="/"!=a.path.slice(0,1)?"/"+a.path:a.path;const l=s.find(t=>t.path==e.path);-1!=c.indexOf(e.path)&&(l.isTabBar=!0);const r=s.find(t=>t.path==a.path);-1!=c.indexOf(a.path)&&(r.isTabBar=!0),t(Object.assign({},e,l),Object.assign({},a,r),P)}function P(t=null){t?("web"==a&&(p||history.back()),setTimeout(()=>{t()},0)):(p=!0,""!=h?setTimeout(()=>{p=!1},100):p=!1)}function b(t=0){return new Promise((e,l)=>{const r=getCurrentPages();let n=null,p={};try{"web"==a&&(n=(p=r[r.length-1])?p.__page__||{url:p.$page.fullPath}:{url:u}),"web"!=a&&(n={url:(p=r[r.length-1]).$page?p.$page.fullPath:u})}catch(t){n={url:u}}0==t?(o.prvPage=n,e(!0)):e(n)})}function d(t,e){let a=t;if("/"==a&&(a=u),!a||""==a)return;var l=[],r=a.split("?"),n=r.length>1?r[1]:"";l.push(...n.split("&")),l=l.filter(t=>""!=t);const o={};for(var p=0;p<l.length;p++){var h=l[p].split("=");o[h[0]]=h[1]}return e?!(!o[e]||""==o[e])&&{url:r[0],obj:o[e]}:{url:r[0],obj:o}}l.mixin({onShow(){o.id=(new Date).getTime()+"_"+parseInt(1e4*Math.random())}}),n&&(n.$Route={},Object.defineProperty(n,"$Route",{get(){const t=getCurrentPages();let e=null,l={};try{"web"==a&&(e=(l=t[t.length-1])?l.__page__||{fullPath:l.$page.fullPath}:{fullPath:u}),"web"!=a&&(e={fullPath:(l=t[t.length-1]).$page?l.$page.fullPath:u})}catch(t){e={fullPath:u}}const r=d(e.fullPath),n=s.find(t=>t.path==r.url);return n.query=r.obj,n}})),Object.defineProperty(o,"id",{set(t){i&&clearTimeout(i),i=setTimeout(async()=>{try{if(p)p=!1,await b();else{const t=getCurrentPages();let e=null;"web"==a&&(e=t[t.length-1].__page__||{url:t[t.length-1].$page.fullPath}),"web"!=a&&(e={url:t[t.length-1].$page.fullPath});const l={path:e.route||d(e.url).url,query:e.options||d(e.url).obj};o.prvPage&&(o.prvPage.route||o.prvPage.url||o.prvPage.fullPath)||await b(),f(l,{path:o.prvPage.route||d(o.prvPage.url||o.prvPage.fullPath).url,query:o.prvPage.options||d(o.prvPage.url||o.prvPage.fullPath).obj}),await b()}}catch(t){}},0)}});["navigateTo","redirectTo","switchTab","navigateBack","reLaunch"].forEach(t=>{uni.addInterceptor(t,{invoke(e){if("app"==a&&"navigateBack"==t){const t=getCurrentPages();let e=null,a={};const l=(e={url:(a=t[t.length-1]).$page?a.$page.fullPath:u}).url.split("?")[0];-1!=c.indexOf(l)&&(p=!0,setTimeout(()=>{p=!1},100))}return p||function(t,e){h=e,g=t;const l=getCurrentPages();let r=l[l.length-1],n=t,o={};if("web"==a&&(o=r.__page__||{url:r.$page.fullPath}),"web"!=a)try{o={url:r.$page.fullPath}}catch(t){o={url:u}}if("navigateBack"==e||"backbutton"==t.from){let t=1;"backbutton"==g.from&&(t=1),g.delta&&(t=g.delta),"web"==a&&(n=l[l.length-(1+t)].__page__||{url:l[l.length-(1+t)].$page.fullPath}),"web"!=a&&(n={url:l[l.length-(1+t)].$page.fullPath})}f({path:n.route||d(n.url).url,query:n.options||d(n.url).obj},{path:o.route||d(o.url).url,query:o.options||d(o.url).obj})}(e,t),p},complete(){h=""}})})};

具体详细的addInterceptor.js代码文章来源地址https://www.toymoban.com/news/detail-484435.html

到了这里,关于uniapp使用addInterceptor路由拦截(vue2 OR vue3)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【环境配置】使用Docker搭建LAMP环境

    这篇文章不是介绍DOCKER是什么,也不是阐述DOCKER的核心:镜像/容器和仓库之间的关系,它只是一篇让刚刚接触DOCKER的初学者,在没有完全了解DOCKER是什么之前,也能尽快的在Linux系统下面通过DOCKER来搭建一个LAMP环境,这是其一;其二才是我写这篇文章的初心,我觉得很多事情在

    2024年02月15日
    浏览(31)
  • win10设置各种闪退解决办法

    修改注册表,通过regedit打开注册表,找到\\\"HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesAppXSvc\\\"右边的“start”的值,修改为2 重启 管理员运行PowerShell,执行如下命令: (注意符号) $manifest = (Get-AppxPackage Microsoft.WindowsStore).InstallLocation + \\\'AppxManifest.xml\\\' ; Add-AppxPackage -DisableDevelopme

    2024年02月11日
    浏览(38)
  • python读取excel数据并用双y轴绘制柱状图和折线图,柱子用渐变颜色填充

    往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 python随机生成数据并用双y轴绘制两条带误差

    2024年02月10日
    浏览(36)
  • 27《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

    ​《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》 本人能力有限,如果错误欢迎批评指正。 第六章:The principles of protein folding kinetics (蛋白质折叠动力学的原理) 整个二级结构通常作为一个单元进行折叠 蛋白质倾向于以基序或二级结构的单位折叠,而不是以

    2023年04月24日
    浏览(50)
  • 计算机网络——运输层(1)暨小程送书

    我的计算机网络专栏,是自己在计算机网络学习过程中的学习笔记与心得,在参考相关教材,网络搜素的前提下,结合自己过去一段时间笔记整理,而推出的该专栏,整体架构是根据计算机网络 自顶向下 方法而整理的,包括各大高校教学都是以此顺序进行的。 面向群体:在

    2024年01月18日
    浏览(28)
  • 监控室值班人员脱岗睡岗识别算法 yolov7

    监控室值班人员脱岗睡岗识别算法基于Yolov7深度学习神经网络算法,监控室值班人员脱岗睡岗识别算法模型可以7*24小时不间断自动人员是否在工位上(脱岗睡岗玩手机),若人员没有在工位,系统则立即抓拍告警,算法鲁棒性强。YOLOv7 的发展方向与当前主流的实时目标检测

    2024年02月05日
    浏览(77)
  • 旭元数艺:数创未来,智攀高峰

    旭元数艺诞生于西安,十三朝古都拥有着丰厚的历史文化资源和丰富的艺术背景,为旭元数艺创造得天独厚的设计优势;旭元数艺通过现代科技生动再现中华民族的古老智慧和崇高价值,使区块链应用于实体产生赋能,服务三农经济活力。旭元数艺将深度挖掘丝绸之路文明,

    2024年02月02日
    浏览(19)
  • Boyer-Moore 投票算法

    这里先贴题目: 通俗点来讲,就是占领据点,像攻城那样,对消。 当你的据点有人时对消,无人时就占领。  这道题使用该算法可实现时间复杂度为O(n),空间复杂度为O(1),接下来看代码:  我们定义一个amzing先记录数组第一个数字,并且数量为0,然后遍历整个数组,当cou

    2024年02月13日
    浏览(23)
  • CentOS详细安装教程

    本文在虚拟机上安装 CentOS Linux release 7.6.1810 版本的操作系统,仅作为安装记录。 1、进入 CentOS 官网:https://www.centos.org/download/ 2、鼠标向下拉,点击 alternative downloads 3、鼠标向下拉,找到想要安装的版本,点击 Tree 4、进入到 isos/ 目录 5、进入到 x86_64/ 6、选择对应的镜像文件

    2024年02月03日
    浏览(26)
  • kali linux查看局域网下所有IP,并对指定IP攻击

    kali linux查看局域网下所有IP,并对指定IP实施局域网内攻击 首先我们打开我们熟悉的kali linux操作系统,利用指令: 来确认本机的ip地址 确认了本机的ip地址之后,利用一下的指令查看局域网下所有ip: 如下图所示: 因为自己的小米手机也连接到了同一个wifi下面,所以正好发现

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包