Vue3.0(五):Vue-Router 4.x详解

Vue-Router详解

vue-router教程

认识前端路由

  • 路由实际上是网络工程中的一个术语
    • 在架构一个网络的时候,常用到两个很重要的设备—路由器和交换机
    • 路由器实际上就是分配ip地址,并且维护着ip地址与电脑mac地址的映射关系
    • 通过映射关系,路由器才知道要把数据发送给哪台电脑
  • 路由在软件工程中出现,最早是由后端实现的,同时随着web的发展,路由也经历了一些阶段
    • 后端路由阶段
    • 前后端分离
    • 单页面富应用
      • 其核心就是改变URL整个页面不进行刷新
      • 可以通过改变hash进行操作
      • 可以通过HTML的history进行操作

认识vue-router

是Vue.js的官方路由

  • vue-router与Vue.js核心深度集成 ,让Vue.js构建 单页面应用变得很容易
  • vue-router是基于路由和组件的
    • 路由用于设定 访问路径,将路径与组件映射起来
  • 安装 Vue Router

基本使用

image.png

  • router代码
import {createWebHashHistory,createRouter,createWebHistory,
} from "vue-router";
//引入组件
import Home from "../components/Home.vue";
import About from "../components/About.vue";//创建vue router对象
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{ path: "/home", component: Home },{ path: "/About", component: About },],
});//将router暴露出去
export default router;

路由的默认路径

通过以上的步骤,我们会发现浏览器中会报警告

  • 大概意思就是说,/路径没有匹配

image.png

  • 这时候我们需要在创建router对象的时候,对默认路径进行配置
    • 方式一,将路径 /,与组件Home对应
    • 方式二,将路径 /,通过 redirect 重定向成 /home路径(项目开发中常用)
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{ path: "/", redirect: "/home" },{ path: "/home", component: Home },{ path: "/About", component: About },],
});

history模式

  • 如果不想在url中有#,就可以用createWebHistory模式,采用history模式
const router = createRouter({//使用的是hash模式history: createWebHistory(),routes: [{ path: "/", redirect: "/home" },{ path: "/home", component: Home },{ path: "/About", component: About },],
});

router-link

  • router-link是vue-router中提供的一个标签
  • 默认是一个a连接,可以指定其跳转路由
    • 跳转到 about路由
 <router-link to="/about">123</router-link>
同下<router-link to={path:"/about"}>123</router-link>
  • active-class属性
    • 设置点击a元素后应用的class,默认是router-link-active
    • 可以设置别名,可以使用默认的
 <router-link to="/about">123</router-link>//此时设置router-link-active样式<router-link to="/about" active-class="active">123</router-link>//此时设置active的样式

路由懒加载

前面的文章中,提到过当项目体量过大,打包的时候,默认会将项目打包到app.js文件中,此时,我们可以用import函数,进行分包处理

而vue-router也可以进行分包操作

  • 在创建vue-router对象的时候进行操作
    • 同时我们可以使用魔法命名webpackChunkName:'about',这是将打包的文件名写一个名称
    • 可以增加 name属性:该属性是独一无二的,可以通过path跳转,也可以通过name进行跳转
    • 可以使用meta属性:该属性是自定义属性的
import {createWebHashHistory,createRouter,createWebHistory,
} from "vue-router";//使用import引入组件
const About = () =>import(/*webpackChunkName:'about'*/ "../components/About.vue");//创建vue router对象
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{path: "/",redirect: "/home",meta:{zc:"zhangcheng"}},{name:"Home",path: "/home",component: () =>import(/*webpackChunkName:'home'*/ "../components/Home.vue"),},{name:"About",path: "/About",component: About,},],
});//将router暴露出去
export default router;

动态路由基本匹配

  • 在实际开发中,路由后面经常会跟着一些参数
    • 比如用户界面,后面经常会跟着用户的id
  • 在创建router对象的时候,需要进行动态路由的设置
    • /路由名称/:参数名称
import {createWebHashHistory,createRouter,createWebHistory,
} from "vue-router";//使用import引入组件
const About = () =>import(/*webpackChunkName:'about'*/ "../components/About.vue");//创建vue router对象
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{//此为动态路由path: "/home/:id",component: () =>import(/*webpackChunkName:'home'*/ "../components/Home.vue"),},],
});//将router暴露出去
export default router;
  • 在template模板中直接获取 $route.param.id获取

    • 注意是 $route
