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.mzph.cn/news/675108.shtml

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

相关文章

读懂 FastChat 大模型部署源码所需的异步编程基础

原文&#xff1a;读懂 FastChat 大模型部署源码所需的异步编程基础 - 知乎 目录 0. 前言 1. 同步与异步的区别 2. 协程 3. 事件循环 4. await 5. 组合协程 6. 使用 Semaphore 限制并发数 7. 运行阻塞任务 8. 异步迭代器 async for 9. 异步上下文管理器 async with …

解释Java中的事务管理,以及事务的隔离级别是什么?

解释Java中的事务管理&#xff0c;以及事务的隔离级别是什么&#xff1f; 在Java中&#xff0c;事务管理是一种机制&#xff0c;用于管理对数据库进行的一系列操作&#xff0c;以确保这些操作要么全部成功执行&#xff0c;要么全部失败回滚&#xff0c;保持数据的一致性和完整…

STM32 的优势与不足

STM32 的优势和不足如下&#xff1a; 优势&#xff1a; ① 性能&#xff1a;STM32 采用了 ARM Cortex-M 核&#xff0c;具有高性能、低功耗、低成本等特点&#xff0c;可以满足各种嵌入式系统应用的需求。 ② 生态系统&#xff1a;STM32 具有完善的生态系统&#xff0c;包括各种…

戴上HUAWEI WATCH GT 4,解锁龙年新玩法

春节将至&#xff0c;华为WATCH GT 4作为一款颜值和实力并存的手表&#xff0c;能为节日增添了不少趣味和便利。无论你是钟情于龙年表盘或定制属于自己的表盘&#xff0c;还是过年用来抢红包或远程操控手机拍全家福等等&#xff0c;它都能成为你的“玩伴”。接下来&#xff0c;…

宏观行业心得

OLAP的特点 电商这样的OLTP场景大家更熟悉。相比之下&#xff0c;OLAP的特点&#xff1a; 读相对多&#xff0c;1000row以上大批写入&#xff0c;不改已有数据查询时输出很多行、很少列&#xff0c;结果被过滤或聚合后能够在一台服务器的内存中单台服务器qps数百&#xff0c;…

fastapi mysql 开发restful 3

pip install mysql-connector-python pymysql 数据库链接 创建src目录&#xff0c;里面创建db.py 代码如下&#xff1a; # 导入mysql.connector模块&#xff0c;该模块提供了与MySQL数据库进行连接和交互的功能。 import mysql.connector # 定义一个函数get_db_connectio…

二分算法--模板及原理总结

二分答案 首先我们看这个图&#xff1a; 我们需要二分的答案就是这个临界点x。 什么情况下可以使用二分呢&#xff1a; 具有单调性&#xff08;单调递增&#xff0c;单调递减&#xff09;&#xff0c;二段性&#xff08;整个区间一分为二&#xff0c;一段区间满足&#xff0c;一…

为什么许多年轻人不喜欢回农村过年了?

为什么许多年轻人不喜欢回农村过年了&#xff1f; 随着时代的变迁和社会的发展&#xff0c;越来越多的年轻人选择在春节期间留在城市&#xff0c;而不是回到农村老家过年。这一现象引起了人们的关注和思考&#xff1a;为什么许多年轻人不喜欢回农村过年了&#xff1f; 首先&a…

全栈笔记_插件篇(用Volar替换Vuter)

Volar与Vuter的区别 TS支持&#xff1a;Volar和Vuter是2个独立的插件&#xff0c;都是为.vue单文件组件提供代码高亮以及语法支持&#xff0c;但是Vuter对ts的支持并不友好。唯一根标签&#xff1a;Volar 不限制是否唯一根标签&#xff0c;vuter 则会报错 The template root r…

史上最“昂贵”的漏洞

