vue-router相关理解

一、前言

随着 Vue.js 在前端开发中的广泛应用,Vue Router 成为了 Vue 官方推荐的路由管理器。它不仅支持单页面应用(SPA)中常见的路由跳转、嵌套路由、懒加载等功能,还提供了导航守卫、动态路由等高级特性。

本文将带你深入了解:

  • Vue Router 的基本概念;
  • 路由配置与使用方式;
  • 嵌套路由与命名视图;
  • 动态路由与懒加载;
  • 导航守卫机制;
  • 实际开发中的典型使用场景;

通过这篇文章,你将掌握 Vue Router 的核心功能与原理,能够熟练地在项目中进行路由管理。

二、什么是 Vue Router?

Vue Router 是 Vue.js 官方的路由管理库,用于构建单页应用(SPA),实现不同组件之间的切换和导航。

✅ 核心功能:

功能描述
路由映射将路径映射到组件
组件切换不刷新页面切换组件
参数传递支持动态路由参数(如 /user/:id
嵌套路由实现父子级组件结构
懒加载异步加载组件,提升性能
导航守卫控制路由跳转逻辑(权限验证、登录拦截等)

三、Vue Router 的安装与配置

✅ 安装(Vue 3)

npm install vue-router@4

✅ 创建路由实例(router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'const routes = [{path: '/',name: 'Home',component: Home},{path: '/about',name: 'About',component: About}
]const router = createRouter({history: createWebHistory(),routes
})export default router

✅ 在 main.js 中挂载路由

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'createApp(App).use(router).mount('#app')

四、基础使用:路由跳转与组件渲染

✅ <router-link>:声明式导航

<router-link to="/">首页</router-link>
<router-link to="/about">关于</router-link>

✅ <router-view>:动态渲染组件的位置

<router-view />

📌 效果:

  • 点击链接时,不会刷新页面;
  • 页面内容根据当前路径自动切换为对应组件;

五、动态路由与参数传递

✅ 动态路由示例

{path: '/user/:id',name: 'User',component: () => import('../views/User.vue')
}

✅ 在组件中获取参数

export default {mounted() {console.log(this.$route.params.id)}
}

📌 示例 URL:

  • /user/123 → this.$route.params.id === '123'

六、嵌套路由(父子路由)

适用于多级菜单、布局嵌套等场景。

✅ 路由配置

{path: '/dashboard',name: 'Dashboard',component: DashboardLayout,children: [{path: 'profile',component: Profile},{path: 'settings',component: Settings}]
}

✅ 页面结构

<!-- DashboardLayout.vue -->
<template><div><h2>仪表盘布局</h2><router-view /> <!-- 子路由组件在这里显示 --></div>
</template>

📌 访问路径:

  • /dashboard/profile
  • /dashboard/settings

七、命名视图(多个 <router-view>

适用于需要在同一页面展示多个组件区域,例如侧边栏 + 主体内容。

✅ 路由配置

{path: '/layout',components: {default: MainContent,sidebar: SideBar}
}

✅ 模板中使用多个 <router-view>

<router-view />
<router-view name="sidebar" />

八、懒加载组件(按需加载)

懒加载是优化首屏加载速度的重要手段,Vue Router 支持异步加载组件。

✅ 使用 import() 实现懒加载

{path: '/contact',name: 'Contact',component: () => import('../views/Contact.vue')
}

📌 特点:

  • 只有访问该路由时才会加载对应的组件;
  • 减少初始加载时间,提升用户体验;

九、导航守卫(Navigation Guards)

导航守卫用于控制路由的跳转逻辑,常用于权限验证、登录拦截、页面缓存等场景。

✅ 全局前置守卫:beforeEach

router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isAuthenticated()) {next('/login') // 未登录跳转登录页} else {next()}
})

✅ 路由独享守卫:beforeEnter

{path: '/profile',name: 'Profile',component: Profile,beforeEnter: (to, from, next) => {if (checkPermission(to.params.id)) {next()} else {next('/')}}
}

✅ 组件内守卫

  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
export default {beforeRouteLeave(to, from, next) {const answer = window.confirm('确定离开吗?数据可能未保存。')if (answer) {next()} else {next(false)}}
}

十、编程式导航(JS 控制跳转)

除了使用 <router-link> 进行跳转外,还可以通过 JS 方式实现导航。

// 字符串路径
this.$router.push('/home')// 命名路由 + 参数
this.$router.push({ name: 'User', params: { id: 123 } })// 替换当前历史记录(不产生新记录)
this.$router.replace('/login')

