当前位置: 首页 > 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;阿然成长日记 …...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...

Linux 中替换文件中的某个字符串

如果你想在 Linux 中替换文件中的某个字符串&#xff0c;可以使用以下命令&#xff1a; 1. 基本替换&#xff08;sed 命令&#xff09; sed -i s/原字符串/新字符串/g 文件名示例&#xff1a;将 file.txt 中所有的 old_text 替换成 new_text sed -i s/old_text/new_text/g fi…...

基于微信小程序的作业管理系统源码数据库文档

作业管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和微信小程序来完成对系统的…...

【AI大模型】Transformer架构到底是什么?

引言 —— 想象一台能瞬间读懂整本《战争与和平》、精准翻译俳句中的禅意、甚至为你的设计草图生成前端代码的机器——这一切并非科幻&#xff0c;而是过去七年AI领域最震撼的技术革命&#xff1a;Transformer架构创造的奇迹。 当谷歌在2017年揭开Transformer的神秘面纱时&…...