Vue的router学习
,前端路由的核心是什么呢?改变URL,但是页面不进行整体的刷新。
vue-router是基于路由和组件的
路由用于设定访问路径, 将路径和组件映射起来;
在vue-router的单页面应用中, 页面的路径的改变就是组件的切换;
使用router需要
1.在router文件夹内书写整个index.js文件
2.在View文件夹内书写具体的router文件内容
3.在App.vue文件夹想要替换内容的地方,写上路由占位符
4.main.js文件内import router from "./router",并且在mount app前app.use(router)
路由的使用步骤
◼ 使用vue-router的步骤:
第一步:创建路由需要映射的组件(打算显示的页面);
第二步:通过createRouter创建路由对象,并且传入routes和history模式;
✓ 配置路由映射: 组件和路径映射关系的routes数组;
✓ 创建基于hash或者history的模式;
第三步:使用app注册路由对象(use方法);
第四步:路由使用: 通过<router-link>和<router-view>;
0.报错:无法正常渲染router
报错1:
必须把use router写在mount前
报错2:
要么是router-link没写to的路径,要么是 history:createWebHistory,这里没写()
1.简单使用
router文件夹index.js
import { createRouter,createWebHashHistory } from "vue-router";import Home from "../Views/Home.vue"
import About from "../Views/About.vue"const router = createRouter({//指定采用的模式:hashhistory:createWebHashHistory(),//映射关系routes:[{path:"/home",component:Home},{path:"/about",component:About},]
})export default router
Views文件夹下About与Home.vue文件
<template><h2>about</h2>
</template>
<template><h2>home</h2>
</template>
App.vue
<template>
<div class="app"><router-view></router-view><h2>App content</h2>
</div>
</template><script setup></script><style lang="less" scoped></style>
main.js
import { createApp } from 'vue'
// import "./assets/reset.css"
import router from "./router"import App from './App.vue'const app = createApp(App)// 全局注册app.use(router)app.mount('#app')
2.如果希望点击某个区域进行跳转:router-link
<template>
<div class="app"><h2>App content</h2><div class="nav"><router-link to="/home">首页</router-link><router-link to="/about">关于</router-link></div><router-view></router-view>
</div>
</template><script setup></script><style lang="less" scoped></style>
3.路由的默认路径
默认情况下, 进入网站的首页, 我们希望<router-view>渲染首页的内容;
但是我们的实现中, 默认没有显示首页组件, 必须让用户点击才可以;
◼ 如何可以让路径默认跳到到首页, 并且<router-view>渲染首页组件呢?
◼ 我们在routes中又配置了一个映射:
path配置的是根路径: /
redirect是重定向, 也就是我们将根路径重定向到/home的路径下, 这样就可以得到我们想要的结果了.
const router = createRouter({//指定采用的模式:hashhistory:createWebHashHistory(),//映射关系routes:[{path:"/",redirect:"/home"},{path:"/home",component:Home},{path:"/about",component:About},]
})
4.history模式
使用WebHashHistory哈希模式,域名跳转时会有#,如果切成history则是日常的域名模式
import { createRouter,createWebHashHistory,createWebHistory } from "vue-router";import Home from "../Views/Home.vue"
import About from "../Views/About.vue"const router = createRouter({//指定采用的模式:hash// history:createWebHashHistory(),history:createWebHistory(),//映射关系routes:[{path:"/",redirect:"/home"},{path:"/home",component:Home},{path:"/about",component:About},]
})export default router
5.router-link的属性:to/replace/active/name
◼ router-link事实上有很多属性可以配置:
◼ to属性:
是一个字符串,或者是一个对象
对象写法,记得:to,几乎不在to内使用对象写法
<router-link :to="{path:'/about'}">关于</router-link>
◼ replace属性:
设置 replace 属性的话,当点击时,会调用 router.replace(),而不是 router.push();
<div class="nav"><router-link to="/home" replace>首页</router-link><router-link to="/about" replace>关于</router-link></div>
如果使用了replace属性,比如从百度进入8080页面,默认进入首页,此时点击进入关于界面,再点击返回,此时返回的不再是首页,而是百度页面
因为相当于百度→首页,关于页面替换了首页,此时百度→关于,所以点击返回按钮,返回百度界面
◼ active-class属性:
设置激活a元素后自动应用的class,默认是router-link-active
◼ exact-active-class属性:
链接精准激活时,应用于渲染的 <a> 的 class,默认是router-link-exact-active;
通过自动绑定的active类,可以对其进行样式操作
.router-link-active
{color: red;
}
◼ name属性:路由记录独一无二的名称;
◼ meta属性:自定义的数据
6.路由懒加载
◼ 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载:
如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就会更加高效;
也可以提高首屏的渲染效率;
◼ 其实这里还是我们前面讲到过的webpack的分包知识,而Vue Router默认就支持动态来导入组件:
这是因为component可以传入一个组件,也可以接收一个函数,该函数 需要放回一个Promise;
而import函数就是返回一个Promise;
默认 npm run build不分包(此写法几乎被摒弃
import Home from "../Views/Home.vue"
import About from "../Views/About.vue"
如果想要分包:
const Home=()=>import ("../Views/About.vue")
const About=()=>import ("../Views/Home.vue")
如果希望知道到底每个包对应的内容
使用webpack的魔法注释,webpack从3.x开始支持对分包进行命名(chunk name)
const Home=()=>import (/* webpackChunkName: 'home' */"../Views/About.vue")
const About=()=>import (/* webpackChunkName: 'about' */"../Views/Home.vue")
但是现在最广泛的写法是:
import { createRouter,createWebHashHistory,createWebHistory } from "vue-router";// import Home from "../Views/Home.vue"
// import About from "../Views/About.vue"
// const Home=()=>import (/* webpackChunkName: 'home' */"../Views/About.vue")
// const About=()=>import (/* webpackChunkName: 'about' */"../Views/Home.vue")const router = createRouter({//指定采用的模式:hash// history:createWebHashHistory(),history:createWebHistory(),//映射关系routes:[{path:"/",redirect:"/home"},{path:"/home",component:()=>import ("../Views/Home.vue")},{path:"/about",component:()=>import ("../Views/About.vue")},]
})export default router
7.动态路由基本匹配
◼ 很多时候我们需要将给定匹配模式的路由映射到同一个组件:
例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但是用户的ID是不同的;
在Vue Router中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数;
如果进入user页面,一般user界面会跟着id,但是我们默认的时user,此时无法匹配,无法进入user页面
{path:"/user/:id",
const router = createRouter({history:createWebHistory(),//映射关系routes:[{path:"/",redirect:"/home"},{path:"/home",component:()=>import ("../Views/Home.vue")},{path:"/about",component:()=>import ("../Views/About.vue")},{path:"/user/:id",component:()=>import ("../Views/User.vue")},]
})export default router
<template>
<div class="app"><h2>App content</h2><div class="nav"><router-link to="/home">首页</router-link><router-link to="/about">关于</router-link><router-link to="/user">用户</router-link><router-link to="/user/321">用户321</router-link><router-link to="/user/123">用户123</router-link></div><router-view></router-view>
</div>
</template>
8.获取动态路由的值
◼ 那么在User中如何获取到对应的值呢?
在template中,直接通过 $route.params获取值;
✓ 在created中,通过 this.$route.params获取值;
✓ 在setup中,我们要使用 vue-router库给我们提供的一个hook useRoute;
➢ 该Hook会返回一个Route对象,对象中保存着当前路由相关的值;
法一:在template中,直接通过 $route.params获取值;
<template><h2 class="user">User:{{$route.params}}</h2>
</template>
{path:"/user/:id",component:()=>import ("../Views/User.vue")},
<template><h2 class="user">User:{{$route.params.id}}</h2>
</template>
法二:在setup中,我们要使用 vue-router库给我们提供的一个hook useRoute;
<template><h2 class="user">User:{{$route.params.id}}</h2>
</template><script setup>import {useRoute} from 'vue-router'const route =useRoute()console.log(route.params.id)
</script>
但是这种写法在
<router-link to="/user/321">用户321</router-link><router-link to="/user/123">用户123</router-link>
切换时不会控制台输出
如果想要改变:(很少用到)
<template><h2 class="user">User:{{$route.params.id}}</h2>
</template><script setup>import { useRoute, onBeforeRouteUpdate } from 'vue-router'const route = useRoute()console.log(route.params.id)// 获取route跳转idonBeforeRouteUpdate((to, from) => {console.log("from:", from.params.id)console.log("to:", to.params.id)})</script>
法三:

9.notfound
对于哪些没有匹配到的路由,我们通常会匹配到固定的某个页面
比如NotFound的错误页面中,这个时候我们可编写一个动态路由用于匹配所有的页面;
这里path:"/:patMatch(.*)"意味着匹配到所有路径
但是home/user/about这种还是会正常跳转的
{path:"/:patMatch(.*)",component:()=>import ("../Views/NotFound.vue")}
<template><div class="not-found"><h2>NotFound:您当前的路径不正确</h2></div>
</template><script setup></script><style scoped>
</style>
获得具体不正确的路径
<template><div class="not-found"><h2>NotFound:您当前的路径不正确{{$route.params.patMatch}}</h2></div>
</template>
10.编程式路由跳转
使用费router-link跳转需要用到编程式
使用push的特点是压入一个新的页面,那么在用户点击返回时,上一个页面还可以回退,但是如果我们希望当前页面是一个替换操作,那么可以使用replace:
<template>
<div class="app"><h2>App content</h2><div class="nav"><span @click="homeSpanClick">首页</span><button @click="aboutBtnClick">关于</button></div><router-view></router-view>
</div>
</template><script setup>import {useRouter} from 'vue-router'const router=useRouter()function homeSpanClick(){router.push("/home")}function aboutBtnClick(){router.push("/about")}
</script>
import {useRouter} from 'vue-router'const router=useRouter()function homeSpanClick(){router.push("/home")}
获取当前正在使用的router
function homeSpanClick(){router.push({path:"/home"})}
这样写可以写更多参数
11.页面的前进后退
<template><h2 class="about">about</h2><button @click="backBtnClick">返回</button>
</template><script setup>import {useRouter} from 'vue-router'const router=useRouter()function backBtnClick(){router.back()}
</script>
12.动态添加路由
◼ 某些情况下我们可能需要动态的来添加路由:
比如根据用户不同的权限,注册不同的路由;
这个时候我们可以使用一个方法 addRoute;
let isAdmin=true
if(isAdmin)
{router.addRoute( {path:"/admin",component:()=>import ("../Views/Admin.vue")},)
}export default router
//动态管理路由
let isAdmin=true
if(isAdmin)
{router.addRoute( {path:"/admin",component:()=>import ("../Views/Admin.vue")},)//添加vip页面router.addRoute({path: "/home/vip",component: () => import("../Views/HomeVip.vue")});
}
动态添加二级路由
13.删除路由
name必须是唯一的
14.路由导航守卫
比如在首页点击order按钮,需要进行拦截,如果已经登录则放行,否则跳转到登录页面
相关文章:

Vue的router学习
,前端路由的核心是什么呢?改变URL,但是页面不进行整体的刷新。 vue-router是基于路由和组件的 路由用于设定访问路径, 将路径和组件映射起来; 在vue-router的单页面应用中, 页面的路径的改变就是组件的切换; 使用router需要…...

Inpaint Anything: 自动化抹除视频元素
自动化抹除视频元素 不用逐帧抠图,直接SAM Tracking Video Inpainting就能实现自动化抹除奔跑吧idol。 https://github.com/geekyutao/Inpaint-Anything 目录 网站演示参考文献 网站 https://huggingface.co/spaces/InpaintAI/Inpaint-Anything 演示 原理就是&a…...

Flutter 开发者工具 Android Studio 开发Flutter应用
Flutter 开发者工具 在 Android Studio 开发Flutter应用 🔥 Android Studio 版本更新 🔥 Android Studio Check for Update Connection failed 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…...
后端byte[]传给前端接收默认变成string字符串
创建时间:2023.7.28 建议:最好直接用字符串,我是没办法要求保密,存取都是字符串,程序里面是byte数组 既然他到前端会转换成字符串那么就是被转码了 那我们反向转码就好了 这是在后端处理,反正前端也是乱…...

UE5 动画蓝图模板(Animation Blueprint Template)
文章目录 前言准备内容创建动画蓝图使用动画蓝图模板示例1示例2总结前言 本文基于虚幻5.2版本介绍制作动画蓝图模板,本教程要求使用虚幻5.0及以上版本。 准备内容 使用第三人称游戏内容包,已添加可忽略。 选择第三人称游戏,添加到项目。 创建动画蓝图 在 Characters 文件…...

Log4j源码解析
Log4j源码解析 主要流程 Logger logger Logger.getLogger(Main.class); 1、通过Logger.getLogger(Class clazz) 或 Logger.getLogger(String name)进入。 2、加载LogManager进jvm, 执行静态代码块执行初始化, 创建出RepositorySelector实例及LoggerRepository实例(Hierarchy…...
Docker 容器访问宿主机服务
docker 网络简介 docker 在安装时会默认创建三个网络:bridge(默认网络模式)、 none 、host。 host 直接和宿主机共用网络。bridge 网络隔离,通过虚拟网桥(一般是 docker0)与宿主机通信。none 禁用网络功能…...
Go 发送邮件
要在Go中发送电子邮件,您可以使用第三方库,如 gomail 。以下是一个使用 gomail 发送电子邮件的示例代码: package main import ("fmt""gopkg.in/gomail.v2" ) func main() {// 创建邮件消息m : gomail.NewMessage()m.Se…...

Spring AOP 的概念及其作用
一、什么是 Spring AOP? 在介绍 Spring AOP 之前,首先要了解一下什么是 AOP ? AOP ( Aspect Oriented Programming ):面向切面编程,它是一种思想, 它是对某一类事情的集中处 理 。…...

python基础1——环境安装
文章目录 一、Windows安装二、Linux安装三、pycharm安装3.1 软件安装3.2 个性化设置3.3 基本使用3.3.1 定义变量3.3.2 查看数据类型3.3.3 运算符3.3.4 操作符3.3.5 转义符 一、Windows安装 1、下载软件安装包,官网 2、开始安装。 2.查看是否安装成功。 3.安装…...

uniapp 中 的progress加载进度条 的使用,在 页面显示数据加载的进度条,使用户的使用体验效果更好
学习目标: 学习目标如下: 例如: uniapp 中 的progress加载进度条 的使用,在 页面显示数据加载的进度条,使用户的使用体验效果更好 学习内容: 学习内容如下所示: 相关属性的说明 进度条的显…...

【尚硅谷】第01章:随堂复习与企业真题(Java语言概述)
来源:尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备) 基本都是宋老师发的资料里面的内容,只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第01章:随堂复习…...
MyBatis的SqlSession理解
SqlSession是Mybatis最重要的构建之一,可以认为Mybatis一系列的配置目的是生成类似JDBC生成的Connection对象的statement对象,这样才能与数据库开启“沟通”,通过SqlSession可以实现增删改查(当然现在更加推荐是使用Mapper接口形式…...
axios 某个接口使用自己独有的完整地址
可以在axios请求中使用完整的URL,而不使用baseURL, 只需将url字段设置为完整的URL即可 import axios from axios;export function getInfo() {return axios({url: http://192.168.3.15:8086/test/messages,method: post}); }直接在url字段中提供了完整的…...

WEB:Web_python_template_injection
背景知识 python模板注入 ssit 题目 打开题目,发现页面提示,翻译为python模板注入 先测试是否存在注入 可以发现被执行了 先查看所有的子类 payload {{[].__class__.__base__.__subclasses__()}} 利用site.Printer的os模块执行命令 payload {{.__…...

【Android安全】Embedded Trace Microcell模块
ETM: Embedded Trace Macrocell, hardware unit responsible to generate hardware instruction trace. ETM模块用于在硬件层面实现instruction trace,可用于辅助逆向分析。 使用教程: https://mcuoneclipse.com/2016/11/05/tutorial-getting-etm-inst…...
修改内核驱动之后-如何给内核打补丁
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言思路步骤1.进入下面路径2.修改文件calibrate.c3.使用git工具生产补丁文件4.移动补丁文件到自己的Linux的recipem目录下总结前言 本文来学习如何使用YOCTO修改Linux内核驱动之后,如何通过打补…...

【javaSE】 类和对象详解
目录 面向对象的初步认知 什么是面向对象 面向对象与面向过程 类定义和使用 简单认识类 类的定义格式 注意事项 练习定义类 定义一个狗类 定义一个学生类 注意事项 类的实例化 什么是实例化 注意事项 类和对象的说明 this引用 为什么要有this引用 什么是this引…...

大数据课程D5——hadoop的Sink
文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Sink的HDFS Sink; ⚪ 掌握Sink的Logger Sink; ⚪ 掌握Sink的File Roll Sink; ⚪ 掌握Sink的Null Sink; ⚪ 掌握Si…...

【数据结构】27.移除元素
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...