DAY07:Vue Router深度解析与多页面博客系统实战
第一部分:Vue Router核心概念深度剖析
1.1 现代前端路由的本质
在单页应用(SPA)时代,前端路由扮演着至关重要的角色。它突破了传统多页面应用的跳转方式,通过以下机制实现无刷新页面切换:
-
Hash模式:
-
利用URL的hash(
#
)部分 -
通过监听
hashchange
事件实现路由切换 -
兼容性好,支持所有浏览器
-
示例URL:
http://example.com/#/posts/1
-
-
History模式:
-
使用HTML5 History API(pushState/replaceState)
-
需要服务器端配合配置
-
示例URL:
http://example.com/posts/1
-
更符合常规URL习惯,SEO友好
-
-
Memory模式:
-
不修改实际URL
-
适用于非浏览器环境(如Electron)
-
通过内部数组维护路由历史
-
1.2 路由配置完全指南
1.2.1 安装与基础配置
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'const routes = [{path: '/',name: 'Home',component: () => import('@/views/Home.vue'),meta: { requiresAuth: true }},{path: '/login',name: 'Login',component: () => import('@/views/Login.vue')}
]const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes,scrollBehavior(to, from, savedPosition) {return savedPosition || { top: 0 }}
})export default router
1.2.2 路由视图容器进阶用法
<!-- App.vue -->
<template><div id="app"><router-view v-slot="{ Component }"><transition name="fade" mode="out-in"><keep-alive :include="cachedViews"><component :is="Component" /></keep-alive></transition></router-view></div>
</template>
-
过渡动画:结合Vue过渡系统实现路由切换动画
-
缓存策略:通过
<keep-alive>
缓存组件实例 -
命名视图:支持多视图出口配置
1.3 导航守卫深度解析
1.3.1 全局守卫执行链路
router.beforeEach((to, from, next) => {console.log('全局前置守卫')next()
})router.beforeResolve((to, from) => {console.log('全局解析守卫')
})router.afterEach((to, from) => {console.log('全局后置钩子')
})
完整执行顺序:
-
导航触发
-
调用失活组件的
beforeRouteLeave
-
调用全局
beforeEach
-
调用重用组件的
beforeRouteUpdate
-
调用路由配置的
beforeEnter
-
解析异步路由组件
-
调用激活组件的
beforeRouteEnter
-
调用全局
beforeResolve
-
导航确认
-
调用全局
afterEach
-
触发DOM更新
-
执行
beforeRouteEnter
中的回调函数
1.3.2 路由独享守卫实战应用
{path: '/admin',component: AdminDashboard,beforeEnter: (to, from, next) => {if (!store.getters.isAdmin) {next({ name: 'Forbidden' })} else {next()}}
}
1.3.3 组件级守卫典型场景
export default {beforeRouteEnter(to, from, next) {next(vm => {// 访问组件实例vm.loadData()})},beforeRouteUpdate(to, from) {// 处理参数变化this.fetchData(to.params.id)},beforeRouteLeave(to, from) {if (this.hasUnsavedChanges) {return confirm('确定要离开吗?')}}
}
1.4 动态路由与参数传递高级技巧
1.4.1 动态路由匹配模式
{// 匹配 /user/123 和 /user/123/profilepath: '/user/:id(\\d+)', // 使用正则约束参数格式component: User,props: true
}
1.4.2 参数传递方式对比
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
params | URL可见,支持浏览器前进后退 | 需要预先配置动态路由 | 资源标识类参数 |
query | 灵活,无需配置路由 | 参数暴露在URL中 | 筛选条件、分页参数 |
props | 组件解耦,类型校验方便 | 需要额外配置 | 需要强类型约束的参数 |
meta字段 | 传递路由元信息 | 只能在导航守卫中访问 | 权限、页面标题等元数据 |
Vuex状态管理 | 适合全局共享的复杂状态 | 增加代码复杂度 | 跨组件共享的复杂状态 |
本地存储 | 数据持久化 | 安全性较低 | 需要持久化的非敏感数据 |
1.4.3 参数接收最佳实践
export default {props: {id: {type: Number,required: true,validator: value => value > 0}},setup(props) {watch(() => props.id, (newVal) => {fetchData(newVal)})}
}
1.5 嵌套路由架构设计
1.5.1 多级路由配置示例
{path: '/dashboard',component: DashboardLayout,children: [{path: '',name: 'DashboardHome',component: DashboardHome},{path: 'analytics',component: Analytics,children: [{path: 'realtime',component: RealtimeStats}]}]
}
1.5.2 布局组件设计模式
<!-- layouts/MainLayout.vue -->
<template><div class="main-layout"><header><navigation-bar /></header><div class="content-wrapper"><aside><sidebar-menu /></aside><main><router-view /></main></div><footer><app-footer /></footer></div>
</template>
第二部分:博客系统实战开发
2.1 项目架构设计
2.1.1 功能模块划分
-
用户认证模块
-
文章管理模块
-
评论系统模块
-
个人中心模块
-
后台管理模块
2.1.2 路由结构设计
const routes = [{path: '/',component: MainLayout,children: [{ path: '', component: Home },{ path: 'post/:slug', component: PostDetail },{ path: 'category/:id', component: CategoryPosts },{ path: 'search', component: SearchResults }]},{path: '/dashboard',component: DashboardLayout,meta: { requiresAuth: true },children: [{ path: '', redirect: 'posts' },{ path: 'posts', component: PostList },{ path: 'posts/create', component: PostEditor },{ path: 'posts/:id/edit', component: PostEditor },{ path: 'profile', component: UserProfile }]}
]
2.2 认证系统与路由守卫实现
2.2.1 路由元信息配置
{path: '/dashboard',meta: {requiresAuth: true,permissions: ['EDIT_POST'],breadcrumb: [{ text: 'Dashboard', to: '/' }]}
}
2.2.2 全局守卫完整实现
router.beforeEach(async (to, from, next) => {const authStore = useAuthStore()// 检查是否需要认证if (to.matched.some(record => record.meta.requiresAuth)) {// 获取最新认证状态if (!authStore.isAuthenticated) {try {await authStore.checkAuth()} catch (error) {return next({ name: 'Login', query: { redirect: to.fullPath } })}}// 检查权限const requiredPermissions = to.meta.permissions || []if (requiredPermissions.length > 0) {const hasPermission = requiredPermissions.every(perm => authStore.user.permissions.includes(perm))if (!hasPermission) {return next({ name: 'Forbidden' })}}}// 处理已登录用户访问登录页if (to.name === 'Login' && authStore.isAuthenticated) {return next(from.fullPath || '/')}// 设置页面标题document.title = to.meta.title ? `${to.meta.title} | My Blog` : 'My Blog'next()
})
2.3 动态路由加载策略
2.3.1 基于用户角色的路由加载
// 初始化基础路由
const baseRoutes = [...]
const router = createRouter({ ... })// 动态添加路由
export async function loadAdditionalRoutes() {const userRole = await fetchUserRole()if (userRole === 'admin') {router.addRoute({path: '/admin',component: () => import('@/views/Admin.vue'),meta: { requiresAuth: true }})}// 处理404路由router.addRoute({ path: '/:pathMatch(.*)*', component: NotFound })
}
2.3.2 路由模块化拆分
// router/modules/blog.js
export default {path: '/blog',name: 'Blog',component: () => import('@/layouts/BlogLayout.vue'),children: [{ path: '', component: BlogHome },{ path: 'categories', component: Categories }]
}// router/index.js
import blogRoutes from './modules/blog'const routes = [...blogRoutes
]
2.4 高级路由模式实现
2.4.1 滚动行为定制
const router = createRouter({scrollBehavior(to, from, savedPosition) {if (savedPosition) {return savedPosition} else if (to.hash) {return {el: to.hash,behavior: 'smooth'}} else {return { top: 0 }}}
})
2.4.2 路由过渡动画优化
<template><router-view v-slot="{ Component }"><transitionname="fade-transform"mode="out-in"@before-enter="beforeEnter"@after-enter="afterEnter"><component :is="Component" /></transition></router-view>
</template><script>
export default {methods: {beforeEnter() {document.documentElement.style.overflow = 'hidden'},afterEnter() {document.documentElement.style.overflow = ''}}
}
</script><style>
.fade-transform-enter-active,
.fade-transform-leave-active {transition: all 0.3s;
}.fade-transform-enter-from {opacity: 0;transform: translateX(30px);
}.fade-transform-leave-to {opacity: 0;transform: translateX(-30px);
}
</style>
第三部分:性能优化与安全实践
3.1 路由懒加载优化
const routes = [{path: '/dashboard',component: () => import(/* webpackChunkName: "dashboard" */ '@/views/Dashboard.vue'),children: [{path: 'analytics',component: () => import(/* webpackChunkName: "analytics" */ '@/views/Analytics.vue')}]}
]
3.2 路由预加载策略
// 在用户可能访问的页面添加预加载
router.beforeEach((to, from, next) => {if (to.meta.preload) {to.matched.forEach(record => {if (typeof record.components.default === 'function') {record.components.default()}})}next()
})
3.3 路由安全防护
-
参数校验:
{path: '/user/:id',component: User,beforeEnter: (to, from, next) => {if (!/^\d+$/.test(to.params.id)) {next({ name: 'NotFound' })} else {next()}}
}
-
CSRF防护:
router.afterEach(() => {const csrfToken = document.querySelector('meta[name="csrf-token"]')if (csrfToken) {axios.defaults.headers.common['X-CSRF-TOKEN'] = csrfToken.content}
})
-
点击劫持防护:
router.beforeEach((to, from, next) => {if (to.meta.securityHeaders) {document.documentElement.style.setProperty('Content-Security-Policy', "frame-ancestors 'self'")}next()
})
第四部分:常见问题与解决方案
4.1 路由重复导航问题
// 统一处理导航错误
router.onError(error => {if (error.name === 'NavigationDuplicated') {console.warn('重复导航:', error.message)}
})// 或者自定义push方法
const originalPush = router.push
router.push = function push(location) {return originalPush.call(this, location).catch(err => {if (err.name !== 'NavigationDuplicated') throw err})
}
4.2 滚动位置保持策略
const router = createRouter({scrollBehavior(to, from, savedPosition) {if (to.meta.keepScroll) {return new Promise(resolve => {setTimeout(() => {resolve(savedPosition || { left: 0, top: 0 })}, 500)})}return { left: 0, top: 0 }}
})
4.3 动态路由缓存问题
<router-view v-slot="{ Component }"><keep-alive :include="cachedRoutes"><component :is="Component" :key="$route.fullPath" /></keep-alive>
</router-view>
// 动态管理缓存路由
const cachedRoutes = ref([])
router.afterEach(to => {if (to.meta.keepAlive && !cachedRoutes.value.includes(to.name)) {cachedRoutes.value.push(to.name)}
})
第五部分:项目扩展与进阶
5.1 基于路由的权限管理系统
// 权限指令实现
app.directive('permission', {mounted(el, binding) {const authStore = useAuthStore()const hasPermission = authStore.hasPermission(binding.value)if (!hasPermission) {el.parentNode?.removeChild(el)}}
})// 使用示例
<button v-permission="'EDIT_POST'">编辑文章</button>
5.2 路由埋点与监控
router.afterEach((to) => {if (typeof _paq !== 'undefined') {_paq.push(['trackPageView', to.fullPath])}// 发送性能指标const navigationTiming = performance.getEntriesByType('navigation')[0]const metrics = {path: to.fullPath,dns: navigationTiming.domainLookupEnd - navigationTiming.domainLookupStart,tcp: navigationTiming.connectEnd - navigationTiming.connectStart,ttfb: navigationTiming.responseStart,duration: navigationTiming.duration}sendAnalytics(metrics)
})
5.3 服务端渲染(SSR)适配
// 路由创建工厂函数
export function createRouter() {return new VueRouter({mode: 'history',routes,scrollBehavior: (to, from, savedPosition) => {// SSR环境下特殊处理if (savedPosition) {return savedPosition}if (to.hash) {return { selector: to.hash }}return { x: 0, y: 0 }}})
}
总结与最佳实践
通过本教程的深入学习,我们系统地掌握了Vue Router的各项核心功能,并完成了从基础配置到企业级应用开发的完整路径。以下是一些关键的最佳实践建议:
-
路由分层设计:
-
基础路由与动态路由分离
-
业务模块按功能拆分路由文件
-
公共布局组件统一管理
-
-
权限控制策略:
-
路由级权限与组件级权限结合
-
接口级权限校验不可缺失
-
敏感操作记录审计日志
-
-
性能优化要点:
-
路由懒加载结合预加载策略
-
合理使用组件缓存
-
监控路由切换性能指标
-
-
安全防护措施:
-
参数严格校验
-
敏感路由HTTPS强制
-
定期安全审计
-
-
可维护性实践:
-
统一路由命名规范
-
完善的类型定义(TypeScript)
-
路由配置文档化
-
随着项目规模的扩大,建议结合
相关文章:
DAY07:Vue Router深度解析与多页面博客系统实战
第一部分:Vue Router核心概念深度剖析 1.1 现代前端路由的本质 在单页应用(SPA)时代,前端路由扮演着至关重要的角色。它突破了传统多页面应用的跳转方式,通过以下机制实现无刷新页面切换: Hash模式&#…...

Drawio编辑器二次开发
Drawio (现更名为 Diagrams.net )是一款完全免费的在线图表绘制工具,由 JGraph公司 开发。它支持创建多种类型的图表,包括流程图、组织结构图、UML图、网络拓扑图、思维导图等,适用于商务演示、软件设计等多种场景…...

1.测试过程之需求分析和测试计划
测试基础 流程 1.分析测试需求 2.编写测试计划 3.设计与编写测试用例 4.执行测试 5.评估与总结 测试目标 根据测试阶段不同可分为四个主要目标:预防错误(早期)、发现错误(开发阶段)、建立信心(验收阶段&a…...
第三十七天打卡
过拟合的判断:测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint,还包含训练状态 早停策略 过拟合判断 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load…...
Qt 窗口标志(Window Flags)详解:控制窗口样式与行为
在 Qt 中,windowFlags 用于控制窗口的样式和行为,包括标题栏、边框、最大化/最小化按钮等。合理设置 windowFlags 可以自定义窗口的外观和交互方式。本文将详细介绍常用的窗口标志及其组合效果。 1. 基本概念 windowFlags 是一个 Qt::WindowFlags 类型的…...
ABP VNext + CRDT 打造实时协同编辑
🛠️ ABP VNext CRDT 打造实时协同编辑器 🎉 📚 目录 🛠️ ABP VNext CRDT 打造实时协同编辑器 🎉🧠 背景与挑战🔹 系统架构🛣️ 端到端流程 🚦🔒 安全与鉴…...
微信小程序真机调试时如何实现与本地开发环境服务器交互
最近在开发微信小程序项目,真机调试时需要在手机上运行小程序,为了实现本地开发服务器与手机小程序的交互,需要以下步骤 1.将手机连到和本地一样的局域网 2.Visual Studio中将IIS Express服务器的localhost端口地址修改为本机的IP自定义的端口: 1)找到web api项目…...
Linux: network: dpdk, VF, ip link set down 对VF不生效
文章目录 问题另一个测试的结果是从dpdk的文档看怎么设置VF给VM内核的调用需要使用的命令问题 最近遇到一个问题,也可以说是一种常识,至少是之前不知道的常识:如果一个VF分配给了VM用作dpdk的输入。在host做ip link set down 这个PF的接口,对这个VM里的VF的功能没有任何影…...

[春秋云镜] CVE-2023-23752 writeup
首先奉上大佬的wp表示尊敬:(很详细)[ 漏洞复现篇 ] Joomla未授权访问Rest API漏洞(CVE-2023-23752)_joomla未授权访问漏洞(cve-2023-23752)-CSDN博客 知识点 Joomla版本为4.0.0 到 4.2.7 存在未授权访问漏洞 Joomla是一套全球知名的内容管理…...
Java集合操作常见错误与最佳实践
错误69:搜索无关类型的对象 泛型方法的类型安全漏洞 在Java引入参数化类型前,集合元素只能声明为Object类型,导致可以随意将字符串添加到数值列表中。虽然泛型机制对添加元素的方法进行了类型约束,但搜索和删除相关方法仍保留了Object类型的参数设计。这包括以下关键方法…...

CSS专题之水平垂直居中
前言 石匠敲击石头的第 16 次 在日常开发中,经常会遇到水平垂直居中的布局,虽然现在基本上都用 Flex 可以轻松实现,但是在某些无法使用 Flex 的情况下,又应该如何让元素水平垂直居中呢?这也是一道面试的必考题…...
python打卡day41@浙大疏锦行
知识回顾 1. 数据增强 2. 卷积神经网络定义的写法 3. batch归一化:调整一个批次的分布,常用与图像数据 4. 特征图:只有卷积操作输出的才叫特征图 5. 调度器:直接修改基础学习率 卷积操作常见流程如下: 1. …...
vue3 基本语法 父子关系
在Vue 3中,父子组件的关系是通过组件的嵌套实现的。父组件可以传递数据(props)给子组件,同时子组件可以通过事件(emits)与父组件通信。下面是如何在Vue 3中建立和使用父子组件的基本语法: 1. 创…...
算法-js-子集
题:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 方法一:迭代法 核心逻辑:动态扩展子集, 小规…...

(新)MQ高级-MQ的可靠性
消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。 一、数据持久化 为了提升性能,默认情况下MQ的数据都是在内存存储的临时数据,重启后就会消失。为了保证数据的可靠性,必须…...
Android设置界面层级为最上层实现
Android设置界面层级为最上层实现 文章目录 Android设置界面层级为最上层实现一、前言二、Android设置界面层级为最上层实现1、主要代码2、后遗症 三、其他1、Android设置界面层级为最上层小结2、悬浮框的主要代码悬浮框 注意事项(1)权限限制(…...
云原生微服务架构演进之路:理念、挑战与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:架构的演进是业务进化的技术反射 在软件行业的发展过程中,架构变迁总是伴随着技术浪潮与业务复杂度的升…...
Go语言使用阿里云模版短信服务
在当今的互联网项目中,短信验证码、通知等功能已成为标配。本文将详细介绍如何使用Go语言集成阿里云短信服务(DYSMSAPI)实现短信发送功能。 一、准备工作 在开始之前,您需要完成以下准备工作: 注册阿里云账号并实名认证开通短信服务(SMS)申…...

Leetcode 3231. 要删除的递增子序列的最小数量
1.题目基本信息 1.1.题目描述 给定一个整数数组 nums,你可以执行任意次下面的操作: 从数组删除一个 严格递增 的 子序列。 您的任务是找到使数组为 空 所需的 最小 操作数。 1.2.题目地址 https://leetcode.cn/problems/minimum-number-of-increas…...

4.2.5 Spark SQL 分区自动推断
在本节实战中,我们学习了Spark SQL的分区自动推断功能,这是一种提升查询性能的有效手段。通过创建具有不同分区的目录结构,并在这些目录中放置JSON文件,我们模拟了一个分区表的环境。使用Spark SQL读取这些数据时,Spar…...
基于昇腾MindSpeed训练加速库玩转智谱GLM-4-0414模型
智谱GLM-4-0414模型提供32B和9B两种参数规模,涵盖基础、推理和沉思等多种模型类型,均基于 MIT 许可协议开放。其中,推理模型 GLM-Z1-32B-0414 性能卓越,与 DeepSeek-R1 等领先模型相当,实测推理速度达每秒200个Tokens。…...

【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南
一、环境准备 import cv2 import numpy as np import matplotlib.pyplot as plt# 配置中文字体显示(可选) plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False二、图像的基本操作 1. 图像读取、显示与保存 使用OpenCV…...

Spring Boot微服务架构(九):设计哲学是什么?
一、Spring Boot设计哲学是什么? Spring Boot 的设计哲学可以概括为 “约定优于配置” 和 “开箱即用”,其核心目标是极大地简化基于 Spring 框架的生产级应用的初始搭建和开发过程,让开发者能够快速启动并运行项目…...
GRCh38版本染色体位置转换GRCh37(hg19)
目录 方法 1:使用 Ensembl REST API(推荐,适用于少量位点查询)方法 2:使用 UCSC API方法 3:使用 NCBI API 并转换坐标(需要额外步骤)方法 4:使用本地数据库(最…...

TC/BC/OC P2P/E2E有啥区别?-PTP协议基础概念介绍
前言 时间同步网络中的每个节点,都被称为时钟,PTP协议定义了三种基本时钟节点。本文将介绍这三种类型的时钟,以及gPTP在同步机制上与其他机制的区别 本系列文章将由浅入深的带你了解gPTP,欢迎关注 时钟类型 在PTP中我们将各节…...
解决微信小程序中 Flex 布局下 margin-right 不生效的问题
解决微信小程序中 Flex 布局下 margin-right 不生效的问题 在做微信小程序开发时,遇到了一个棘手的布局问题:在 flex 布局下,给元素设置的 margin-right 不生效,被“吞噬”了。这个问题导致了横向滚动列表的右边距失效࿰…...

Kafka数据怎么保障不丢失
在分布式消息系统中,数据不丢失是核心可靠性需求之一。Apache Kafka 通过生产者配置、副本机制、持久化策略、消费者偏移量管理等多层机制保障数据可靠性。以下从不同维度解析 Kafka 数据不丢失的核心策略,并附示意图辅助理解。 一、生产者端:…...
使用HTTPS进行传输加密
说明 日期:2025年5月30日 与以纯文本形式发送和接收消息的标准 HTTP 不同,HTTPS 使用SSL/TLS等协议对服务器进行身份验证、加密通信内容和检测篡改。 这样可以防止欺骗、中间人攻击和窃听等攻击。 证书很重要,如果用户主动信任了伪造证书&…...

AI书签管理工具开发全记录(八):Ai创建书签功能实现
文章目录 AI书签管理工具开发全记录(八):AI智能创建书签功能深度解析前言 📝1. AI功能设计思路 🧠1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…...

X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用
X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用 应用简介: X-plore 是一款强大的安卓端文件管理器,它可以在电视或者手机上管理大量媒体文件、应用程序。…...