Vue-路由

news2024/9/25 3:24:14

一、目标

  • 能够说出前端路由工作的过程
  • 能够知道如何在vue3中配置路由
  • 能够知道如何使用嵌套路由
  • 能够知道如何实现动态路由匹配
  • 能够知道如何使用编程式导航
  • 能够知道如何使用导航守卫

二、目录

  • 前端路由的概念与原理
  • vue-router的基本使用
  • vue-router的高级用法
  • 后台管理案例

前端路由的概念与原理


1.什么是路由

路由(router)就是对应关系。路由分为两大类:

①后端路由

②前端路由

2.回顾:后端路由

后端路由指的是:请求方式、请求地址function处理函数之间的对应关系。在node.js课程中,express路由的基本用法如下:

3.SPA与前端路由

  SPA指的是一个web网站只有唯一的一个HTML页面,所有组件的展示与切换都在这唯一的一个页面内完成。此时,不同组件之间的切换需要通过前端路由来实现。 

结论:在SPA项目中,不同功能之间的切换,要依赖于前端路由来完成!

4.什么是前端路由

通俗易懂的概念:Hash地址组件之间的对应关系

5.前端路由的工作方式

①用户点击了页面上的路由链接

②导致了URL地址栏中的Hash值发生了变化

前端路由监听到Hash地址的变化

④前端路由把当前Hash地址对应的组件渲染到浏览器中

结论:前端路由,指的是Hash地址组件之间对应关系 

6.实现简易的前端路由

步骤1:导入并注册MyHome、MyMovie、MyAbout三个组件。示例代码如下:

 步骤2:通过<component>标签的is属性,动态切换要显示的组件。示例代码如下:

步骤3:在组件的结构中声明如下3个<a>链接,通过点击不同的<a>链接,切换浏览器地址栏中的Hash值:

 步骤4:在created生命周期函数中监听浏览器地址栏中Hash地址的变化,动态切换要展示的组件的名称:

<template>
  <div>
    <h1>这是根组件</h1>
    <a href="#/home">Home</a>&nbsp; <a href="#/movie">Movie</a>&nbsp;
    <a href="#/about">About</a>&nbsp;
    <component :is="comName"></component>
  </div>
</template>

<script>
import MyAbout from "./components/01.easy-router/MyAbout.vue";
import MyHome from "./components/01.easy-router/MyHome.vue";
import MyMovie from "./components/01.easy-router/MyMovie.vue";

export default {
  name: "MyApp",
  data() {
    return {
      comName: "MyHome",
    };
  },
  components: {
    MyAbout,
    MyHome,
    MyMovie,
  },
  created() {
    window.onhashchange = () => {
      switch (location.hash) {
        case "#/home":
          this.comName = "MyHome";
          break;
        case "#/movie":
          this.comName = "MyMovie";
          break;
        case "#/about":
          this.comName = "MyAbout";
          break;
      }
    };
  },
};
</script>

<style lang="less" scoped></style>

vue-router的基本使用


1.什么是vue-router

vue-router是vue.js官方给出的路由解决方案。他只能结合vue项目进行使用,能够轻松地管理SPA项目中组件的切换。

2.vue-router的版本

vue-router目前有3.x的版本和4.x的版本。其中

  • vue-router 3.x只能结合vue2进行使用
  • vue-router 4.x只能结合vue3进行使用

3.vue-router 4.x的基本使用步骤

①在项目中安装vue-router

②定义路由组件

③声明路由链接占位符

④创建路由模块

导入并挂栽路由模块 

3.1在项目中安装vue-router

在vue3的项目中,只能安装并使用vue-router 4.x。安装的命令如下:

3.2定义路由组件

在项目中 定义MyHome.vue、MyMovie.vue、MyAbout三个组件,将来要使用vue-router来控制它们的展示与切换:

3.3声明路由链接占位符 

可以使用<router-link>标签来声明路由链接,并使用<router-view>标签来声明路由占位符。示例代码如下:

 3.4创建路由模块

在项目中创建router.js路由模块,在其中按照如下4个步骤创建并得到路由的实例对象:

①从vue-router中按需导入两个方法

②导入需要使用路由控制的组件

③创建路由实例对象

④向外共享路由实例对象

