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

Vue Router

Vue Router4 匹配 Vue3;Vue Router3 匹配 Vue2。

Vue Router 是 Vue.js 官方的路由管理器。Vue Router 基于路由和组件的映射关系,监听页面路径的变化,渲染对应的组件。

安装:

npm install vue-router

基本使用:

Vue Router4 的基本使用:

// src/router/index.js
import {createRouter, createWebHashHistory} from 'vue-router'import Home from '../components/Home.vue'
import About from '../components/About.vue'// 1. 创建路由对象
const router = createRouter({// 配置路由映射关系,一个路径对应一个组件routes: [{path: '/', redirect: '/home'}, // 如果路径是 /,重定向到 /home {path: '/home', component: Home},{path: '/about', component: About}],// 配置采用的模式history: createWebHashHistory(),
})export default router
// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'const app = createApp(App)
// 2. 注册路由对象
app.use(router)
app.mount('#app')
// 可以使用  Vue Router 提供的 <router-link> 组件实现路径跳转
// src/App.vue。
<template><!-- 3. 使用 Vue Router 提供的 <router-link> 组件实现路径跳转 --><router-link to="/home">首页</router-link><router-link to="/about">关于</router-link><!-- 4. 路径匹配到的组件将会显示在 <router-view> 这个占位组件处 --><router-view></router-view>
</template><script setup>
</script><style scoped>
</style>   // 也可以通过代码逻辑实现路径跳转。
// src/App.vue
<template><div><span @click="handleHomeNav">首页</span><span @click="handleAboutNav">关于</span></div><!-- 4. 路径匹配到的组件将会显示在 <router-view> 这个占位组件处 --><router-view></router-view>
</template><script setup>
// 3. 通过代码逻辑实现路径跳转
import { useRouter } from 'vue-router'
const router = useRouter()
const handleHomeNav = () => {router.push('/home')
}
const handleAboutNav = () => {router.push({path: '/about'}) 
}
</script><style scoped>
</style>   

Vue Router3 的基本使用:

import Home form '../componnets/Home .vue'
import About form '../componnets/About .vue'// 1. 创建 router 实例
const router = new VueRouter({// 传入 routes 配置定义路由routes: [{ path: 'home', component: Home },{ path: '/about', component: About }]
})
// 2. 通过 router 配置参数注入路由
const app = new Vue({router
}).$mount('#app')
<div id="app"><p><!--  3. 使用 router-link 组件来导航,通过传入 to 属性指定链接 --><router-link to="/home">Home</router-link><router-link to="/about">About </router-link></p><!--  4. router-view 是路由出口,路由匹配到的组件将渲染在这里 --><router-view></router-view>
</div>

路由对象 router:

路由对象 router 的属性:

  1. history:配置路由采用的模式。属性值有两个,createWebHashHistory 是 hash 模式,createWebHistory 是 history 模式。
  2. routes:配置路由映射关系。

路由对象 router 的方法:

  1. addRoute(parentName, route) :动态添加路由。其中的 parentName 就是配置路由映射关系 route 中独一无二的 name 属性,parentName 是可选的,可以通过 parentName 指定父级路由的名称来添加嵌套的子路由。
  2. removeRoute(name):删除路由。其中的 name 就是配置路由映射关系 route 中独一无二的 name 属性。
  3. hasRoute():检查某个路由是否存在。
  4. getRoutes():获取所有路由记录。返回值是一个数组。
  5. push():跳转到指定路径。
  6. replace():替换掉当前路径。
  7. forward():路径前进一步。
  8. back():路径后退一步。
  9. go():路径前进或者后退指定步数。

路由 route:

路由 route 的配置属性:

  1. path:路径。
  2. component:路径匹配时要渲染的组件。
  3. redirect:路径匹配时要重定向的路径。
  4. name:独一无二的路由名称。
  5. children:嵌套路由。

<router-link> 组件:

<router-link>:用于创建导航链接。<router-link> 的属性有:

  1. to:用于指定要跳转的路径。属性值是一个字符串或者对象。
    <router-link to="/home">首页</router-link>
    <router-link to="{path: '/home'}">首页</router-link>
    
  2. replace:设置 replace 属性的化,路径跳转时将会直接替换掉旧路径,旧路径不会进入历史列表,回退页面的话无法回退到旧页面。
  3. active-class:设置激活 a 元素后应用的 class 属性名称。默认是 router-link-active
  4. exact-active-class:链接精准激活时,应用于 a 元素的 class 属性名称。默认是 router-link-exact-active

