【Vue3】 Vue-Router路由和路由导航守卫

news2024/11/26 1:57:52

路由

      • 前后端分离阶段路由
      • 单页面富应用阶段
          • 前端路由如何做到URL和内容进行映射?
          • URl的hash(哈希)
          • URl的history
      • Vue-Router基本使用
          • 1,安装Vue-Router
          • 2,新建页面router文件下的index.js,路由,导入页面,导入路由,创建路由关系
          • 3,main.js
          • 3,app.vue里面
        • router-link属性
      • 路由懒加载分包处理
        • 路由routes的其他属性
      • 动态路由和路由嵌套
          • 1,动态路由的基本匹配
          • 2,如果想要在vue页面中取到传的参数
      • Not Foned
      • 路由的嵌套使用
      • 路由的编程式导航
          • 导航,router.push方法
          • 接收query数据
          • router.replace()方法,替换当前页面
          • router.back(n)方法,返回上个页面,也可以n个页面
          • router.forward(n)方法向前一步,也可以n步
          • router.go(n),页面前进或后退,n为正或为负
          • history.back(),回溯历史相当于router.go(-1)
          • history.forward(),在历史中前进相当于router.go(1)
      • 动态管理路由对象
          • 动态添加路由
          • 动态添加子路由
          • 删除路由方式一
          • 删除路由方式二
          • 删除路由方式三
      • 路由对象的其他方法
          • 检查路由是否存在
          • 获取路由对象中所有的映射路由对象
        • 编译警告
      • 路由导航守卫
          • 前置导航守卫
          • 完整的导航解析流程

前后端分离阶段路由

  • Ajax的出现,有了前后端分离的开发模式
  • 后端提供ApI返回数据,前端通过Ajax获取数据,并且通过js渲染到页面上
  • 优点。前后端责任清晰

单页面富应用阶段

  • SPA最大的特点就是前后端分离的基础上加一层前端路由
  • 也就是前端维护一套路由规则
  • 核心,改变URl的同时,页面不进行整体刷新
前端路由如何做到URL和内容进行映射?
  • 监听URL的改变