⑤在main.js中导入并挂栽路由模块

从vue-router中按需导入两个方法

 创建路由实例对象

 main.js

import { createApp } from 'vue'
import App from './App.vue'
import './index.css'
import router from './components/01.easy-router/router'
const app = createApp(App)
    //挂栽路由模块
app.use(router)
app.mount('#app')

App.vue

<template>
  <div>
    <h1>这是根组件</h1>
    <router-link to="/home">首页</router-link>
    <router-link to="/movie">电影</router-link>
    <router-link to="/about">关于</router-link>
    <hr />
    <!-- 路由的占位符 -->
    <router-view></router-view>
  </div>
</template>

<script>
import MyAbout from "./components/01.easy-router/MyAbout.vue";
import MyHome from "./components/01.easy-router/MyHome.vue";
import MyMovie from "./components/01.easy-router/MyMovie.vue";

export default {
  name: "MyApp",
  data() {
    return {
      comName: "MyHome",
    };
  },
  components: {
    MyAbout,
    MyHome,
    MyMovie,
  },
};
</script>

router.js

import { createRouter, createWebHashHistory } from 'vue-router'
import Home from './MyHome.vue'
import Movie from './MyMovie.vue'
import About from './MyAbout.vue'
const router = createRouter({
    history: createWebHashHistory(),
    routes: [
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        { path: '/about', component: About },


    ]
})
export default router

vue-router的高级用法

1.路由重定向

路由重定向指的是:用户在访问地址A的时候,强制用户跳转到地址C,从而展示特定的组件页面。通过路由规则的redirect属性,指定一个新的路由地址,可以很方便地设置路由的重定向:

 routes: [
        { path: '/', redirect: '/home' },
        { path: '/home', component: Home },
        { path: '/movie', component: Movie },
        { path: '/about', component: About },
    ]
})

 2.路由高亮

可以通过如下的两种方式,将激活的路由链接进行高亮显示:

①使用默认的高亮class类

自定义路由高亮的class类

2.1默认的高亮class类

被激活的路由链接,默认会应用一个叫做router-link-active的类名。开发者可以使用此类名选择器,为激活的路由链接设置高亮的样式:

2.2自定义路由高亮的class类

在创建路由的实例对象时,开发者可以基于linkActiveClass属性,自定义路由链接被激活时所应用的类名: 

3.嵌套路由 

通过路由实现组件的嵌套展示,叫做嵌套路由。

 ①声明子路由链接子路由占位符

 ②在父路由规则中,通过children属性嵌套声明子路由规则

3.1声明子路由链接子路由占位符

在About.vue组件中,声明tab1和tab2的子路由链接以及子路由占位符。示例代码如下:

3.2通过children属性声明子路由规则 

在router.js路由模块中,导入需要的组件,并使用children属性声明子路由规则。示例代码如下:

注意:子路由规则的path不要以/开头 

3.3在嵌套路由中实现路由的重定向

4.动态路由匹配 

 思考:有如下3个路由链接:

 4.1动态路由概念

动态路由指的是:把Hash地址中可变的部分定义为参数项,从而提高路由规则的复用性。在vue-router中使用英文的冒号(:)来定义路由的参数项。示例代码如下:

 4.2 $route.params参数对象

通过动态路由匹配的方式渲染出来的组件中,可以使用$route.params对象访问到动态匹配的参数值

 4.3使用props接收路由参数

为了简化路由参数的获取形式,vue-router允许在路由规则开启props传参。示例代码如下:

5.编程式导航 

通过调用API实现导航的方式,叫做编程式导航。与之对应的,通过点击链接实现导航的方式,叫做声明式导航。例如:

  • 普通网页中点击<a>链接、Vue项目中点击<router-link>都属于声明式导航
  • 普通网页中调用location.href跳转到新页面的方式,属于编程式导航

5.1 vue-router中的编程式导航API

vue-router提供了许多编程式导航的API,其中最常用的两个API分别是:

this.$router.push('hash地址')

  • 跳转到指定Hash地址,从而展示对应的组件

this.$router.go(数值n)

  • 实现导航历史的前进、后退

5.2this.$router.push('hash地址')

 调用this.$router.push()方法,可以跳转到指定的hash地址,从而展示对应的组件页面。示例代码如下:

 5.3 this.$router.go()