<template>Home:{{ $route.params.id }}</template>
  • scrpit通过代码获取

    • options API中
    //在 created生命周期中,获取
    created(){this.$route.params.id
    }
    
    • 在composition API中获取
    //导入useRoute函数,该方法仅会在组件创建的时候执行一次,组件不销毁的情况下,不会再执行
    import { useRoute } from "vue-router";const route = useRoute();
    console.log(route.params.id);
    
    • 若要在同一组件中进行切换
      • 比如现在我用id为123用户访问了该组件
      • 没有退出该组件,切换了456用户
    import { onBeforeRouteUpdate, useRoute } from "vue-router";const route = useRoute();
    console.log(route.params.id);//在同一组件中,切换用户会触发
    onBeforeRouteUpdate((to, from) => {console.log(to.params.id);console.log(from.params.id);
    });
    

Not Found

如果匹配到不存在的路径,需要显示的组件 NotFound组件

  • 在创建vue-router对象时候
    • **/:pathMatch(.*)**会直接返回路径 :abc/cba
    • **/:pathMatch(.*)***会返回以 **/**分隔成的数组 [“abc”,“cba”]
//创建vue router对象
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{//当访问的路径,不属于上面的路由path: "/:pathMatch(.*)",component: () =>import(/*webpackChunkName:'NotFound'*/ "../components/NotFound.vue"),},],
});

嵌套路由

比如在个人中心页面中,我们会有多个页面,资料设置,头像设置等等,这时候就需要用到嵌套路由

  • 首先在vue-router对象中添加嵌套路由
    • 比如在home路由下面,有person组件
    • 就需要在home路由中添加children属性,添加peoson路由
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{path: "/home/:id",component: () =>import(/*webpackChunkName:'home'*/ "../components/Home.vue"),//配置嵌套路由children: [{//直接写子路由名称path: "person",component: () => import("../components/Person.vue"),},],},],
});
  • 在home组件中添加相应的 router-view标签
<template>Home:{{ $route.params.id }}<router-view></router-view>
</template>

编程式路由跳转

前面进行路由跳转的方式都是通过标签进行跳转,如果是通过js代码跳转,该怎么操作

  • 在options API中
//直接传入路径
this.$router.push("/home")//传入对象,可以携带查询内容
this.$router.push({path:"/home",query:{name:"zhangcheng"}
})//获取传入的参数
$route.query即可获取
  • 在composition API中
//首先引入函数
import {useRouter} from 'vue-router'const router = useRouter()//向前一步
router.forward()//返回上一步
router.back()//前进两步
router.go(2)
//后退两步
router.go(-2)//直接传入路径
router.push("/home")//传入对象,可以携带查询内容
router.push({path:"/home",query:{name:"zhangcheng"}
})//获取传入的参数
$route.query即可获取

动态添加路由

在实际开发中,我们会根据不同的角色,去注册一些该角色特有的路由

  • 在创建vue-router对象的时候,去添加路由
  • 比如现在有一个home路由
//创建vue router对象
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{name:"home",path: "/home/:id",component: () =>import(/*webpackChunkName:'home'*/ "../components/Home.vue"),},],
});
  • 现在要添加一个person路由
router.addRoute({path: "/person",component:xxx
})
  • 要在home路由下添加一个子路由homevip
    • 首先要给home路由,用name属性添加一个名称
    • 之后在 调用addRoute函数的时候,以一个参数传入home路由的name,第二个参数传入子路由的配置
router.addRoute("home",{path: "/homevip",component:xxx
})

动态路由管理的其他方法

  • 删除路由方式一
    • 通过添加一个与已有name相同的路由
    • 比如现在有一个home路由,name也为home
    • 此时再添加一个路由,name依旧为home,就会进行覆盖
//创建vue router对象
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{name:"home",path: "/home/:id",component: () =>import(/*webpackChunkName:'home'*/ "../components/Home.vue"),},],
});//会覆盖上面的路由
router.addRoute({name:"home",path:"/home/parent",component:xxx})
  • 删除路由方式二
    • 通过调用 removeRoute方法进行删除
    • 传入路由的name即可
router.removeRoute("home")
  • 获取所有路由
router.getRoutes()//返回的是一个数组