<router-view> 组件:

<router-view>:占位组件。路径匹配时对应组件的渲染容器。

嵌套路由:

通过 children 配置嵌套路由。

// src/router/index.js
import {createRouter, createWebHashHistory} from 'vue-router'import User from '../components/User.vue'
import UserProfile from '../components/UserProfile.vue'
import UserPosts from '@/components/UserPosts.vue'const router = createRouter({routes: [{path: '/user/:id', // 以 / 开头的嵌套路径将被视为根路径component: User,// 1. 通过 children 配置嵌套路由children: [{// 当路径匹配到 /user/:id/profile,就会渲染 UserProfile 组件到 User 组件的 <router-view> 内部path: 'profile', // // 在生成路由时,主路由上的 path 会被自动添加到子路由之前,所以子路由上的 path 不用重新声明主路由上的 path 了component: UserProfile,},{// 当路径匹配到 /user/:id/posts,就会渲染 UserPosts 组件到 User 组件的 <router-view> 内部path: 'posts',component: UserPosts,},]},],history: createWebHashHistory(),
})export default router
// src/App.vue
<template><!-- 2. 顶层的 <router-view> 渲染顶层路由匹配的组件。User 组件将会被渲染到这个位置 --><router-view></router-view>
</template><script setup>
</script><style scoped>
</style>   
// src/components/User.vue
<template><div>User:{{ $route.params.id }}</div><!-- 3. 一个被渲染的组件也可以包含自己嵌套的 <router-view>。UserProfile 和 UserPosts 组件将会被渲染到这个位置 --><router-view></router-view>
</template><script setup>
</script><style scoped>
</style>   

动态路由:

路径是动态的,路径参数的部分在进行路由匹配时可以变化,使用冒号标记;当匹配到一个路由时,参数值会被设置到 $route.params中。

// src/router/index.js
import {createRouter, createWebHashHistory} from 'vue-router'import User from '@/components/User.vue'const router = createRouter({routes: [// 1. 通过 :名称 配置动态路由。路径是动态的,路径参数的部分在进行路由匹配时是可以变化的{path: '/user/:id', component: User}],history: createWebHashHistory(),
})export default router
// src/App.vue
<template><!-- 2. 无论是 user/123 还是 user/456,都可以匹配得上 --><router-link to="/user/123">用户123</router-link><router-link to="/user/456">用户456</router-link><router-view></router-view>
</template><script setup>
</script><style scoped>
</style>   
//src/components/User.vue
<template><!-- 3. 在 template 模板中获取动态路由的值 --><div>User:{{ $route.params.id }}</div>
</template><script setup>
// 3. 在 Options API 中获取动态路由的值
// this.$route.params.id// 3. 在 Composition API 中获取动态路由的值。通过 useRoute() Hook 函数获取
import { useRoute } from 'vue-router'
const route = useRoute()
console.log(route.params.id)
</script><style scoped>
</style>   

可以在一个路由中设置多段路径参数,对应的值都会设置到 $route.params 中。

/user/:username/post/:post_id	

通过动态路由实现 NotFound:

对于没有匹配到的路由,通常会匹配到某个固定的页面,例如 NotFound 页面。可以编写一个动态路由用于匹配所有的页面。

// // src/router/index.js
import {createRouter, createWebHashHistory} from 'vue-router'import NotFound from '@/components/NotFound .vue'const router = createRouter({routes: [// 1. 如果匹配到任何一个不存在的路径,那么就匹配 NotFound 组件。{path:'/:pathMatch(.*)', component: NotFound }],history: createWebHashHistory(),
})export default router
//src/components/NotFound .vue
<template><!-- 2. 获取当前的路径参数 --><div>NotFound:{{ $route.params.pathMatch }}</div>
</template><script setup>
</script><style scoped>
</style>  

在这里插入图片描述
如果配置路由时,在 /:pathMatch(.*) 后面再加一个 *,变成 {path:'/:pathMatch(.*)*', component: NotFound },那么在获取路径参数时,会以 / 为分隔符将路径参数解析为数组。
在这里插入图片描述

路由传参:

  1. 可以通过动态路由的方式传递简单参数;在组件中通过 $route.params 的方法获取。
  2. 也可以在通过代码逻辑实现路径跳转时,通过 query 传递参数;在组件中通过 $route.query 获取。
    const handleAboutNav = () => {router.push({path: '/about',// 1. 传递参数query: {name: 'Lee',age: 18,}})
    }// 获取参数
    import { useRoute } from 'vue-router'
    const route = useRoute()
    console.log(route.query.name)
    
    在这里插入图片描述

路由懒加载:

// src/router/index.js
import {createRouter, createWebHashHistory} from 'vue-router'// 通过使用 import() 函数进行路由懒加载。打包时会进行分包处理,就可以在需要的时候再根据路径下载对应的组件代码
const Home = () => import('../components/Home.vue')
const About = () => import('../components/About.vue')const router = createRouter({routes: [{path: '/', redirect: '/home'}, {path: '/home', component: Home},{path: '/about', component: About}],history: createWebHashHistory(),
})export default router

路由导航守卫:

Vue Router 提供的路由导航守卫主要是通过跳转或者取消的方式守卫路由导航。

从一个路由跳转到另一个路由,就叫路由导航。对中间跳转的过程进行拦截处理,就叫导航守卫。

全局的导航守卫:

  1. beforeEach():全局前置守卫。跳转到每个路由之前,beforeEach() 都会被触发。beforeEach() 接收一个回调函数作为参数。
    回调函数接收两个参数,to 表示即将进入的路由对象,from 表示即将离开的路由对象。
    回调函数的返回值如果是 false,取消当前导航;如果不返回或者返回 undefined,进行默认导航;如果返回一个字符串类型或者对象类型的路径地址,将会跳转到这个指定的路径。

    回调函数可选的第三个参数是 next。在 Vue2 中通过 next() 来决定如何进行跳转;但在 Vue3 中是通过返回值来控制的。因此不再推荐使用 next() 函数。

    router.beforeEach((to, from) => {if(to.path !== '/login') {return '/login'}
    })
    
  2. afterEach():全局后置守卫。不会改变导航本身。

组件内的导航守卫:

在 Composition API 中,可以通过 onBeforeRouteUpdate 和 onBeforeRouteLeave 分别添加 update 和 leave 守卫。

  1. beforeRouteEnter():在进入组件对应的路由时触发。此时组件实例还没被创建,因为不能获取 this,可以通过回调函数的第三个参数 next 来访问组件实例。
    beforeRouteEnter (to, from, next) {next(instance=> {// 通过 instance 访问组件实例})
    }
    
  2. beforeRouteUpdate():在路由改变,但是组件被复用时调用。此时组件已经挂载好,导航守卫可以获取 this。例如对于一个带有动态参数的路径 /users/:id,在 /users/1/users/2 之间跳转的时候,由于会渲染同样的 UserDetails 组件,因此组件实例会被复用,这个钩子就会在这个情况下被调用。
  3. beforeRouteLeave():在离开组件对应的路由时触发。此时导航守卫可以获取 this。

导航守卫的解析流程:

  1. 导航被触发。
  2. 在失活的组件里调用 beforeRouteLeave 守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫。
  5. 在路由配置里调用 beforeEnter。
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter。
  8. 调用全局的 beforeResolve 守卫。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

相关文章:

Vue Router

Vue Router4 匹配 Vue3&#xff1b;Vue Router3 匹配 Vue2。 Vue Router 是 Vue.js 官方的路由管理器。Vue Router 基于路由和组件的映射关系&#xff0c;监听页面路径的变化&#xff0c;渲染对应的组件。 安装&#xff1a; npm install vue-router。 基本使用&#xff1a; …...

【黑灰产】人工查档业务产业链

2024年“查档”类型泄露事件快速上涨&#xff0c;涉及电商、外卖、社交、快递等行业数据。 近年来&#xff0c;陆续关注到非法数据交易产业链中游频繁出现的“查档”数据泄露情况&#xff0c;例如通过一个手机号&#xff0c;就可以查询这个手机号相关的所有身份信息&#xff0…...

114周二复盘 (178)

1、打新包&#xff0c;测试 2、白天为打包开始冲刺&#xff0c;问题不少&#xff0c;一堆细节问题&#xff0c; 但还是傍晚打包&#xff0c;不到3分钟&#xff0c;1.77G。 速度超预期。 3、开始测试。 基本还是达到预期的&#xff0c;但还是很多问题。 好在打包速度很快&am…...

day10_Structured Steaming

文章目录 Structured Steaming一、结构化流介绍&#xff08;了解&#xff09;1、有界和无界数据2、基本介绍3、使用三大步骤(掌握)4.回顾sparkSQL的词频统计案例 二、结构化流的编程模型&#xff08;掌握&#xff09;1、数据结构2、读取数据源2.1 File Source2.2 Socket Source…...

Python的秘密基地--[章节11] Python 性能优化与多线程编程

第11章&#xff1a;Python 性能优化与多线程编程 在开发复杂系统时&#xff0c;性能优化和并发编程是不可忽视的重点。Python 提供了多种工具和技术用于优化代码性能&#xff0c;并通过多线程、多进程等方式实现并发处理。本章将探讨如何在 Python 中提升性能&#xff0c;并实…...

drawDB docker部属

docker pull xinsodev/drawdb docker run --name some-drawdb -p 3000:80 -d xinsodev/drawdb浏览器访问&#xff1a;http://192.168.31.135:3000/...

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里&#xff0c;视觉内容无处不在&#xff0c;而创建和编辑这些内容的能力已经成为许多行业的核心技能…...

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7&#xff1a;Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…...

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…...

统计有序矩阵中的负数

统计有序矩阵中的负数 描述 给你一个 m * n 的矩阵 grid&#xff0c;矩阵中的元素无论是按行还是按列&#xff0c;都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目 示例 1&#xff1a; 输入&#xff1a;grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]…...

【6】Word:海名公司文秘❗

目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换&#xff1a;粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列&#xff0c;单机右键…...

c语言 --- 字符串

创建字符串 1. 使用字符数组创建字符串 #include <stdio.h>int main() {char str[20] "Hello, world!";str[0] h; // 修改字符串的第一个字符printf("%s\n", str); // 输出&#xff1a;hello, world!return 0; }解释&#xff1a; 数组大小 20 表…...

LeetCode 热题 100_二叉树的最近公共祖先(49_236_中等_C++)(二叉树;深度优先搜索)

LeetCode 热题 100_二叉树的最近公共祖先&#xff08;49_236&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;深度优先搜索&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;深度优…...

(三)c#中const、static、readonly的区别

在 C# 中&#xff0c;const、static 和 readonly 都是用来定义不可变的值&#xff0c;但它们有一些关键的区别。让我们详细比较一下这三者的用途和特点&#xff1a; 1. const&#xff08;常量&#xff09; 编译时常量&#xff1a;const 用于声明常量&#xff0c;其值必须在编…...

人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用。近日&#xff0c;演员王星因接到一份看似来自知名公司的拍戏邀约&#xff0c;被骗至泰国并最终被带到缅甸。这一事件迅速引发了社会的广泛关注。该…...

【C++】函数(下)

1、函数的常见样式 常见的函数样式有四种&#xff1a; &#xff08;1&#xff09;无参数无返回值 &#xff08;2&#xff09;有参数无返回值 &#xff08;3&#xff09;无参数有返回值 &#xff08;4&#xff09;有参数有返回值 &#xff08;1&#xff09;无参数无返回值 示例…...

一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取

大家好&#xff0c;今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana&#xff0c;旨在提供高效、灵活且功能丰富的网络爬取体验&#xff0c;适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…...

深入探讨 Vue.js 的动态组件渲染与性能优化

Vue.js 作为一款前端领域中备受欢迎的渐进式框架&#xff0c;以其简单优雅的 API 和灵活性受到开发者的喜爱。在开发复杂应用时&#xff0c;动态组件渲染是一项极其重要的技术&#xff0c;它能够在页面中动态地加载或切换组件&#xff0c;从而显著提升应用的灵活性与用户体验。…...

vulnhub靶场【IA系列】之Tornado

前言 靶机&#xff1a;IA-Tornado&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 本文所用靶场、kali镜像以及相关工具&#xff0c;我放置在网盘中&#xff0c;可以复制后面链接查看 htt…...

简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript

目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址&#xff1a; https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C&…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【第二十一章 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 数据流…...

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

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

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...