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

news2024/9/24 2:30:42

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

路由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';
        break
        case '#/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.coloradmin.cn/o/2159092.html

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

相关文章

Simple Calculator(算法初阶,代码基础,“纯”手撕)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

有关在.Net Core中以TEXT类型将Json格式字段存到数据库的学习

导言 在写个值日接口时发现值日表中的值日时段是可以分多段的&#xff0c;想了想可以使用Json类型来存&#xff0c;不过之前没接触过在后端操作Json格式存到数据库的情况&#xff0c;之后学也了解到了一下方法来实现&#xff0c;故记录一下。 过程 从前端到后端再到数据库的 JS…

图片切换示例【JavaScript】

在 JavaScript 中实现图片切换可以通过多种方法&#xff0c;下面是一个简单的示例&#xff0c;使用 HTML、CSS 和 JavaScript 来实现图片的切换效果。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta c…

VMware Workstation 17.5安装教程

目录 软件介绍 1、下载安装包 2、安装虚拟机 3、卸载虚拟机 软件介绍 VMware&#xff08;虚拟机&#xff09;是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;通过它可在一台电脑上同时运行更多的Microsoft Windows、Linux…

看Threejs好玩示例,学习创新与技术(React-three-fiber)

什么&#xff0c;竟有人把ThreeJS和React绑定在一起&#xff0c;混着用&#xff1f; 1、VUE劫持问题 暂先把今天的问题先放一边&#xff0c;先简单回顾下vue劫持的情况。vue会把data里面的数据自动转换为属性&#xff0c;方便界面与数据交互。这本身是没有任何问题&#xff0…

快手旗下——Kolors模型部署与使用指南

以下是按照要求重写后的 Kolors 模型部署与使用指南&#xff0c;文章风格偏技术性&#xff0c;但保持简洁和易懂的特点&#xff1a; Kolors 模型部署与使用指南 一、Kolors 简介 Kolors 是由快手 Kolors 团队开发的文本到图像生成模型&#xff0c;基于大规模的潜在扩散技术。…

找不到libcef.dll怎么办,libcef.dll丢失怎么重新安装

在计算机使用过程中&#xff0c;我们常常会遇到各种问题。其中&#xff0c;libcef.dll丢失是一个常见的错误提示。libcef.dll是Chromium Embedded Framework的动态链接库&#xff0c;它是许多应用程序和游戏所必需的组件。当libcef.dll丢失或损坏时&#xff0c;可能会导致程序无…

2025秋招内推|招联金融

【投递方式】 直接扫下方二维码&#xff0c;使用内推码: igcefb 【招聘岗位】 深圳&#xff0c;武汉&#xff1a; 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营 客户体验管理 风险管理 资产管理 【校招流程】 简历投递&#xff1a;9月…

死磕P7: JVM内存划分必知必会(一)

这是「死磕P7」系列第 001 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 JVM 内存区域划分是面试常考点&#xff0c;属于死记硬背型&#xff0c;比较让人头大的是不同版本的 JDK 具有不同的划分方式&…

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

联合复现!考虑最优弃能率的风光火储联合系统分层优化经济调度!

前言 目前&#xff0c;尽管不断地追逐可再生能源全额消纳方式&#xff0c;大幅减小弃风弃光电量&#xff0c;但是若考虑风电、光伏发电的随机属性&#xff0c;全额消纳可能造成电网峰谷差、调峰难度及调峰调频等辅助服务费用的剧增&#xff0c;引起电网潜在运行风险。因此&…

英特尔AI加速器Gaudi 3下周发布,挑战NVIDIA统治地位!

英特尔正稳步推进其2024年计划&#xff0c;备受瞩目的AI加速器Gaudi3预计将于下周震撼登场。这款被誉为英特尔AI英雄的产品&#xff0c;专注于处理大规模训练和推理任务&#xff0c;拥有无与伦比的扩展能力。面对市场对高效能半导体的旺盛需求&#xff0c;英特尔首席执行官帕特…

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

力扣 2529.正整数和负整数的最大计数

文章目录 题目介绍解法 题目介绍 解法 采用红蓝染色体法&#xff0c;具体介绍参考 红蓝染色体法 通过红蓝染色体法可以找到第一个大于大于target的位置&#xff0c;使所以本题可以找第一个大于0的位置&#xff0c;即负整数的个数&#xff1b;数组长度 - 第一个大于1的位置即正…

2000-2012年各地级市市长特征信息数据/市长特征信息大全数据

2000-2012年各地级市市长特征信息数据 1、时间&#xff1a;2000-2012年 2、来源&#xff1a;百度搜索手工整理 3、指标&#xff1a;省级政区代码、省级政区名称、地市级政区代码、地市级政区名称、年份、市长姓名、出生年份、出生月份、籍贯省份代码、籍贯省份名称、籍贯地市…

垃圾邮件检测_TF-IDF分析,聚类分析与朴素贝叶斯

数据入口&#xff1a;基于机器学习的垃圾信息识别分类 - Heywhale.com 本数据集专为邮件和短信的垃圾信息分类设计&#xff0c;适合建立垃圾邮件检测模型。 数据说明 字段名说明message_content邮件或短信的正文内容is_spam标签&#xff0c;指示该消息是否为垃圾信息&#x…

恒生科指八连涨,汽车股强势

9月20日电 周五&#xff0c;港股三大股指集体收涨。恒生指数涨1.36%报18258.57点&#xff0c;连续第六个交易日上涨&#xff1b;恒生科技指数涨1.43%报3703.84点&#xff0c;连续第八个交易日上涨&#xff0c;创逾两个月来新高&#xff1b;恒生中国企业指数涨1.21%报6381.5点&a…

Set 和 Map 的模拟实现

1、引言 在数据结构与算法的学习与实践中&#xff0c;关联容器&#xff08;associative containers&#xff09;是不可忽视的重要工具。作为高效管理数据的一类容器&#xff0c;C 标准库中的 set 和 map 在现代软件开发中扮演着关键角色。这两个容器通过平衡二叉搜索树&#x…

c++类中的特殊函数

My_string.cpp #include <iostream> #include "my_string.h" #include <string.h> using namespace std; My_string::My_string():size(15) { this->ptr new char[size] ; this->ptr[0]\0;//串为空串 this->len 0; }; My_string::My_str…