Vue Router activated deactivated 路由守卫

news2024/11/15 12:59:16

6.12.activated deactivated

activateddeactivated是路由组件所独有的两个钩子,用于捕获路由组件的激活状态具体使用

  1. activated路由组件被激活时触发
  2. deactivated路由组件失活时触发

在这里插入图片描述

src/pages/News.vue

<template>
    <ul>
        <li :style="{opacity}">欢迎学习vue</li>
        <li>news001 <input type="text"></li></li>
        <li>news002 <input type="text"></li></li>
        <li>news003 <input type="text"></li></li>
    </ul>
</template>

<script>
    export default {
        name: "News",
        data(){
            return {
                opacity:1
            }
        },
        activated() {
            console.log('News组件被激活了');
            this.timer = setInterval(() => {
                this.opacity -= 0.01;
                if(this.opacity <= 0) this.opacity = 1
            },16)
        },
        deactivated() {
            console.log('News组件失活了');
            clearInterval(this.timer)
        }
    }
</script>

6.13.路由守卫

作用:对路由进行权限控制

分类:全局守卫、独享守卫、组件内守卫 全局守卫

  1. 全局守卫
    1. meta路由源信息
      // 全局前置守卫:初始化时、每次路由切换前执行
      router.beforeEach((to,from,next) => {
        console.log('beforeEach',to,from);
        if(to.meta.isAuth){ // 判断当前路由是否需要进行权限控制
          if(localStorage.getItem('school') === 'atguigu'){ // 权限控制的具体规则
            next(); // 放行
          } else { 
            alert('暂无权限查看');
          }
        } else { 
          next(); // 放行 
        }
      })
      
      // 全局后置守卫:初始化时、每次路由切换后执行
      router.afterEach((to,from) => {
        console.log('afterEach',to,from);
        if(to.meta.title) { 
          document.title = to.meta.title;//修改网页的title 
          } else { 
            document.title = 'vue_test' ;
          }
      })
      
  2. 独享守卫
    beforeEnter(to,from,next){
      console.log('beforeEnter',to,from);
      if(localStorage.getItem('school') === 'atguigu') { 
        next();
      } else { 
        alert('暂无权限查看');
      }
    })
    
  3. 组件内守卫
    //进入守卫:通过路由规则,进入该组件时被调用 
    beforeRouteEnter (to, from, next) {... next()},
    
    //离开守卫:通过路由规则,离开该组件时被调用 
    beforeRouteLeave (to, from, next) {... next()},
    

6.13.1.全局路由守卫

src/router/index.js

import VueRouter from 'vue-router';

// 引入组件
import About from '../pages/About';
import Home from '../pages/Home';
import News from '../pages/News';
import Message from '../pages/Message';
import Detail from '../pages/Detail';