路由导航守卫

在跳转到特定的路由前,需要有一些特定的条件,才可以成功跳转

比如,现在用户想访问订单页面,但是该用户没有登录,所以不会直接跳转到订单页面,而是跳转到登录页面进行登录

  • 我们可以通过 全局前置守卫进行设置
    • 在每次完成页面跳转前,都会触发传入的回调函数
    • 会有两个参数
      • to: 即将要进入的目标
      • from: 当前导航正要离开的路由
    • 返回值
      • return false会取消当前的导航
      • return str跳转到与str对应的路由
      • return {name:'home'}返回一个对象,对象中可以有name,path属性
      • 若什么都不 return就会跳转自动跳转
const router = createRouter({//使用的是hash模式history: createWebHashHistory(),routes: [{name:"home",path: "/home/:id",component: () =>import(/*webpackChunkName:'home'*/ "../components/Home.vue"),},],
});router.beforeEach((to,form)=>{//填写逻辑//都会跳转到home路由return "/home"
})

完整的导航解析流程

完整的导航解析流程

  1. 导航被触发。
  2. 在失活的组件里调用 beforeRouteLeave 守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫(2.2+)。
  5. 在路由配置里调用 beforeEnter
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 调用全局的 beforeResolve 守卫(2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

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

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

相关文章

Window环境下使用go编译grpc最新教程

网上的grpc教程都或多或少有些老或者有些问题&#xff0c;导致最后执行生成文件时会报很多错。这里给出个人实践出可执行的编译命令与碰到的报错与解决方法。&#xff08;ps:本文代码按照煎鱼的教程编写&#xff1a;4.2 gRPC Client and Server - 跟煎鱼学 Go (gitbook.io)&…

【MySQL】_JDBC编程

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…

《Git 简易速速上手小册》第2章:理解版本控制(2024 最新版)

文章目录 2.1 本地仓库与版本历史2.1.1 基础知识讲解2.1.2 重点案例&#xff1a;回滚错误提交2.1.3 拓展案例 1&#xff1a;利用 git bisect 查找引入 bug 的提交2.1.4 拓展案例 2&#xff1a;合并提交历史 2.2 远程仓库的使用2.2.1 基础知识讲解2.2.2 重点案例&#xff1a;在 …

midnightsun-2018-flitbip:任意地址写

题目下载 启动脚本 启动脚本如下&#xff0c;没开启任何保护 #!/bin/bash qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./initrd \-nographic \-monitor /dev/null \-append "nokaslr root/dev/ram rw consolettyS0 oopspanic paneic1 quiet" 2>…

预测模型:MATLAB线性回归

1. 线性回归模型的基本原理 线性回归是统计学中用来预测连续变量之间关系的一种方法。它假设变量之间存在线性关系&#xff0c;可以通过一个或多个自变量&#xff08;预测变量&#xff09;来预测因变量&#xff08;响应变量&#xff09;的值。基本的线性回归模型可以表示为&…

备战蓝桥杯---动态规划(基础2)

本专题主要是介绍几个比较经典的题目&#xff1a; 假设我们令f[i]为前i个的最长不下降子序列&#xff0c;我们会发现难以转移方程很难写&#xff08;因为我们不知道最后一个数&#xff09;。 于是&#xff0c;我们令f[i]为以i结尾的最长不下降子序列&#xff0c;这样子我们就可…

香港倾斜模型3DTiles数据漫游

谷歌地球全香港地区倾斜摄影数据&#xff0c;通过工具转换成3DTiles格式&#xff0c;将这份数据完美加载到三维数字地球Cesium上进行完美呈现&#xff0c;打造香港地区三维倾斜数据覆盖&#xff0c;完美呈现香港城市壮美以及维多利亚港繁荣景象。再由12.5米高分辨率地形数据&am…

SpringCloud-Ribbon:负载均衡(基于客户端)

6. Ribbon&#xff1a;负载均衡(基于客户端) 6.1 负载均衡以及Ribbon Ribbon是什么&#xff1f; Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。简单的说&#xff0c;Ribbon 是 Netflix 发布的开源项目&#xff0c;主要功能是提供客户端的软件负…

【Java EE】----SpringBoot的日志文件

1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用&#xff1a; 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为&#xff1a;&#xff08;1-6级别从低到高&#xff09; trace&#xff1a;微量&#…

SCI 1区论文:Segment anything in medical images(MedSAM)[文献阅读]

基本信息 标题&#xff1a;Segment anything in medical images中文标题&#xff1a;分割一切医学图像发表年份: 2024年1月期刊/会议: Nature Communications分区&#xff1a; SCI 1区IF&#xff1a;16.6作者: Jun Ma; Bo Wang(一作&#xff1b;通讯)单位&#xff1a;加拿大多…

排序算法---插入排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 插入排序是一种简单直观的排序算法&#xff0c;它的基本思想是将待排序的元素分为已排序和未排序两部分&#xff0c;每次从未排序部分中选择一个元素插入到已排序部分的合适位置&#xff0c;直到所有元素都插入到已排序部分…

微软技术专家带你学 AI|Azure OpenAI 服务

点击蓝字 关注我们 编辑&#xff1a;Alan Wang 排版&#xff1a;Rani Sun 微软技术专家带你学 AI 新的一年&#xff0c;为帮助开发者们在 Azure 上掌握人工智能&#xff0c;我们特别带来「微软技术专家带你学 AI」系列&#xff0c;通过4期的课程&#xff0c;带大家从机器学习的…

ES高可用架构涉及常用功能整理

ES高可用架构涉及常用功能整理 1. es的高可用系统架构和相关组件2. es的核心参数2.1 常规配置2.2 特殊优化配置2.2.1 数据分片按ip打散2.2.2 数据分片机架感知2.2.3 强制要求数据分片机架感知2.2.4 写入线程池优化2.2.5 分片balance优化2.2.6 限流控制器优化 3. es常用命令3.1 …

在屏蔽任何FRP环境下从零开始搭建安全的FRP内网穿透服务

背景 本人目前在境外某大学读博&#xff0c;校园网屏蔽了所有内网穿透的工具的数据包和IP访问&#xff0c;为了实现在家也能远程访问服务器&#xff0c;就不得不先开个学校VPN&#xff0c;再登陆。我们实验室还需要访问另一个大学的服务器&#xff0c;每次我都要去找另一个大学…

海外云手机——平台引流的重要媒介

随着互联网的飞速发展&#xff0c;跨境电商、短视频引流以及游戏行业等领域正经历着迅猛的更新换代。在这个信息爆炸的时代&#xff0c;流量成为至关重要的资源&#xff0c;而其中引流环节更是关乎业务成功的关键。海外云手机崭露头角&#xff0c;成为这一传播过程中的重要媒介…

消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ

消息队列 消息队列&#xff1a;它主要用来暂存生产者生产的消息&#xff0c;供后续其他消费者来消费。 它的功能主要有两个&#xff1a; 暂存&#xff08;存储&#xff09;队列&#xff08;有序&#xff1a;先进先出 从目前互联网应用中使用消息队列的场景来看&#xff0c;…

【龙年大礼】| 2023中国开源年度报告!

【中国开源年度报告】由开源社从 2015 年发起&#xff0c;是国内首个结合多个开源社区、高校、媒体、风投、企业与个人&#xff0c;以纯志愿、非营利的理念和开源社区协作的模式&#xff0c;携手共创完成的开源研究报告。后来由于一些因素暂停&#xff0c;在 2018 年重启了这个…

Qt PCL学习(二):点云读取与保存

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建 0. 效果演示 1. pcl_open_save.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgets// 添加下行代码&#…

[word] word2019段落中创建纵横混排的方法图解教程 #知识分享#其他#职场发展

word2019段落中创建纵横混排的方法图解教程 有时候在word文档中需要让文字纵横混排&#xff0c;word2019正好为我们带来了纵横混排的功能了&#xff0c;今天我们就来给大家介绍一下word2019段落中创建纵横混排的方法。 步骤1&#xff1a;打开Word文档&#xff0c;选中需要纵向…

MT4和MT5中如何创建挂单,很简单,fpmarkets1秒教会

其实在MT4和MT5中创建挂单是非常容易的&#xff0c;今天fpmarkets1秒教会&#xff0c;接下来一步一步的演示&#xff1a; 首先单击新订单&#xff0c;将出现设置窗口。在“类型”选项卡中选择“按待定顺序”。 接着选择挂单的类型。选择买入止损单&#xff0c;并指定订单执行的…