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模板网!

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

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

相关文章

  • 下载盗版网站视频并将.ts视频文件合并

    我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定的url就可以获取到.ts文件

    2024年02月07日
    浏览(83)
  • 视频爬虫:解析m3u8文件 python m3u8库,m3u8文件中.ts视频流的解密下载

    这里需要引用的库是: from Crypto.Cipher import AES 有坑哈, python3.0 之后直接安装crypto你会发现不管怎么着都会报错。 经过查找资料找到了原因,原来是20年之后crypto已经被pycryptohome替换掉啦, 如果之前安装过crypyo 活pycrypto需要先卸载 然后再安装 pycryptohome 就可以啦 首先我们需

    2024年02月14日
    浏览(65)
  • 【视频】使用OBS将MP4推流至腾讯云直播

    OBS官网:https://obsproject.com/ OBS支持Win、Mac、Linux,如果下载速度很慢,建议使用迅雷下载 默认会有一个“场景”,如果想继续添加可以点击“+”按钮 1)点击“来源”窗口中“+”按钮 2)支持的媒体源如下 其中:“图像”是指图片;如果要将推流mp4等视频文件,选择“媒体源

    2024年02月13日
    浏览(47)
  • 如何使用 ffmpeg 对视频进行切分、合并

    1. 按照视频时间点进行截取, 起止点:00:00:06 ~ 00:20:36 ffmpeg -ss 00:00:06 -to 00:20:36 -accurate_seek -i \\\"input.mp4\\\" -avoid_negative_ts 1 -c copy \\\"ouput.mp4\\\" -y 2.  分离视频和音频 ffmpeg -i \\\"input.mp4\\\" -vcodec copy -an \\\"out-vod.mp4\\\" ffmpeg -i \\\"input.mp4\\\" -acodec copy -vn \\\"out-sound.m4a\\\"  3. 去除水印(指定区域模糊化,以

    2024年02月09日
    浏览(38)
  • Python合并一个 Excel 里面的多张表

    刚需要将入职五个月的日报汇总, 但是每日都是在通一个excel里面新建副表写日报,现在已经积累了84张附表(每周4张,总共21周),手动复制粘贴每张表格是相当耗时的工作。在这个时候,我开始思考:有没有一种更快捷的方法来合并这些表格呢?于是,我想到了使用Python。

    2024年02月05日
    浏览(41)
  • 用python批量合并word文件并统一调整图片大小

    注:setpicsize宏文件先要放如word中的视图-宏中,宏文件代码如下 Sub setpicsize() Dim n On Error Resume Next For n = 1 To ActiveDocument.InlineShapes.Count ActiveDocument.InlineShapes(n).Height = 27.31 * 20 ActiveDocument.InlineShapes(n).Width = 19.33 * 20 Next n End Sub  

    2024年02月02日
    浏览(59)
  • ffmpeg——同时剪辑多个视频并合并

    基本语法 所用的ffmpeg的语法: 1.剪辑单个视频 ffmpeg -i [2021-11-24-1-2.mp4] -vcodec copy -acodec copy -ss [00:00:00] -to [00:00:05] [output/p3.mp4][ ]中三个参数依次为:剪辑视频源文件;第一个时间为剪辑的起始时间;第二个时间为视频持续的时间长度; 剪辑好的文件名 2.合并视频片段 ffmpeg -

    2024年02月16日
    浏览(43)
  • [python]将多张图片合并为单个pdf文件

    最近有个个人需求是要把多个图片文件合并为一个PDF文件,这样方便用PDF阅读器连续看,避免界面点一下,只会图片放大。( 比如看漫画 ) 主要思路是先把单张图片转换成单个PDF文件,然后把PDF文件进行合并。原先是用WPS的转换工具做的,但WPS每次只能批量转换30张,如果

    2024年03月09日
    浏览(100)
  • ffmpeg 特效 转场 放大缩小

    -i input.mp4//这个是原始文件 -i image1.png//第一个水印图片 -i image2.png//第二个水印图片 -y output.mp4//输出文件 [1:v]这个里头两个参数,1表示的是操作对象的编号。在本例中 0就是原始视频文件input.mp4, 1就是image1.png, 2就是image2.png, 3就是output.mp4。 而另一个参数v表示操作对象里的

    2024年02月07日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包