阿丽亚娜 5 号”事故 欧洲航天局“阿丽亚娜 5 号”运载火箭在 1996 年 6 月 4 日首次发射时发生了事故。火箭在飞行的第 40 秒由于软件错误而解体并爆炸&#xff0c;该软件直接沿用了以前“阿丽亚娜 4 号”火箭的软件&#xff0c;且未在新环境中进行测试。 此次事故导致四颗卫…

Qt网络编程-QTcpServer的封装

简单封装Tcp服务器类&#xff0c;将QTcpServer移入线程 头文件&#xff1a; #ifndef TCPSERVER_H #define TCPSERVER_H#include <QObject>class QTcpSocket; class QTcpServer; class QThread; class TcpServer : public QObject {Q_OBJECT public:explicit TcpServer(…

SpringBoot响应式编程教程-WebFlux

SpringBoot响应式编程教程-WebFlux 前言正文一、Reactor1、核心概念2、核心特性 二、Spring Webflux与springmvc的组件对比 三、R2DBC 结语 前言 最近有个项目需要用到响应式编程&#xff0c;一开始还是很懵的&#xff0c;以为是网页的自适应&#xff0c;通过部分文章的学习&a…

【MIMO】

MIMO技术入门 1.简介 MIMO(多入多出):多天线技术。 注意&#xff1a;此处的多天线&#xff0c;并不是有多个天线板&#xff0c;对基站来讲指天线有多套振子&#xff08;每一套振子都可以看成一个独立的天线&#xff09;。 4G 8天线&#xff1b;5G 64T64R&#xff1b;不仅基站…

[NOIP1998 普及组] 幂次方 题解 含源码

[NOIP1998 普及组] 幂次方 题目描述 任何一个正整数都可以用 2 2 2 的幂次方表示。例如 $13727232^0 $。 同时约定次方用括号来表示&#xff0c;即 a b a^b ab 可表示为 a ( b ) a(b) a(b)。 由此可知&#xff0c; 137 137 137 可表示为 2 ( 7 ) 2 ( 3 ) 2 ( 0 ) 2(7…

什么是VPS服务器技术

VPS就是虚拟私有服务器&#xff0c;那VPS服务器技术具体是包含哪些&#xff1f;什么是VPS服务器技术&#xff1f; VPS可以通过虚拟化技术将一台物理服务器划分成多个虚拟服务器&#xff0c;并且每个虚拟服务器都有着属于自己的独立配置&#xff0c;是多个用户拥有着属于自己的资…

JavaScript valueOf() 方法详解

valueOf() valueOf() 方法通常由 JavaScript 在后台自动调用&#xff0c;并不显式地出现在代码中。 所有主要浏览器都支持valueOf()。 Number对象 valueOf() 方法可以返回数字的原始值。 语法&#xff1a; number.valueOf() // 返回一个数的原始值返回一个 Number 对象的…

【模板初阶】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义…

FPGA_工程_基于Rom的VGA图像显示

一 工程框图 框图中&#xff0c;CLK_in&#xff0c;Vga_ctrl&#xff0c;Vga_pic模块已有&#xff0c;只需要对顶层模块进行修改&#xff0c;并将rom ip例化添加到Vga_pic模块的.v文件中&#xff0c;对Vga_pic的.v文件进行一定修改。 二 理论补充 显示图像的方法&#xff1a;…

Mac 版 Excel 和 Windows 版 Excel的区别

Excel是一款由微软公司开发的电子表格程序&#xff0c;广泛应用于数据处理、分析和可视化等领域。它提供了丰富的功能和工具&#xff0c;包括公式、函数、图表和数据透视表等&#xff0c;帮助用户高效地处理和管理大量数据。同时&#xff0c;Excel还支持与其他Office应用程序的…

CSS中可继承与不可继承属性有哪些

一、无继承性的属性 1.display&#xff1a;规定元素应该生成的框的类型 属性值作用none元素不显示&#xff0c;并且会从文档流中移除。block块类型。默认宽度为父元素宽度&#xff0c;可设置宽高&#xff0c;换行显示。inline行内元素类型。默认宽度为内容宽度&#xff0c;不…