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://www.mfbz.cn/a/380059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

放假--寒假自学版 day1(补2.5)

fread 函数&#xff1a; 今日练习 C语言面试题5道~ 1. static 有什么用途&#xff1f;&#xff08;请至少说明两种&#xff09; 1) 限制变量的作用域 2) 设置变量的存储域 2. 引用与指针有什么区别&#xff1f; 1) 引用必须被初始化&#xff0c;指针不必。 2) 引用初始…

数据结构与算法-链表(力扣附链接)

之前我们对C语言进行了一定的学习&#xff0c;有了一些基础之后&#xff0c;我们就可以学习一些比较基础的数据结构算法题了。这部分的知识对于我们编程的深入学习非常有用&#xff0c;对于一些基本的算法&#xff0c;我们学习之后&#xff0c;就可以参加一些编程比赛了&#x…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程&#xff0c; 面向过程就是一步一步去操作&#xff0c;你需要知道每一步的步骤。 面向对象的编程以对象为核心&#xff0c;通过定义类描述实体及其行为&#xff0c;并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用

第九课 识谱https://m.lizhiweike.com/lecture2/29362692 第十课 基础乐理(二)——节奏篇https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2124.3001.6192

CPU和GPU有什么区别,玩游戏哪个更重要?

大家好&#xff01;今天我们要聊的话题是CPU和GPU&#xff0c;它们在电脑中扮演着重要的角色&#xff0c;虽然看起来只是两个简单的缩写&#xff0c;但它们的功能和影响是截然不同的&#xff01; 那么&#xff0c;究竟CPU和GPU有什么区别呢&#xff1f;在玩游戏时&#xff0c;…

OCP使用web console创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 在 crc start 启动crc时&#xff0c;可以看到&#xff1a; .....…

寒假作业2024.2.6

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4:请使用插入排序实现升序排序 #include <stdio.h> #include <stdl…

机器学习11-前馈神经网络识别手写数字1.0

在这个示例中&#xff0c;使用的神经网络是一个简单的全连接前馈神经网络&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;。这个神经网络由几个关键组件构成&#xff1a; 1. 输入层 输入层接收输入数据&#xff0c;这里是一个 28x…

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…

真正免费的文件恢复软件easyrecovery2024中文版

easyrecovery数据恢复软件是一款广受好评的数据恢复工具&#xff0c;它能够有效地帮助用户恢复各种类型的文件。无论是照片、视频、音乐还是文档&#xff0c;都能轻松地找回这些重要文件。操作安全、用户可自主操作的数据恢复方案&#xff0c;它支持从各种各样的存储介质恢复删…

备战蓝桥杯---动态规划之背包问题引入

先看一个背包问题的简单版&#xff1a; 如果我们暴力枚举可能会超时。 但我们想一想&#xff0c;我们其实不关心怎么放&#xff0c;我们关心的是放后剩下的体积。 用可行性描述即可。 于是我们令f[i][j]表示前i个物品能否放满体积为j的背包。 f[i][j]f[i-1][j]||f[i-1][j-v…

Mysql为什么使用B+Tree作为索引结构

B树和B树 一般来说&#xff0c;数据库的存储引擎都是采用B树或者B树来实现索引的存储。首先来看B树&#xff0c;如图所示&#xff1a; B树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对于数…

【Spring源码解读!底层原理高级进阶】【上】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析

1、MC协议回顾 MC是公开协议 &#xff0c;所有报文格式都是有标准 &#xff0c;MC协议可以在串口通信&#xff0c;也可以在以太网通信 串口&#xff1a;1C、2C、3C、4C 网口&#xff1a;4E、3E、1E A-1E是三菱PLC通信协议中最早的一种&#xff0c;它是一种基于二进制通信协…

windows10安装配置nvm以达到切换nodejs的目的

前言 各种各样的项目&#xff0c;各种node环境&#xff0c;还有node_modules这个庞然大物。。想想都觉得恐怖。 所以现在有了&#xff1a;nvm-切换node环境&#xff0c;pnpm–解决重复下载同样类库的问题。 下面将就如何在win10下配置进行说明 nvm下载配置 nvm的github下载地…

Flink从入门到实践(三):数据实时采集 - Flink MySQL CDC

文章目录 系列文章索引一、概述1、版本匹配2、导包 二、编码实现1、基本使用2、更多配置3、自定义序列化器4、Flink SQL方式 三、踩坑1、The MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match the configured timezone Asia/Shanghai. 参考资…

kmeans聚类选择最优K值python实现

Kmeans算法中K值的确定是很重要的。 下面利用python中sklearn模块进行数据聚类的K值选择 数据集自制数据集&#xff0c;格式如下&#xff1a; 维度为3。 ①手肘法 手肘法的核心指标是SSE(sum of the squared errors&#xff0c;误差平方和)&#xff0c; 其中&#xff0c;Ci是第…

微调LLM或使用RAG,开发RAG管道的12个痛点

论文地址&#xff1a;archive.is/bNbZo Pain Point 1: Missing Content 内容缺失 Pain Point 2: Missed the Top Ranked Documents 错过排名靠前的文档 Pain Point 3: Not in Context — Consolidation Strategy Limitations 不在上下文中 — 整合战略的局限性 Pain Point …

免费生成ios证书的方法(无需mac电脑)

使用hbuilderx的uniapp框架开发移动端程序很方便&#xff0c;可以很方便地开发出移动端的小程序和app。但是打包ios版本的app的时候却很麻烦&#xff0c;官方提供的教程需要使用mac电脑来生成证书&#xff0c;但是mac电脑却不便宜&#xff0c;一般的型号都差不多上万。 因此&a…

【Java面试】数据类型常见面试题

什么是包装类型 将基本类型包装进了对象中得到的类型 基本类型和包装类型有什么区别 用途不同&#xff1a;基本类型一般用于局部变量&#xff0c;包装类型用于其他地方存储方式不同&#xff1a;用于局部变量的基本类型存在虚拟机栈中的局部变量表中&#xff0c;用于成员变量…
最新文章