十一、常见问题与解决方案

问题解决方案
路由跳转后页面不更新使用 key 属性强制重新渲染组件
获取不到 $route 或 $router确保组件已正确注册并处于 <router-view> 内
动态添加路由无效使用 router.addRoute() 方法
多个 <router-view> 不生效检查是否遗漏了 name 属性或拼写错误
导航守卫无法阻止跳转检查是否调用了 next() 并正确返回结果

十二、总结对比表

功能推荐方式
基础路由跳转<router-link> + <router-view>
动态路由传参params / query
嵌套组件结构children 配置
多视图展示命名 <router-view>
按需加载组件() => import(...)
权限控制全局/路由/组件守卫
编程式跳转router.push() / replace()
推荐程度✅✅ 强烈推荐掌握

十三、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84542.shtml

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

相关文章

uni-app 自定义路由封装模块详解(附源码逐行解读)

&#x1f680;uni-app 自定义路由封装模块详解&#xff08;附源码逐行解读&#xff09; &#x1f4cc; 请收藏 点赞 关注&#xff0c;获取更多 uni-app 项目实用技巧&#xff01; 在实际 uni-app 项目中&#xff0c;我们常常需要对 uni.navigateTo、uni.switchTab 等 API 做…

QML显示图片问题解决办法

以前用qtwediget的时候&#xff0c;好像是放在qlabel或者什么组件上面&#xff0c;把图片的路径放上去就可以直接加载&#xff0c;但我用QML创建界面的时候就遇到了问题&#xff0c;哦对&#xff0c;qtwedget用qpixmap组件显示图片&#xff0c;也有image。话说回来&#xff0c;…

Vue中使用jsx

1. jsx的babel配置 1.1 在项目中使用jsx&#xff0c;需要添加对jsx的支持&#xff1a; jsx通常会通过Babel来进行转换(React编写的jsx就是通过babel转换的)Vue中&#xff0c;只需要在Babel中配置对应的插件即可以下列举需要支持转换的案例&#xff1a; template -> vue-l…

Spring Cache+Redis缓存方案 vs 传统redis缓存直接使用RedisTemplate 方案对比

结合 Spring Cache 和 Redis 的缓存方案&#xff08;即 Spring Cache Redis&#xff09;相较于普通的 Redis 缓存使用&#xff08;如直接通过 RedisTemplate 操作&#xff09;&#xff0c;具有以下显著优势&#xff1a; 具体实现方案请参考&#xff1a;Spring CacheRedis缓存…

Web应用安全漏洞扫描:原理、常用方法及潜在风险解析?

Web应用安全的关键环节在于进行漏洞扫描&#xff0c;这种扫描通过自动化或半自动化的方式&#xff0c;对应用进行安全测试。它能揭示出配置错误、代码缺陷等众多安全风险。接下来&#xff0c;我将详细阐述这些情况。 扫描原理 它主要模拟攻击者的行为&#xff0c;以探测和攻击…

Spring中@Value注解:原理、加载顺序与实战指南

文章目录 前言一、Value注解的核心原理1.1 容器启动阶段&#xff1a;环境准备1.2 Bean实例化阶段&#xff1a;后置处理器介入1.3 值解析阶段&#xff1a;双引擎处理1. 占位符解析&#xff08;${...}&#xff09;2. SpEL表达式解析&#xff08;#{...}&#xff09; 1.4 类型转换与…

MySQL 8配置文件详解

MySQL 8 配置文件详解 MySQL 8 的配置文件(my.cnf或my.ini)是MySQL服务器启动时读取的主要配置文件&#xff0c;它包含了服务器运行所需的各种参数设置。以下是MySQL 8配置文件的详细解析&#xff1a; 配置文件位置 MySQL 8 会按照以下顺序查找配置文件&#xff1a; /etc/m…

台湾住宅IP哪家好,怎么找到靠谱的海外住宅IP代理商

探索台湾住宅IP&#xff1a;如何找到靠谱的海外住宅IP代理商&#xff1f; 在当今数字化时代&#xff0c;海外住宅IP的需求日益增长&#xff0c;尤其在跨境电商、网络营销、数据抓取等领域。对于需要台湾住宅IP的用户来说&#xff0c;找到一家靠谱的海外住宅IP代理商至关重要。本…

读研一些毕业感想

回首过往三年&#xff0c;从踌躇迷茫到明晰坚定&#xff0c;从稚嫩懵懂到明理成熟&#xff0c;一切只觉轻舟已过万重山。 依稀记得我拉着行李箱跋山涉水来到学校的那天&#xff0c;早上从广东中山乘坐10小时高铁到北京西&#xff0c;然后坐1一个多小时地铁到学校&#x…