URl的hash(哈希)
  • URl的hash也就是锚点(#),本质上式改变window.location的和href属性
  • 我们可以通过直接赋值location.hash来改变和href(但是页面不发生刷新)
URl的history
  • HTML5新增,有6种模式改变URL而不刷新页面
  • replaceState,替换原来的路径
  • pushState,使用新的路径
  • popState,路径的回退
  • go,向前或向后改变路径
  • forward,向前改变路径
  • back,向后改变路径

Vue-Router基本使用

  • 通过Vue-Router构建单页应用(SPA)
  • 1,创建路由对象
  • 2,建立映射关系
  • 3,让路由对象生效
  • 4,挂载router
  • 5,router-view占位
  • 6,router-link路由切换
1,安装Vue-Router
npm install vue-router
2,新建页面router文件下的index.js,路由,导入页面,导入路由,创建路由关系
  • createWebHashHistory:指的是用hash模式路由,比如/#/order/detail这种带#的path
  • createWebHistory:基于html5原生的history API实现路由
  • createMemoryHistory:基于内存信息来隐式管理路由,适用于SSR场景
import { createRouter,createWebHashHistory  } from 'vue-router'
//导入
import Home from "../Views/home.vue"
import About from "../Views/about.vue"
//创建路由对象,//建立映射关系
const router = createRouter({
    history:createWebHashHistory (),//用于指定采用的模式。目前式哈希模式
    routes: [
    	//一般开发里面都会写一个重定向的路径
       {
            path: '/', redirect: "/home"
        },
        {
            path: '/home', component: Home
        },
        {
            path: '/about', component: About
        }
    ]
})

//导出
export default router
3,main.js
import { createApp } from 'vue'
import App from './App.vue'

//再次导入,告诉app,注意这里的使用方式
import router from './router/index'
createApp(App).use(router).mount('#app')
3,app.vue里面
<template>
  <p>标题</p>
  <router-view></router-view>
  <div class="nev">
    <router-link to="Home">Home</router-link>
    <router-link to="about">about</router-link>
  </div>
</template>
<script setup>
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

router-link属性

  • 1,replace属性,替换属性,不会存在历史里面
<router-link to="Home" replace>Home</router-link>
  • 2,to属性,可以是字符串,也可以是对象
<router-link to="Home" replace>Home</router-link>
<router-link :to="{path:'/about'}">about</router-link>
  • 3,active-class属性
  • 设置激活a元素后应用的class,默认是router-link-active
.router-link-active{
  color :blue;
}
  • 4,exact-active-class属性
  • 链接精准激活时,应用于渲染的的class,默认是router-link-exact-active

路由懒加载分包处理

  • 可以提高首屏的渲染效率
//如果想要分包
const Home=()=>import("../Views/hone.vue")
const About=()=>import("../Views/about.vue")

在这里插入图片描述

路由routes的其他属性

  • name 属性,路由记录的独一无二的名称,页面跳转的时候可以指定name跳转
  • meta属性,放自定义的属性
    在这里插入图片描述

动态路由和路由嵌套

1,动态路由的基本匹配
  • 例如:有个组件页面,用户进入需要传用户id,但id是不同的
  • 故:在vue router中,可以在路径中使用一个动态字段来实现,称之为 路径参数
  • /:参数
    在这里插入图片描述
2,如果想要在vue页面中取到传的参数
  • 在模板里面取
<template>
  <div><p>about的参数{{$route.params.id}}</p></div>
</template>

在这里插入图片描述

  • 在Vue2的api中获取
 this.$route.params.id
  • 在Vue3的api中获取
  • 但存在缺点,来回切换打印只执行一次
<script setup>
  import {useRoute} from "vue-router"
  //获取router跳转的id
  const route = useRoute()
  console.log(route.params.id)
</script>

在这里插入图片描述

  • 解决方法:想在vue3中监听路由router变化
  • 添加一个导航守卫,在当前位置即将更新时触发。
<script setup>
  import {onBeforeRouteUpdate} from "vue-router"
  //获取router跳转的id
  onBeforeRouteUpdate((to,from)=>{
    console.log(to,from)
    console.log("form",from.params.id)
    console.log("to",to.params.id)
  })
</script>

Not Foned

  • 如果想让用户匹配不到页面,将自动显示下面组件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 想要解析路径,后面加个*,就可以解析为数组
    在这里插入图片描述
    在这里插入图片描述

路由的嵌套使用

  • 注意,以 / 开头的嵌套路径将被视为根路径。这允许你利用组件嵌套,而不必使用嵌套的 URL。
  • 1,在一层路由中添加children[]属性
 {
            name: "home",
            path: '/home',
            component: Home,
            children: [
                {
                    path: '/about',
                    component: About
                }
            ]
        },
  • 2,在home组件中添加
 <router-view></router-view>
  • 3,路由跳转

路由的编程式导航

导航,router.push方法

在这里插入图片描述

接收query数据

在这里插入图片描述

router.replace()方法,替换当前页面
router.back(n)方法,返回上个页面,也可以n个页面
router.forward(n)方法向前一步,也可以n步
router.go(n),页面前进或后退,n为正或为负
history.back(),回溯历史相当于router.go(-1)
history.forward(),在历史中前进相当于router.go(1)

动态管理路由对象

动态添加路由
  • 使用场景
  • 比如根据用户不同的权限,注册不同的路由
  • 这个时候可以使用一个方法addRoute
  • 类似下面这个 ,如果有权限,则添加路由
let isAdmin = true
if(isAdmin){
    router.addRoute({
        path:"/Admin",
        component:Admin
    })
}
动态添加子路由
  • router.addRoute(parentName, route)
  • 其中parentName为父级路由定义的name字段。
  • 注意:子路由path前面不加“/”
  • 还得注意,父级路由里必须有占位router-view
let isAdmin = true
if(isAdmin){
    router.addRoute({
        name:"Admin",
        path:"/Admin",
        component:Admin
    })
    router.addRoute('Admin',{
        path:"Adminchild",
        component:Adminchild
    })
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

删除路由方式一
  • 添加一个name相同的路由,后者即可覆盖前者的路径,相当于删除前者路由
    在这里插入图片描述
删除路由方式二
  • 通过removeRoute方法,传入路由名称
router.removeRoute('home')
删除路由方式三
  • addRoute里面存放的是对象
const delrouter = router.addRoute({
    name: "home",
    path: '/home',
    component: Home,
    children: [
        {
            path: '/about',
            component: About
        }
    ]
})
delrouter()

路由对象的其他方法

检查路由是否存在
  • router.hasRoute
获取路由对象中所有的映射路由对象
  • router.getRoutes()
console.log(router.getRoutes())

在这里插入图片描述

编译警告

在这里插入图片描述

路由导航守卫

前置导航守卫
  • vue-router提供的导航守卫主要是用来通过跳转或取消的方式守卫导航
  • 全局的前置守卫beforeEach是在导航触发的时,被回调
  • 它有两个参数

  • to:即将进入的路由Route对象
  • from:即将离开的路由Route对象
  • 还有一个可选的第三个参数next,vue2中来决定如何进行跳转的
  • 它有返回值

  • false,取消当前导航
  • 不返回或者undefined,进行默认导航
  • 返回一个路由地址
  • 可以是一个string类型的路径

  • 可以是一个对象,对象中包含path,query,params等信息

// 路由导航拦截
// - 进行任何的路由跳转之前,传入到beforeEach中的函数都会被回调
router.beforeEach((to,from)=>{
    //不写条件会在登录页陷入死循环
    if(to.path!='/login'){
        return "/login"
    }
})
  • 常见使用场景
  • 进入home页面前,判断用户是否登录
// 路由导航拦截
router.beforeEach((to, from) => {
    const token = localStorage.getItem("token")
    if (!token && to.path == '/home') {
        return "/login"
    }
    return undefined//否则默认导航
})
完整的导航解析流程
  • 1,导航被触发
  • 2,在失活的组件里调用beforeRouteLeave()守卫
  • 3,调用全局的beforeEach()守卫
  • 4,在重用的组件里调用beforeRouteUpdate()守卫,不能使用组件实例this
  • 5,在路由配置调用beforeEnter()
  • 6,解析异步路由组件()=>import(…/xxx)
  • 7,在被激活的组件里调用beforeRouterEnter()
  • 8,调用全局的beforeReasolve(),组件被解析之后,在跳转之前
  • 9,导航被确认
  • 10,调用全局的afterEach()钩子,
  • 11,触发DOM更新
  • 12,调用beforeRouteEnter()守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入

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

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

相关文章

一定解决JavaFx运行时Application爆红色问题

文章目录 注意maven项目创建maven javafx项目配置 注意 以下的问题纯粹是因为新建的是普通项目&#xff0c;而不是Java FX项目&#xff0c;如果新建的是Java FX项目&#xff0c;那么idea会自动给你生成相应的需要的pom.xml文件&#xff0c;并且运行也是正常的 maven项目创建…

RPC和HTTP协议

RPC 全称&#xff08;Remote Procedure Call&#xff09;&#xff0c;它是一种针对跨进程或者跨网络节点的应用之间的远程过程调用协议。 它的核心目标是&#xff0c;让开发人员在进行远程方法调用的时候&#xff0c;就像调用本地方法一样&#xff0c;不需要额外为了完成这个交…

Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)

一、简介 Rspack CLI 官方文档。 rspack.config.js 官方文档。 二、创建 vue 项目 创建项目&#xff08;文档中还提供了 Rspack 内置 monorepo 框架 Nx 的创建方式&#xff0c;根据需求进行选择&#xff09; # npm 方式 $ npm create rspacklatest# yarn 方式 $ yarn create…

SSD基本工作原理了解

SSD与RAM的原理有些类似&#xff0c;RAM使用晶体管和电容来表示0或1&#xff0c;晶体管用于将电荷转移到电容器或从电容器中吸取电荷&#xff0c;并且电荷必须每几微秒刷新一次。 而SSD相比于RAM的非易失性来自于其使用的浮栅晶体管。其创造了一个小笼子&#xff0c;不需要外界…

Sui生态项目|集隐私通信、移动钱包、链上朋友圈和红包功能一体的社交应用ComingChat

ComingChat是在Sui网络上构建的去中心化社交平台&#xff0c;功能众多&#xff0c;其中加密聊天功能为用户提供了安全的沟通方式。该功能利用了Signal加密协议&#xff0c;这是一种在Signal、WhatsApp和Skype等应用中广受欢迎的开源软件协议。 ComingChat在Sui上提供了全面的…

Echarts 柱状图-值为0时柱状图数据

需求是这样的&#xff1a;当数据为0时&#xff0c;鼠标悬浮也需要展示对应的数据&#xff0c;当值很小&#xff0c;也需进行占位&#xff0c;所以要加barMinHeight 刚开始以为没有对应方案呢&#xff0c;然后在官网死磕&#xff0c;最后还是找到解决方案了. 打开官网地址 解决方…

软件测试工程师的职业发展方向,别迷茫了,振作起来

软件测试在职业发展上&#xff0c;可以概括分为“管理”和“技术”两大类。另外&#xff0c;软件测试还可以在质量领域发展。 1. 软件测试在管理上的发展 软件测试管理是大家比较熟悉的软件测试职业发展路线之一&#xff0c;比较流行的职位包括测试组长、测试经理、测试代表、…

删除ubuntu开始菜单中的图标

背景 本来是很好看干净的界面 更新谷歌浏览器后出现了Gmail&#xff0c;幻灯片&#xff0c;谷歌硬盘等跟谷歌相关的乱七八糟东西搞得界面就很丑 解决问题 删掉那个图标 输入命令 sudo nautilus /usr/share/applicationssudo nautilus ~/.local/share/applications可以…

风险变化快,业务人员如何快速增加风控规则?

目录 什么是风控规则&#xff1f; 风控规则的来源 如何在风控引擎中配置规则&#xff1f; 今年暑假&#xff0c;博物馆和演出会门票被黄牛抢走。主办方、博物馆如果拥有风控系统&#xff0c;可以制订一系列规则来识别和拦截潜在的黄牛行为。 在制订规则时&#xff0c;需考虑…

什么是负载均衡

前提概述 关于负载均衡&#xff0c;我会从四个方面去说 1. 负载均衡产生的背景 2. 负载均衡的实现技术 3. 负载均衡的作用范围 4. 负载均衡的常用算法 负载均衡的诞生背景 在互联网发展早期&#xff0c;由于用户量较少、业务需求也比较简单。对于软件应用&#xff0c;我们只需要…

code论坛系统测试

目录 一 项目介绍**项目名称****项目介绍****项目功能****项目展示** 二 测试用例设计和功能测试1.测试用例设计**①登录页面****②注册页面****③首页****④发布帖子页面****⑤修改个人信息页面** 2.功能测试环境3.实际执行功能测试的部分操作**①登录页面****②注册页面****③…

Apple Pay 内购项目价格异常相关

通过 Apple Pay 内购商品子项的实际支付价格与 App Store Connect 配置中的存在差异; 经过已经排查过后发现是参照转换汇率的基准方式导致; 在 App 内购买项目 > 价格时间表 > App 内购买项目定价 > 所在国家或地区 一栏中,官方默认配置是以美国(USD)换算为基准 解决办…

优思学院|车间管理的五大基本方法

车间管理对于任何制造型企业来说都是至关重要的一环。有效的车间管理可以帮助企业提高生产效率&#xff0c;降低成本&#xff0c;改善产品质量&#xff0c;以及增强员工士气。在这篇文章中&#xff0c;我们将探讨车间管理的五大基本方法&#xff0c;这些方法可以帮助企业更好地…

NOIP 2011 提高组复赛真题及题解(day1 day2) Pascal语言

题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有n 张地毯&#xff0c;编号从1 到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设&#xff0c;后…

FreeCAD傻瓜式教程之约束设定、构建实体、开孔、调整颜色、透明度、参考距离、任意修改尺寸、保持开孔居中等

本内容基于官方教程中的绘制简单的零件中的体会&#xff0c;在初次绘制的时候&#xff0c;总是无法完成&#xff0c;几经尝试才发现其关键点所在&#xff0c;以此文记录&#xff0c;用以被查资料&#xff0c;同时也希望能够帮到纯白新手快速熟悉该软件的绘图方法。 一、. 打开…

GEEMAP 基本操作(二)如何对 Landsat 进行全色锐化

遥感全色锐化的目标是从图像中获得最高级别的视觉清晰度和细节&#xff0c;通过结合全色波段图像的高空间分辨率和多光谱&#xff08;Landsat 为 B8 全色&#xff09;图像的宽光谱范围&#xff0c;全色锐化能够生成质量更清晰的最终彩色图像。 全色锐化过程涉及应用数学算法&a…

IDC发布《亚太决策支持型分析数据平台评估》报告,亚马逊云科技位列“领导者”类别

日前&#xff0c;领先的IT市场研究和咨询公司IDC发布《2023年亚太地区&#xff08;不含日本&#xff09;决策支持型分析数据平台供应商评估》1报告&#xff0c;亚马逊云科技位列“领导者”类别。IDC认为&#xff0c;亚马逊云科技在解决方案的协同性、敏捷性、完整性、及时性、经…

Keras三种主流模型构建方式:序列模型、函数模型、子类模型开发实践,以真实烟雾识别场景数据为例

Keras和PyTorch是两个常用的深度学习框架&#xff0c;它们都提供了用于构建和训练神经网络的高级API。 Keras: Keras是一个高级神经网络API&#xff0c;可以在多个底层深度学习框架上运行&#xff0c;如TensorFlow和CNTK。以下是Keras的特点和优点&#xff1a; 优点&#xf…

keepalived+lvs+nginx高并发集群

keepalivedlvsnginx高并发集群 简介&#xff1a; keepalivedlvsnginx高并发集群&#xff0c;是通过LVS将请求流量均匀分发给nginx集群&#xff0c;而当单机nginx出现状态异常或宕机时&#xff0c;keepalived会主动切换并将不健康nginx下线&#xff0c;维持集群稳定高可用 1.L…

浏览器安装selenium驱动,以Microsoft Edge安装驱动为例

Selenium是一个用于Web应用程序测试的自动化工具。它可以直接在浏览器中运行&#xff0c;模拟真实用户对浏览器进行操作。利用selenium&#xff0c;可以驱动浏览器执行特定的动作&#xff0c;比如&#xff1a;点击、下拉等等&#xff0c;还可以获取浏览器当前呈现的页面的源代码…