当前位置: 首页 > news >正文

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学习

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

Inpaint Anything: 自动化抹除视频元素

自动化抹除视频元素 不用逐帧抠图&#xff0c;直接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应用 &#x1f525; Android Studio 版本更新 &#x1f525; Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…...

后端byte[]传给前端接收默认变成string字符串

创建时间&#xff1a;2023.7.28 建议&#xff1a;最好直接用字符串&#xff0c;我是没办法要求保密&#xff0c;存取都是字符串&#xff0c;程序里面是byte数组 既然他到前端会转换成字符串那么就是被转码了 那我们反向转码就好了 这是在后端处理&#xff0c;反正前端也是乱…...

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 在安装时会默认创建三个网络&#xff1a;bridge&#xff08;默认网络模式&#xff09;、 none 、host。 host 直接和宿主机共用网络。bridge 网络隔离&#xff0c;通过虚拟网桥&#xff08;一般是 docker0&#xff09;与宿主机通信。none 禁用网络功能…...

Go 发送邮件

要在Go中发送电子邮件&#xff0c;您可以使用第三方库&#xff0c;如 gomail 。以下是一个使用 gomail 发送电子邮件的示例代码&#xff1a; package main import ("fmt""gopkg.in/gomail.v2" ) func main() {// 创建邮件消息m : gomail.NewMessage()m.Se…...

Spring AOP 的概念及其作用

一、什么是 Spring AOP&#xff1f; 在介绍 Spring AOP 之前&#xff0c;首先要了解一下什么是 AOP &#xff1f; AOP &#xff08; Aspect Oriented Programming &#xff09;&#xff1a;面向切面编程&#xff0c;它是一种思想&#xff0c; 它是对某一类事情的集中处 理 。…...

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、下载软件安装包&#xff0c;官网 2、开始安装。 2.查看是否安装成功。 3.安装…...

uniapp 中 的progress加载进度条 的使用,在 页面显示数据加载的进度条,使用户的使用体验效果更好

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

【尚硅谷】第01章:随堂复习与企业真题(Java语言概述)

来源&#xff1a;尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备) 基本都是宋老师发的资料里面的内容&#xff0c;只不过补充几个资料里没直接给出答案的问题的答案。 不想安装markdown笔记的app所以干脆在这里发一遍。 第01章&#xff1a;随堂复习…...

MyBatis的SqlSession理解

SqlSession是Mybatis最重要的构建之一&#xff0c;可以认为Mybatis一系列的配置目的是生成类似JDBC生成的Connection对象的statement对象&#xff0c;这样才能与数据库开启“沟通”&#xff0c;通过SqlSession可以实现增删改查&#xff08;当然现在更加推荐是使用Mapper接口形式…...

axios 某个接口使用自己独有的完整地址

可以在axios请求中使用完整的URL&#xff0c;而不使用baseURL&#xff0c; 只需将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 题目 打开题目&#xff0c;发现页面提示&#xff0c;翻译为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&#xff0c;可用于辅助逆向分析。 使用教程&#xff1a; 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

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Sink的HDFS Sink&#xff1b; ⚪ 掌握Sink的Logger Sink&#xff1b; ⚪ 掌握Sink的File Roll Sink&#xff1b; ⚪ 掌握Sink的Null Sink&#xff1b; ⚪ 掌握Si…...

【数据结构】27.移除元素

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...