调用this.$router.go()方法,可以在浏览历史中进行前进和后退。示例代码如下:

6.命名路由 

通过name属性为路由规则定义名称的方式,叫做命名路由。示例代码如下:

 注意:命名路由的name值不能重复,必须保证唯一性

6.1使用命名路由实现声明式导航

为<router-link>标签动态绑定to属性的值,并通过name属性指定要跳转到的路由规则。期间还可以用params属性指定跳转期间要携带的路由参数。示例代码如下:

 6.2使用命名路由实现编程式导航

调用push函数期间指定一个配置对象,name是要跳转到的路由规则、params是携带的路由参数:

 7.导航守卫

导航守卫可以控制路由的访问权限

 7.1如何声明全局导航守卫

全局导航守卫拦截每个路由规则,从而对每个路由进行访问权限的控制。可以按照如下的方式定义全局导航守卫:

  每次访问路由规则都会触发导航守卫中的回调函数。

7.2守卫方法的3个形参

全局导航守卫的守卫方法中接收3个形参,格式为:

  •  to:将要访问的路由的信息
  • from:将要离开的路由的信息
  • next:

注意:

①在守卫方法中如果不声明next形参,则默认允许用户访问每一个路由

②在守卫方法中如果声明了next形参,则必须调用next()函数,否则不允许用户访问任何一个路由!

7.3 next函数的3种调用方式

参考示意图,分析next函数的3种调用方式最终导致的效果:

直接放行:next()

强制其停留在当前页面:next(false)

强制其跳转到登录页面:next(‘/login’) 

7.4 结合token控制后台主页的访问权限

 后台管理案例

总结

 

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

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

相关文章

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具&#xff1a;Ubuntu下Questasim10.7安装&#xff08;64bit&#xff09;全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接&#xff0c;后面激活文件参考的第二个 另外…

JavaScript 常用数组方法之数组扁平化「赶紧收藏」

一、什么是数组扁平化 数组扁平化&#xff0c;就是将一个复杂的嵌套多层的数组&#xff0c;一层一层的转化为层级较少或者只有一层的数组。 比如&#xff1a; // 多维数组 var arr [1,2,[3,4,5,[6,7,8],9],10,[11,12]]; // 数组扁平化 [1,2,3,4,5,6,7,8,9,10,11,12]二、实现…

关于在Python的for循环中改变列表的值问题探究

案例一&#xff1a; def test():a [1, 2]for i in a:print(i, id(a))if i 5:breaka [a[0]2, a[1]2] 输出&#xff1a; 1 4313456192 2 4313269056 解释&#xff1a; 在for循环语句中的变量a使用的内存地址为4313456192&#xff0c;这个地址以及存储的值不会因为a的重新赋…

ceph-mon运行原理分析

一、流程&#xff1a;ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1&#xff09;通过命令创建ceph-mon&#xff0c;命令为&#xff1a;ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…

【Jenkins系列】-Pipeline语法全集

Jenkins为您提供了两种开发Pipeline的方式&#xff1a;脚本式和声明式。 脚本式流水线&#xff08;也称为“传统”流水线&#xff09;基于Groovy作为其特定于域的语言。而声明式流水线提供了简化且更友好的语法&#xff0c;并带有用于定义它们的特定语句&#xff0c;而无需学习…

金融行业软件测试面试题及其答案

下面是一些常见的金融行业软件测试面试题及其答案&#xff1a; 1. 什么是金融行业软件测试&#xff1f; 金融行业软件测试是针对金融领域的软件系统进行验证和确认的过程&#xff0c;旨在确保软件在安全、稳定、可靠和符合法规要求的条件下运行。 2. 解释一下金融软件中的风险…

golang,gin框架的请求参数(一)--推荐

golang&#xff0c;gin框架的请求参数&#xff08;一&#xff09; gin框架的重要性不过多的强调&#xff0c;重点就gin使用中的参数传递&#xff0c;获取进行梳理文件&#xff0c;满足使用需求。 获取前端请求参数的几种方法&#xff1a; 一、获取参数【浏览器地址获取参数】…

linux的一些基本指令第二期

