vue-router路由(重定向,嵌套,动态路由匹配,命名,高亮,守卫)

embedded/2024/9/24 19:19:19/

一、前端路由的概念与原理

路由router就是对应关系。分为前端路由和后端路由。

1后端路由

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

const express = require('express');
const router = express.Router();router.get('/user', function(req, res){//路由处理函数
});
router.post('/user', function(req, res){//路由处理函数
});module.exports=router
2.前端路由

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

前端路由是hash地址和组件之间的对应关系。

3.前端路由的工作方式

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

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

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

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

//页面上的路由链接
<a href=''#/home></a>//前端路由的对应关系
{path:'#/home',component:Home}//页面上要展示的组件
<Home/>
4.模拟实现简单前端路由
<template><a href="#/box">about</a><a href="#/demo">demo</a><hr><component :is="comName"></component>
</template>
<script >
import Box from "../box/index.vue";
import Demo from "../demo/index.vue";
export default{components:{Mato,Demo},data(){return{comName:""}},created(){window.onhashchange=()=>{switch(location.hash){case '#/box':this.comName='Box';breakcase '#/demo':this.comName='Demo';break}}}
}

二、vue-router

vue-router4.x版本只能结合vue3使用

1.基本使用步骤

a.在项目中安装vue-router

npm install vue-router@next -S
//next是最新版本

b.定义路由组件

c.声明路由链接和占位符

//声明路由链接
<router-link to='/home'>首页</router-link>
//声明路由占位符
<router-view></router-view>

d.创建路由模块

import {createRouter,createWebHashHistory} from "vue-router";import home from "../views/home/index.vue";
import about from "../views/about/index.vue";const router=createRouter({history:createWebHashHistory(import.meta.env.Base_URL),routes:[{  path:"/", redirect:"/home" },{  path:"/home", name:"/home", component:home  },{  path:"/about", name:"/about", component:about  }]
})export default router;

e.导入并挂载路由

//main.js
import router from "./routers/index.js";
app.use(router)

 history:createWebHashHistory(import.meta.env.Base_URL),如果不写()会报错,可以写成history:createWebHashHistory()

2.路由重定向redirect

用户在访问地址a的时候,强制用户跳转到地址c,从而展示特定的组件页面。

 {  path:"/", redirect:"/home" },
3.路由高亮
a.router-link-active的类名

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

<template><div><router-link to="/home">home</router-link><router-link to="/about">about</router-link><hr><router-view></router-view></div>
</template>
<script setup>
</script>
<style scoped>
.router-link-active{background-color: red;color: #fff;font-weight: bold;
}
</style>
b.linkActiveClass属性

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

import {createRouter,createWebHashHistory} from "vue-router";import home from "../views/home/index.vue";
import about from "../views/about/index.vue";const router=createRouter({history:createWebHashHistory(import.meta.env.Base_URL),linkActiveClass:'router-active'routes:[{  path:"/", redirect:"/home" },{  path:"/home", name:"/home", component:home  },{  path:"/about", name:"/about", component:about  }]
})export default router;
//style.css
.router-active{background-color: red;color: #fff;font-weight: bold;
}
4.嵌套路由
//嵌套路由 {path:'/about',component:About,children:[{path:'tab1',component:Tab1 },{path:'tab2', component:Tab2 }]}//嵌套组件
<template><router-link to="/about/tab1">tab1</router-link><router-link to="/about/tab2">tab2</router-link><hr><router-view></router-view>
</template>

嵌套路由的重定向

        {path:'/about',component:About,redirect:'/about/tab1',children:[{path:'tab1',component:Tab1 },{path:'tab2', component:Tab2 }]}
5.动态路由匹配

把hash地址中可变的部分定义为参数项,从而提高路由规则的复用性。

<template><div><router-link to="/movie/1">movie1</router-link><router-link to="/movie/2">movie2</router-link><router-link to="/movie/3">movie3</router-link><hr><router-view></router-view></div>
</template>{path:'/movie/:id',component:Movie,}<template><div>movie</div>{{ $route.params.id }}
</template>
使用props接收路由参数

为了简化路由参数的获取形式,vue-router允许在路由规则中开启props传参。

        {path:'/movie/:id',component:Movie,props:true}<template><div>movie</div>{{ id }}<hr>
</template>
<script>
export default{props:['id']
}
</script>
6.vue-router中编程式导航api

