最新要闻
- 每日热门:河洛肉鸽卡牌《天外武林》上架Steam 明年1月发售
- 别急换机!本月还有6场发布会:劝你先等等再买
- 世界微动态丨《阿凡达:水之道》预测票房仅25.11亿!远不到《长津湖》一半
- 【环球新要闻】Epic大促开启 连续15天免费送游戏!75折套娃优惠券来了
- 【天天播资讯】RTX 4070 Ti跑分首曝:猛升46%、超越RX 7900 XTX
- 速度飞起!全球首款232层闪存SSD细节公布:TLC颗粒、拒绝PCIe 5.0
- 快资讯:一图看懂moto新机:二代骁龙8 3699元!价格屠夫简直了
- 天天热议:微软2025年目标:确保非洲再增加1亿人访问互联网
- 焦点信息:火球坠入浙江 警方带走疑似陨石碎片:现场砸出六七厘米深坑
- 环球观热点:不调好不上市 moto X40驯服二代骁龙8:1小时王者温度仅42度
- Nature年度十大人物出炉:猪心移植手术团队负责人等入选
- 饱满如水滴!联想moto X40开箱图赏
- 5000mAh大电池+120Hz屏 899元联想moto G53图赏
- 109度大电池能跑730KM!岚图追光预售:32.29万元起
- 视焦点讯!努比亚Z50散热堆料离谱:散热总面积达到36462m㎡
- 中国光纤之父赵梓森逝世 享年91岁:拉出了我国第一根光纤
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
每日速讯:Blazor和Vue对比学习(进阶.路由导航五):路由守卫
路由守卫,可以认为是设置在导航源和目标之间的中间件。Vue在代码上,表现为命名约定的钩子(类似于生命周期钩子),而Blazor会更复杂一些。Vue Router的路由守卫功能非常完善,而Blazor则相对简陋。同时,Blazor的路由守卫需要结合生命周期函数和事件,使用起来反而更加复杂。
一、Vue Router的路由守卫
(资料图)
1、Vue Router的路由守卫,大致可以分为三类。它们的调用顺序,如下图所示:
- 全局守卫,所有导航都会经过,有三个钩子,分别为beforeEach(全局前置守卫)、beforeResove(全局解析守卫)、afterEach(全局后置守卫)
- 路由守卫,在路由文件的路由route中定义的守卫,导航至宿主路由时会经过,只有一个钩子,beforeEnter(进入路由前)
- 组件守卫,在组件中定义的钩子,有两个,失活组件中,经过beforeRouteEnter(进入组件前);激活组件中,经过beforeRouteLeave/onBeforeRouteLeave(离开组件前)。
- 特殊:还有一个组件守卫,但在同组件不同路径间导航时,如路由/user/:id,从/user/1导航到/user/2时,经过beforeRouteUpdate/onBeforeRouteUpdate(组件更新前)
2、基本使用
(1)在路由文件Router/index.js中,设置全局守卫和路由独享守卫
import { createRouter, createWebHistory } from "vue-router"//路由=========================================================================================================const routes = [ { path: "/", name: "index", component: ()=> import("../views/Index.vue"), }, { path: "/student", name: "student", meta: { requiresAuth: true }, //meta,称之为元信息,可以标注一些路由的特性,本质上就是一些标记 component: ()=> import("../views/Student.vue"), }, { path: "/student-detail", name: "student-detail", component: ()=> import("../views/StudentDetail.vue"), //(3)路由独享守卫*************************************************** //只在进入路由时触发,如从/student-detail/1,导航到/student-detail/2时,不会调用 beforeEnter: (to,from)=>{ console.log("路由独享守卫") } }]//路由器========================================================================================================const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), routes})//全局守卫=======================================================================================================//(2)全局前置守卫*******************************************************router.beforeEach((to,from)=>{ //①to为目标路由,from为源路由,可以调用name、path、params、query、meta等信息,如to.meta,from.name等 //②如果返回值为true或undefine,则进入下一个路由守卫;如返回false,则导航停止 //③如返回一个路由对象,可以设置导航转向,如【return {name:"index"}】 console.log("全局前置守卫") return true /*④路由权限,可以在全局前置守卫进行,如下所示 if(to.meta.requiresAuth && to.name !== "Login"){ return {name:"Login"} } */})//(5)全局解析守卫*******************************************************router.beforeResolve((to,from)=>{ //此时,组件守卫、路由守卫和异步路由均已经解析完成 console.log("全局解析守卫") return true})//(6)全局后置守卫(钩子)*************************************************router.afterEach((to, from, failure) => { //严格来说,不能称为守卫,因为此时导航已经完成,无法对导航进行干预 //此时可以完成更改页面标题等辅助功能 console.log("全局后置钩子")})export default router
(2)在组件中设置组件守卫
<script setup>import { onBeforeRouteLeave, onBeforeRouteUpdate } from "vue-router";/*(4)组件守卫(进入激活组件前) *如果不是组合式API,还可以调用beforeRouteEnter。 *不能获取组件实例this!因为当守卫执行时,组件实例还没被创建 beforeRouteEnter((to, from)=>{ console.log("组件守卫,进入组件前")})*///(*)组件守卫(组件更新前)// 在当前路由改变,但是该组件被复用时调用。如路径/users/:id,在/users/1和/users/2之间跳转的时候// 在这种情况发生的时候,组件已经挂载好了,导航守卫可以访问组件实例thisonBeforeRouteUpdate((to,from)=>{ console.log("组件守卫,组件更新前")})//(1)组件守卫(离开失活组件前)// 在导航离开渲染该组件的对应路由时调用// 与beforeRouteUpdate一样,它可以访问组件实例thisonBeforeRouteLeave((to,from)=>{ console.log("组件守卫,离开组件前")})</script>这里是关于首页Index.vue
二、Blazor的路由守卫
1、Blozor中没有明确提出路由守卫的概念,但可以从路由守卫的角度去理解。目前Blazor提供的路由守卫很简单,主要划分三类:
- 全局路由守卫:OnNavigateAsync,当新导航发生时执行的回调。
- 组件路由守卫:由NavigationManager提供,一个是导航正在离开RegisterLocationChangingHandler(方法,参数是一个Func委托),一个是导航已经离开LocationChanged(事件)。
- 特殊路由组件:
:导航等待期间的内容; :可以强制导航离开时进行弹窗确认。 - 实际上只有三个守卫,执行的顺序为:RegisterLocationChangingHandler > OnNavigateAsync >LocationChanged
2、基本使用:
(1)全局路由守卫OnNavigateAsync,在App.razor根组件中定义
@inject NavigationManager Navigation...... @code { private async Task OnNavigateAsync(NavigationContext context) { Console.WriteLine("全局守卫"+context.Path); //可以进行路由转向 //Navigation.NavigateTo("/student"); /*OnNavigateAsync本质上是导航时执行的一个回调,如果在这个回调中执行异步方法,应该在方法中传入context的CancellationToken属性 *如导航到/about,但在异步方法PostAsJsonAsync还在执行时,我们又快速改变了导航地址,此时PostAsJsonAsync不应再执行 *所以传入context.CancellationToken,导航异常变化时,会将CancellationToken的IsCancellationRequest设置为true,取消异步方法 if (context.Path == "/about") { var stats = new Stats { Page = "/about" }; await Http.PostAsJsonAsync("api/visited", stats, context.CancellationToken); } else if (context.Path == "/store") { var productIds = [345, 789, 135, 689]; foreach (var productId in productIds) { context.CancellationToken.ThrowIfCancellationRequested(); Products.Prefetch(productId); } } */ }}
(2)组件路由守卫RegisterLocationChangingHandler和LocationChanged,在组件中定义
//RegisterLocationChangingHandler是非托管资源,LocationChanged是事件,两者在组件销毁时,都要手工释放内存//所以组件必须实现IDisposable接口,然后在生命周期函数Dispose()中释放资源@page "/"@implements IDisposable@inject NavigationManager Navigation首页 @code{ //RegisterLocationChangingHandler,导航正在发生前=========================================================== //在生命周期函数OnAfterRender中,调用Navigation.RegisterLocationChangingHandler方法,方法参数为守卫方法 //Navigation.RegisterLocationChangingHandler方法的返回值类型为IDisposable,在组件销毁时,调用Dispose()销毁 //此时导航还未实际发生,可以进行导航停止、转向等操作 private IDisposable? registration; protected override void OnAfterRender(bool firstRender) { if (firstRender) { registration = Navigation.RegisterLocationChangingHandler(OnLocationChanging); } } private ValueTask OnLocationChanging(LocationChangingContext context) { Console.WriteLine("组件守卫:OnLocationChanging导航正在发生前"); Console.WriteLine(context.TargetLocation); //目标地址 Console.WriteLine(context.HistoryEntryState); //目标地址关联的历史记录状态 Console.WriteLine(context.IsNavigationIntercepted); //是否从链接截获了导航 if (context.TargetLocation.Contains("student")) { context.PreventNavigation(); //阻止导航 } return ValueTask.CompletedTask; } //LocationChanged,导航已经发生============================================================================= //在生命周期函数OnInitialized中,订阅Navigation.LocationChanged事件,事件处理函数为守卫方法 //在组件销毁时,在组件生命周期方法中,移除事件订阅 //此时导航已经发生,可以导航转向操作,但不能停止导航 protected override void OnInitialized() { Navigation.LocationChanged += LocationChanged; } private void LocationChanged(object? sender, LocationChangedEventArgs args) { Console.WriteLine("组件守卫:LocationChanged导航已经发生"); Console.WriteLine(args.Location);//目标地址 Console.WriteLine(args.HistoryEntryState);//目标地址关联的历史记录状态 Console.WriteLine(args.IsNavigationIntercepted);//是否从链接截获了导航 } //在生命周期函数Dispose中,移除订阅的事件,并销毁非托管资源registration=========================================== public void Dispose() { Navigation.LocationChanged -= LocationChanged; registration?.Dispose(); }}
(3)
...... @code { private async Task OnNavigateAsync(NavigationContext context) { await Task.Delay(2000);//通过在全局守卫中延迟2秒,来测试正在导航中......
的功能 }}
(4)
@page "/"@inject IJSRuntime JSRuntime@inject NavigationManager Navigation//ConfirmExternalNavigation属性,确定当导航到外部地址时的行为,如为true,则会弹窗提示;如为false,则不会弹窗提示,直接导航//ConfirmExternalNavigation属性,无论是true或false,导航到内部地址时,都会弹窗提示Microsoft homepage@code { private void Navigate() { Navigation.NavigateTo("/student"); } private async Task OnBeforeInternalNavigation(LocationChangingContext context) { //直接通过JS交互,调用window对象的confirm弹窗方法 //OnBeforeInternalNavigation回调方法,LocationChangingContext上下文,这个对象和RegisterLocationChangingHandler中的一样 //如果用户在弹窗中选择取消,则调用LocationChangingContext的PreventNavigation方法,停止导航 var isConfirmed = await JSRuntime.InvokeAsync ("confirm","确定要离开吗?"); if (!isConfirmed) { context.PreventNavigation(); } }}
-
mvn 打包报错:no compiler is provided in this environment
最近公司换了电脑,系统也从win7升级到win11,开发环境都重新安装了一遍,然后在idea用mvn执行打包命令mv...
来源: 每日速讯:Blazor和Vue对比学习(进阶.路由导航五):路由守卫
观点:【从零开始学爬虫】采集收视率排行数据
mvn 打包报错:no compiler is provided in this environment
天天微动态丨JavaScript DOM的性能优化详解
每日资讯:VUE的实例的生命周期
每日热门:河洛肉鸽卡牌《天外武林》上架Steam 明年1月发售
别急换机!本月还有6场发布会:劝你先等等再买
世界微动态丨《阿凡达:水之道》预测票房仅25.11亿!远不到《长津湖》一半
【环球新要闻】Epic大促开启 连续15天免费送游戏!75折套娃优惠券来了
【天天播资讯】RTX 4070 Ti跑分首曝:猛升46%、超越RX 7900 XTX
焦点热讯:替代if esle 的高级方法
make学习
天天热门:高手必备10大难题:Mysql如何实现RR级隔离时,不会幻读?
FreeSWITCH学习笔记:应用程序(APP)
速度飞起!全球首款232层闪存SSD细节公布:TLC颗粒、拒绝PCIe 5.0
快资讯:一图看懂moto新机:二代骁龙8 3699元!价格屠夫简直了
全球观察:7-2 案例 字符串关键字的散列映射
天天热议:微软2025年目标:确保非洲再增加1亿人访问互联网
焦点信息:火球坠入浙江 警方带走疑似陨石碎片:现场砸出六七厘米深坑
环球微头条丨初始Docker
热点评!分智慧果 - 2021算法与数据结构实验题
环球观热点:不调好不上市 moto X40驯服二代骁龙8:1小时王者温度仅42度
Nature年度十大人物出炉:猪心移植手术团队负责人等入选
饱满如水滴!联想moto X40开箱图赏
5000mAh大电池+120Hz屏 899元联想moto G53图赏
109度大电池能跑730KM!岚图追光预售:32.29万元起
天天微动态丨自研分布式高性能RPC框架及服务注册中心ApiRegistry实践笔记【原创】【开源】
【独家】图形用户界面(GUI)编程可以学习C++ Builder,多图、实例、书籍
17 Java内存模型与线程_Java与线程
视焦点讯!努比亚Z50散热堆料离谱:散热总面积达到36462m㎡
中国光纤之父赵梓森逝世 享年91岁:拉出了我国第一根光纤
世界观热点:苹果妥协了!将开门迎接第三方应用商店 用户褒贬不一
杭州疑似有陨石掉落:一团火球 照亮夜空
环球要闻:AIRIOT答疑第2期|如何使用物联网平台的数据采集与控制引擎?
《隐秘的角落》游戏来了:Steam版定档明年1月18日
【时快讯】可以薅羊毛了!网易云音乐TV版正式上线:免费送3个月会员
天天快报!男子花12万买世界杯彩票没中要求退款 理由气煞店老板
天天热头条丨微信全新朋友圈点赞互动广告上线:点下就能放烟花秀
天天热资讯!下单15分钟送到:上海开通首条美团无人机常态化航线
世界速读:BaseDet: 走过开发的弯路
今日热门!引迈信息荣登「2022低代码企业50强」:JNPF,你的不二选择!
环球关注:IMDb 8.2分!《阿凡达2》口碑爆棚 影院回应票价高:消费者不缺钱缺服务
OPPO Find N2 Flip外屏惊艳:支持快捷回复、锁屏小游戏
第二家通吃NVIDIA、AMD、Intel的显卡品牌诞生!这也太贵了
天天实时:公牛发布航天级品质超薄插座:可承受2万次拔插
环球微头条丨跌破零下40度!内蒙古出现极寒冰雾天气:冷到“冒白烟”
环球微速讯:SQL的使用总结
天天快资讯:WPF深入简出(一)入门必看
观热点:【机器学习】李宏毅——浅谈机器学习原理+鱼与熊掌兼得的深度学习简述
当前动态:前后端AES加密解密,CryptoJS和Java实现
热讯:记录--手把手带你开发一个uni-app日历插件(并发布)
OPPO Find N成为全国销量第二折叠屏!一经发布就大获成功
微速讯:首次使用钛合金螺丝!OPPO Find N2仅233g:折叠屏比iPhone还轻
OPPO Find N2内外一致好屏:双120Hz+双E6 可自由悬停
让玩家心动的定制 ROG 6游戏手机《暗黑破坏神:不朽》典藏限量版图赏
OPPO Find N2 233g比直板机还轻!央视点赞:刷新折叠屏手机新纪录
【世界速看料】LeetCode HOT 100:旋转图像
环球头条:特斯拉中国上线490元酒杯 限量卖 网友吐槽智商税
世界今日讯!女子连吃5天感冒药 多脏器功能衰竭:专家提醒小心这些症状
IT工程师哪里工资最高?美国仅排第二 第一收入超过70万
天天看热讯:帧数暴涨40%!《巫师3》次时代版画质优化指南
20万级大杀器 长安深蓝首款SUV曝光:增程、纯电全都有
【天天速看料】Shell 标准输入和输出
信息:公司新来一个同事,把网关系统设计的炉火纯青!(万能通用,稳的一批。。)
当前视讯!易基因|NSUN2介导RNA m5C修饰促进食管鳞状细胞癌进展的表观调控机制 | 肿瘤研究
ThingsBoard前端项目的安装与启动
【时快讯】RELIC库学习
全球看热讯:喜讯+1!袋鼠云数栈技术团队获“2022年度优秀开源技术团队”
投影仪的工作原理是什么?投影仪排名前十的品牌
Centos安装Nginx
针孔无线摄像机怎么连接?针孔无线摄像机怎么用?
本地连接受限制或无连接是怎么回事?本地连接受限制或无连接怎么解决?
svchost.exe占用cpu过是什么原因?svchost.exe占用cpu过高解决方法
pdf文件打开是乱码怎么回事?pdf文件打开是乱码时该怎么办?
男主角是明星的小说有哪些?男主角是明星的小说推荐
科比最后一场比赛是什么时候?科比最后一场比赛是多少分?
鞋子防臭的小妙招有哪些?鞋子防臭喷雾哪个牌子好?
沙棘如何鉴别好坏?沙棘的功效作用与主治是什么?
玉碎了代表什么征兆?玉碎了有什么办法修复吗?
英雄联盟更新慢是什么原因?英雄联盟更新慢怎么办?
怎么才能加快迅雷的下载速度?加快迅雷下载速度的方法有哪些?
全球讯息:阻止Windows未知应用弹窗的一种思路方法
Zabbix6.0使用教程 (四)—zabbix6.0从源代码安装
Tomcat工作原理
小键盘指法是什么意思?小键盘指法包括什么键?
iphone13如何添加公交卡?iphone13添加公交卡的方法有哪些?
安卓系统的手机有哪些?安卓系统的手机有哪些牌子好?
天天快讯:针对某钓鱼网站的渗透测试
【脚本项目源码】Python制作桌面宠物,这么可爱的萌宠你不想拥有吗?
今日热议:4999元 小米13限量定制色明天首销:只有5万台
环球焦点!中国民营火箭朱雀二号发射失利 全球首型轨道飞行的甲烷火箭
当前播报:QQ邮箱推实用新功能:英文文档一键即可翻译
【报资讯】丰田凯美瑞看呆!新一代本田雅阁实车曝光:比思域还运动
撞到快报废!特斯拉高速追尾大货车 司机身亡:现场视频速度快到可怕
单手就能用的折叠屏旗舰!OPPO Find N2今天发布:比直板机还轻
环球视讯!反对无效!日本投放广告宣传福岛核污水安全性:必须排海
【环球播资讯】我国成功发射遥感三十六号卫星!长征火箭年发射数首次迈上50大关
【环球速看料】适合男女双打 这三款游戏拉近你和她的距离
焦点滚动:腾讯互动阅读App《一零零一》宣布将停运:补偿方案出炉
环球新动态:显卡不会便宜了?NV要发新RTX 4080、4090:移动版也万元节奏