rm rm -r 你要删除的目录名 加了-r 之后表示递归删除你要删除的目录 使用这个命名之后&#xff0c;他会一边递归到叶子节点&#xff0c;一边询问你是否要删除&#xff0c;然后会递归回来&#xff0c;在回来的途中删除&#xff1a; rm -rf 你要删除的目录名 强制执行删除操作…

权威认证!伙伴云入选亿欧2023AIGC应用场景创新TOP50榜单

近日, 知名科技与产业创新服务平台【亿欧】发布2023年度AIGC应用场景创新TOP50榜单。 伙伴云作为行业领先的零代码应用搭建平台&#xff0c;率先推出AI智能搭建系统功能&#xff0c;并将Chat GPT应用嵌入伙伴云应用在解决方案层&#xff0c;最终凭借前沿的技术创新力和突出的数…

【NVMe2.0d 17 - 1】Reservation 核心命令

文章目录 Reservation RegisterReservation AcquireReservation ReportReservation Release Reservation Register Reservation Register命令用于注册、取消注册或替换reservation key。 该命令使用Command Dword 10和内存中的Reservation Register data structure 如果该命…

基于seaborn.countplot的柱状图显示Y值及填充形状

参考链接&#xff1a; seaborn 柱状图上显示y值的方法 python柱形图填充 figs,ax plt.subplots(figsize(10,4)) fig sns.countplot(x"状态",hue"等级", datadatas)// 不可通过设置hatch参数来设置 marks ["o","---","***&quo…

IDEA批量启动多个微服务

注&#xff1a;现在盛行微服务开发&#xff0c;通常需要通过idea启动多个项目&#xff0c;每次都一个一个的启动&#xff0c;太麻烦了&#xff0c;不过被担心idea帮我们考虑到这个了&#xff08;不用安装插件哦&#xff09; 配置步骤&#xff1a; 将需要一次性全部启动的微服务…

[STL]详解vector模拟实现

[STL]vector模拟实现 文章目录 [STL]vector模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1构造函数2构造函数3拷贝构造函数析构函数 4. 迭代器相关函数begin函数end函数begin函数const版本end函数const版本 5.容量相关函数size函数capacity函数reserve函数re…

【Nodejs】操作mongodb数据库

1.简介 Mongoose是一个让我们可以通过Node来操作MongoDB的模块。Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装&#xff0c;并提供了更多的功能。在大多数情况下&#xff0c;它被用来把结构化的模式应用到一个MongoDB集合&#xff0c;并…

【每日一题】2500. 删除每行中的最大值

【每日一题】2500. 删除每行中的最大值 2500. 删除每行中的最大值题目描述解题思路 2500. 删除每行中的最大值 题目描述 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元…

阿里Java开发手册~建表规约

1. 【强制】表达是与否概念的字段&#xff0c;必须使用 is _ xxx 的方式命名&#xff0c;数据类型是 unsigned tinyint &#xff08; 1 表示是&#xff0c; 0 表示否 &#xff09; 。 说明&#xff1a; 任何字段如果为非负数&#xff0c;必须是 unsigned 。 正例&am…

Jenkins+Docker+Docker-Compose自动部署,SpringCloud架构公共包一个任务配置

前言 Jenkins和docker的安装&#xff0c;随便百度吧&#xff0c;实际场景中我们很多微服务的架构&#xff0c;都是有公共包&#xff0c;肯定是希望一个任务能够把公共包的配置加进去&#xff0c;一并构建&#xff0c;ok&#xff0c;直接上干货。 Jenkins 全局环境安装 pwd e…

建造者模式——复杂对象的组装与创建

1、简介 1.1、概述 建造者模式又称为生成器模式&#xff0c;它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式向客户端返回的不是一个简单的产品&#xff0c;而是一个由多个部件组成的复杂产品。 建造者模式是较为复杂的创建型模式&#xff0c;它将客户端与包…

【chatGpt】关于websocket连接中对未授权的捕捉问题

目录 问题 有效提问 有效的细节提问 问题 一路上&#xff0c;通过简单的error进行判断弹出授权&#xff0c;会有很多乱弹的现象&#xff1a; &#xff08;1&#xff09;链路正常切换会断 &#xff08;2&#xff09;服务器没有启动会连接不上 &#xff08;3&#xff09;没…

Pytorch深度学习-----DataLoader的用法

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…