// 创建并暴露一个路由器
const router =  new VueRouter({
    routes:[
        {
            name:'guanyu',
            path:'/about',
            component:About,
            meta:{title:'关于'}
        },
        {
            name:'zhuye',
            path:'/home',
            component:Home,
            meta:{title:'主页'},
            children: [
                {
                    name:'xinwen',
                    path:'news',
                    component:News,
                    meta:{isAuth:true,title:'新闻'}
                },
                {
                    name:'xiaoxi',
                    path:'message',
                    component:Message,
                    meta:{isAuth:true,title:'消息'},
                    children: [
                        {
                            name:'Detail', // name配置项为路由命名
                            path:'detail', // 使用占位符声明接收params参数
                            component:Detail,
                            meta:{isAuth:true,title:'详情'},
                            props($route){ // 这里可以使用解构赋值
                                return {
                                    id: $route.params.id,
                                    title: $route.params.title
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
})

// 全局前置路由守卫————初始化的时候、每次路由切换之前被调用
router.beforeEach((to,from,next) => {
    console.log('前置路由守卫',to,from);
    if(to.meta.isAuth){
        if(localStorage.getItem('school')==='atguigu'){
            next();
        } else{
            alert('学校名不对,无权限查看!');
        }
    } else {
        next();
    }
});

// 全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from) => {
    console.log('后置路由守卫',to,from);
    document.title = to.meta.title || '硅谷系统';
});


export  default router;

6.13.2.独享路由守卫

src/router/index.js

import VueRouter from 'vue-router';

// 引入组件
import About from '../pages/About';
import Home from '../pages/Home';
import News from '../pages/News';
import Message from '../pages/Message';
import Detail from '../pages/Detail';

// 创建并暴露一个路由器
const router =  new VueRouter({
    routes:[
        {
            name:'guanyu',
            path:'/about',
            component:About,
            meta:{title:'关于'}
        },
        {
            name:'zhuye',
            path:'/home',
            component:Home,
            meta:{title:'主页'},
            children: [
                {
                    name:'xinwen',
                    path:'news',
                    component:News,
                    meta:{isAuth:true,title:'新闻'},
                    // 🔴独享守卫,特定路由切换之后被调用
                    beforeEnter(to,from,next){
                        console.log('前置路由守卫',to,from);
                        if(to.meta.isAuth){
                            if(localStorage.getItem('school')==='atguigu'){
                                next();
                            } else{
                                alert('学校名不对,无权限查看!');
                            }
                        } else {
                            next();
                        }
                    }
                },
                {
                    name:'xiaoxi',
                    path:'message',
                    component:Message,
                    meta:{isAuth:true,title:'消息'},
                    children: [
                        {
                            name:'Detail', // name配置项为路由命名
                            path:'detail', // 使用占位符声明接收params参数
                            component:Detail,
                            meta:{isAuth:true,title:'详情'},
                            props($route){ // 这里可以使用解构赋值
                                return {
                                    id: $route.params.id,
                                    title: $route.params.title
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
})

// 全局前置路由守卫————初始化的时候、每次路由切换之前被调用
// router.beforeEach((to,from,next) => {
//     console.log('前置路由守卫',to,from);
//     if(to.meta.isAuth){
//         if(localStorage.getItem('school')==='atguigu'){
//             next();
//         } else{
//             alert('学校名不对,无权限查看!');
//         }
//     } else {
//         next();
//     }
// });

// 全局后置路由守卫————初始化的时候被调用、每次路由切换之后被调用
// router.afterEach((to,from) => {
//     console.log('后置路由守卫',to,from);
//     document.title = to.meta.title || '硅谷系统';
// });


export  default router;

6.13.3.组件内路由守卫

src/pages/About.vue

<template>
    <h2>我是About的内容</h2>
</template>

<script>
    export default {
        name: "About",
        // 通过路由规则,进入该组件时被调用
        beforeRouteEnter (to, from, next) {
            console.log('About--beforeRouteEnter', to, from);
            if(localStorage.getItem('school') === 'atguigu') {
                next();
            } else {
                alert('学校名不对,无权限查看!');
            }
        },
        // 通过路由规则,离开该组件时被调用
        beforeRouteLeave (to, from, next) {
            console.log('About--beforeRouteLeave', to, from) ;
            next();
        }
    }
</script>

6.14.路由器的两种工作模式

  1. 对于一个url来说,什么是hash值? #及其后面的内容就是hash值
  2. hash值不会包含在HTTP请求中,即:hash值不会带给服务器
  3. hash模式
    1. 地址中永远带着#号,不美观
    2. 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法
    3. 兼容性较好
  4. history模式
    1. 地址干净,美观
    2. 兼容性和hash模式相比略差
    3. 应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题
const router = new VueRouter({ 
  mode:'history', 
  routes:[...] 
})

export default router;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/697737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.2-程序设计语言与流程图基础

一、学习目标 了解计算机程序与程序设计语言。认识算法和流程图。理解计算机程序、程序设计语言、算法与流程图之间的关系。 1、计算机程序 计算机程序是人们使用指定的程序设计语言&#xff0c;根据需要事先编写的一系列控制计算机工作的命令。2、程序设计语言 程序设计语…

如何避免死锁:方法一

需要先看前文&#xff1a;死锁的产生_御坂美琴1的博客-CSDN博客 对两个资源使用一把锁。即小朋友玩敲鼓的时候会同时拿走鼓和鼓槌。 如图&#xff1a; 可以看到“线程1执行了&#xff0c;但是线程2没有执行&#xff0c;还在被阻塞着。为什么线程1运行完毕&#xff0c;线程2还没…

解决sourcetree中推送不显示分支 - 软件篇

问题&#xff1a; 如上图所示&#xff0c;在我们使用sourcetree推送我们的代码时 推送的弹窗里不回显示我们的分支&#xff1b; 众所周知&#xff1a;在我们没有新创建分支的情况下&#xff0c;他会默认有一个master分支&#xff0c;这也是我们的主分支 在网上搜这个问题&…

61 KVM Skylark虚拟机混部-使用及最佳实践

文章目录 61 KVM Skylark虚拟机混部-使用及最佳实践61.1 使用Skylark61.1.1 启动服务61.1.2 创建虚拟机61.1.3 虚拟机运行 61.2 最佳实践61.2.1 虚拟机业务推荐61.2.2 虚拟机绑核配置 61 KVM Skylark虚拟机混部-使用及最佳实践 61.1 使用Skylark 61.1.1 启动服务 初次启动&a…

Spring MVC的工作原理

1.Spring MVC的工作原理 1.浏览器发送请求&#xff0c;DispatcherServlet拦截请求 2.DispatcherServlet将需要先调用HandlerMapping通过uri找到能够处理请求的Handler&#xff0c;然后将请求涉及到的Handler封装 3.DispatcherServlet调用HandlerAdapter适配执行Handler 4.H…

LeetCode 打卡day45-- 单词拆分和多重背包问题

一个人的朝圣 — LeetCode打卡第45天 知识总结 Leetcode 139. 单词拆分题目说明代码说明 知识总结 今天写了一道题目, 但是还挺难的, 而且是面试高频题目 还过了一遍多重背包问题. 多重背包与01背包的区别在于多重背包限制了物品的个数, 某些物品的个数可能不为1, 可以使用两…

Java缓存简介

一、缓存 1、什么是缓存&#xff1f; 缓存是硬件&#xff0c;是CPU中的组件&#xff0c;CPU存取数据的速度非常的快&#xff0c;一秒钟能够存取、处理十亿条指令和数据&#xff08;术语&#xff1a;CPU主频1G&#xff09;&#xff0c;而内存就慢很多&#xff0c;快的内存能够达…

数据库实验-图书销售管理系统数据库安全管理

一、实验二&#xff1a;图书销售管理系统数据库安全管理 三、实验目的 了解该DBMS系统对数据库管理的内容与方法&#xff0c;特别是理解数据库安全机制和作用&#xff0c;以及PostgreSQL数据库角色管理、用户管理、权限管理的基本方法&#xff0c;培养数据库管理能力。在图书…

CV什么时候能迎来ChatGPT时刻?

卷友们好&#xff0c;我是rumor。 最近看了几篇CV的工作&#xff0c;肉眼就感受到了CVer们对于大一统模型的“焦虑”。 这份焦虑让他们开始尝试统一一切&#xff0c;比如&#xff1a; 统一复杂的自动驾驶任务的优化目标[1]&#xff0c;来自今年CVPR最佳论文。统一典型的CV任务&…

3s定时循环启动弹窗,子窗体3s后自动关闭功能实现

只贴关键代码&#xff1a; 1、父窗体关键代码 private void doAt1AM(object state){//要执行的任务&#xff0c;直接button调用即可//执行功能...的任务spring_Form spr_Form new spring_Form();spr_Form.Txt "陈先生" ";到1号窗口取药";spr_Form.Show…

WPF中的Behavior及Behavior在MVVM模式下的应用

WPF中的Behavior及Behavior在MVVM模式下的应用 在WPF中&#xff0c;Behaviors&#xff08;行为&#xff09;是一种可重用的组件&#xff0c;可以附加到任何UI元素上&#xff0c;以添加特定的交互行为或功能。Behaviors可以通过附加属性或附加行为的方式来实现。 Behavior并不…

【3Ds Max】使用捕捉工具、轴约束工具实现点的精准对齐

目录 问题 解决步骤 一、在XYZ轴上都对齐 二、只在一或两个轴上对齐 问题 举个例子&#xff0c;比如我想让如下的两个立方体的顶点对齐&#xff08;在同一位置&#xff08;XYZ轴都对齐&#xff09;&#xff0c;或仅在一个或两个轴上对齐&#xff09;&#xff1a; 主要使…

【PostgreSQL 数据库技术峰会(成都站)】云原生虚拟数仓 PieCloudDB Database 的架构和关键模块实现...

2023年6月17日&#xff0c;中国开源软件推进联盟 PostgreSQL 分会在成都举办了数据库技术峰会。此次峰会以“新机遇、新态势、新发展”为主题&#xff0c;结合当下信创热潮、人工智能等产业变革背景&#xff0c;探讨 PostgreSQL 数据库在这些新机遇下的发展前景。峰会邀请众多行…

PHP 设备管理系统 mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 设备管理系统 是一套完善的WEB设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 视频演示 PHP 设备管理系统 mysql数据库web结构apache 代码下载 https://download.csd…

70、基于51单片机智能手环心率计步温湿度蓝牙APP监控系统设计(程序+原理图+参考论文+开题报告+元器件清单等)

摘 要 计步器是一种颇受欢迎的日常锻炼进度监控器&#xff0c;可以激励人们挑战自己&#xff0c;增强体质&#xff0c;帮助瘦身。早期设计利用加重的机械开关检测步伐&#xff0c;并带有一个简单的计数器。晃动这些装置时&#xff0c;可以听到有一个金属球来回滑动&#xff0c…

Ansible快速上手

使用Ansible-快速上手 ping模块简介&#xff1a; 该模块不使用ICMP ping&#xff0c;而是使用基于python的模块完成。 语法&#xff1a; ansible 主机IP/或在清单中的名称 -m(表示选择模块) ping &#xff08;表示使用ping模块&#xff09;清单文件&#xff1a; [dev] 192.…

【运维工程师学习】安装VMware并创建Centos8虚拟机(保姆级教程)

安装虚拟机&#xff08;VMware&#xff09;保姆级教程&#xff08;附安装包&#xff09; 下载链接安装步骤创建Centos8虚拟机 下载链接 百度网盘链接&#xff1a;https://pan.baidu.com/s/1pWSsCnP_2Yfe7dRCPQitCg 提取码&#xff1a;6666 Centos8下载&#xff1a;https://nex…

0基础学习VR全景平台篇,第51篇:高级功能-自定义菜单

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;高级功能-自定义菜单&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 自定义菜单&#xff0c;是显示在VR漫游作品底部和顶部各种可点击的图标按钮。…

Liunx 安装 Nginx

1.准备Nginx所需依赖 yum install gcc-cyum install -y zlib zlib-develyum install -y pcre pcre-develyum install -y openssl openssl-devel2.下载tar并解压 wget http://nginx.org/download/nginx-1.23.0.tar.gz tar -xvf nginx-1.23.0.tar.gz 3.安装Nginx cd nginx-1.2…

mmdetection1.4训练fasterrcnn

mmdetection1.4训练fasterrcnn 指定参数文件urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)>No such file or directory: data/coco/annotations/instances…