《飞算JavaAI:稳定、高效、跨平台的AI编程工具优势解析》

随着人工智能技术的不断发展&#xff0c;AI编程工具越来越成为开发者们在研究和应用AI模型时不可或缺的利器。国内外的AI编程工具多种多样&#xff0c;涵盖了从基础编程语言、框架到图形化界面的多种选择。然而&#xff0c;在这些工具中&#xff0c;飞算JavaAI作为一种基于Java…

day27/60重写(补充)

DAY 27 函数专题2&#xff1a;装饰器 ps&#xff1a;第一期day27对应5月16日 知识点回顾&#xff1a; 装饰器的思想&#xff1a;进一步复用函数的装饰器写法注意内部函数的返回值 作业&#xff1a; 编写一个装饰器 logger&#xff0c;在函数执行前后打印日志信息&#xff08;如…

网传西门子12亿美元收购云原生工业软件,云化PLM系统转机在协同

近日&#xff0c;网传西门子将以12亿美元全现金交易收购云原生MES公司FlexFact&#xff0c;并整合其技术至Xcelerator工业软件平台。如果此次收购动作完成&#xff0c;将会成为西门子加速工业云转型的标志性动作&#xff0c;背后的意义也极为深远&#xff0c;不仅会直接响应竞争…

大模型笔记_检索增强生成(RAG)

1. RAG的概念 RAG&#xff08;Retrieval-Augmented Generation&#xff09; 是一种结合 信息检索&#xff08;Retrieval&#xff09;与文本生成&#xff08;Generation&#xff09;的模型架构&#xff0c;旨在通过动态引入外部知识库或实时数据&#xff0c;提升大语言模型&…

Spring Security是如何完成身份认证的?

1. 用户名和密码被过滤器获取到&#xff0c;封装成 Authentication ,通常情况下是 UsernamePasswordAuthenticationToken 这个实现类。 2. AuthenticationManager 身份管理器负责验证这个 Authentication 3. 认证成功后&#xff0c; AuthenticationManager 身份管理器返回一…

Python爬虫实战:研究xmltodict库相关技术

1. 引言 1.1 研究背景与意义 气象数据是环境研究、农业生产、城市规划等领域的重要基础。随着互联网技术的发展,越来越多的气象数据以 XML 格式在网络上公开。XML(可扩展标记语言)因其结构化和自描述性的特点,成为数据交换的标准格式之一。然而,这些数据通常分散在不同的…

中小企业无线局域网络搭建与优化指南

1. 引言&#xff1a;无线网络——驱动中国中小企业数字化转型的引擎 无线网络已成为现代企业运营的基础设施&#xff0c;直接影响员工工作效率和客户体验。随着Wi-Fi7技术的成熟和普及&#xff0c;中小企业网络建设正迎来全新机遇。在数字经济浪潮席卷全球的今天&#xff0c;无…

【已解决】python的kafka-python包连接kafka报认证失败

先说原因&#xff1a;安装python包的时候&#xff0c;多装了一个kafka的包&#xff1a;kafka 1.3.5 我把py文件打包成二进制文件&#xff0c;在linux上执行就一直报认证失败&#xff0c;后来确认登录信息、认证方式没有问题&#xff0c;把这个kafka包卸载…

传输层协议TCP(下)

上一篇https://blog.csdn.net/Small_entreprene/article/details/148193741?sharetypeblogdetail&sharerId148193741&sharereferPC&sharesourceSmall_entreprene&sharefrommp_from_link 接下来&#xff0c;我们来谈论TCP具体的机制&#xff01; 具体TCP机制 …

洛谷B3612 【深进1.例1】求区间和

题目描述 给定 n 个正整数组成的数列 a1​,a2​,⋯,an​ 和 m 个区间 [li​,ri​]&#xff0c;分别求这 m 个区间的区间和。 输入格式 第一行&#xff0c;为一个正整数 n 。 第二行&#xff0c;为 n 个正整数 a1​,a2​,⋯,an​ 第三行&#xff0c;为一个正整数 m 。 接下…

debian12 修改MariaDB数据库存储位置报错

debian12 修改MariaDB数据库存储位置到home报错 MariaDB 修改存储路径后启动失败问题解决 更改数据存储位置 如果需要将数据存储到其他位置&#xff08;如更大的分区&#xff09;&#xff1a; 停止 MariaDB 服务&#xff1a; bash sudo systemctl stop mariadb 创建新目录并设…