通过调用api实现导航的方式叫做编程式导航。调用location.href跳转到新页面

通过点击链接实现导航的方式叫做声明式导航。<a/><router-link>标签

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

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

<template><div>home</div><button @click="goToMovie(3)">导航去movie页面</button>
</template>
<script >
export default{methods:{goToMovie(id){this.$router.push(`/movie/${id}`)}}
}
</script>
b.this$router.go() 

实现导航历史的前进,后退

<template><div>movie</div>{{ id }}<button @click="goBack">后退</button><hr>
</template>
<script>
export default{props:['id'],methods:{goBack(){this.$router.go(-1)}}
}
</script>
7.命名路由(添加name属性)

通过name属性为路由规则定义名称的方式叫做命名路由。

明明路由name必须唯一,不能重复。

{path:'/movie/:id',name:'movie',component:Movie,props:true}
<template><div>home</div><button @click="goToMovie(3)">导航去movie页面</button><router-link :to="{name:'movie',params:{id:3}}">导航去movie页面</router-link>
</template>
<script >
export default{methods:{goToMovie(id){this.$router.push({name:'movie',params:{id:id}})}}
}
</script>

三、导航守卫

导航首位可以控制路由的访问权限。

1.如何声明全局路由守卫

全局导航首位会拦截每个路由规则,从而对每个路由进行访问权限的控制。

2.路由守卫的3个参数to,from,next

to目标路由对象

from 当前导航正要离开的路由对象

next是一个函数,表示放行。不声明next参数,则默认用户可以访问每一个路由,声明了next参数,则必须调用next()函数,否则不允许用户访问任何一个路由。next(false);强制其停留在当前页面;next(‘’/login);强制其跳转到指定页面

router.beforeEach((to,from,next)=>{const token = localStorage.getItem('token');if(to.path==='/main' && !token){console.log('goHome');next('/home')}else{next()}
})


http://www.ppmy.cn/embedded/116226.html

相关文章

Linux 基础入门操作 第九章 进程之间通讯消息队列

9.5 消息队列 消息队列也可以独立于发送和接收进程而存在&#xff0c;从而消除了在同步命名管道的打开和关闭时可能产生的困难。2、同时通过发送消息还可以避免命名管道的同步和阻 塞问题&#xff0c;不需要由进程自己来提供同步方法。3、接收程序可以通过消息类型有选择地接收…

设计模式七大原则

设计模式的七大原则是指导软件设计和架构的基本准则&#xff0c;帮助开发者创建更灵活、可维护和可扩展的系统。以下是这七大原则的详细介绍&#xff1a; 1. 单一职责原则 (SRP: Single Responsibility Principle) 定义 一个类&#xff0c;应当只有一个引起它变化的原因&…

Trainer API训练属于自己行业的本地大语言模型 医疗本地问答大模型示例

Trainer API 是 Hugging Face transformers 库中强大而灵活的工具&#xff0c;简化了深度学习模型的训练和评估过程。通过提供高层次的接口和多种功能&#xff0c;Trainer API 使研究人员和开发者能够更快地构建和优化自然语言处理模型 文章目录 前言一、Trainer API它能做什么…

vue3中使用nexttick

1、引入 import { nextTick } from vue 2、具体使用&#xff0c;配合异步 setup() {const message ref(Hello!)const changeMessage async newMessage > {message.value newMessageawait nextTick()console.log(Now DOM is updated)}} 3、具体使用&#xff0c;普通 方…

使用四叉树碰撞的游戏 显微镜RPG

实现四叉树碰撞检测 //author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽&#xff0c;绘制&#xff0c;放大缩小中 // 2024-7-20 // 直线改每帧打印一个点&#xff0c;生长的直线&#xff0c;直线炮弹 /…

docker存储

docker分层结构 如图所示&#xff0c;容器是由最上面可读可写的容器层&#xff0c;以及若干个只读镜像层组成&#xff0c;创建容器时&#xff0c;容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制&#xff1a; 1、容器中新生成的数据会直接存放在容器层&#xf…

sklearn特征选取之SelectFromModel

sklearn.feature_selection.SelectFromModel 是一种基于模型的重要性权重进行特征选择的工具&#xff0c;允许我们根据学习器的权重或特征重要性自动选择特征。它通过从模型中提取特征的重要性来选择特征&#xff0c;常用于与那些具有 coef_ 或 feature_importances_ 属性的模型…

计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…