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

Vue3 路由

一、核心概念

1. 什么是路由?

路由是单页面应用(SPA)的核心机制,通过管理 URL 与组件的映射关系,实现不刷新页面切换视图的效果。

Vue Router 是 Vue 官方路由解决方案,主要功能包括:

  • 嵌套路由映射

  • 动态路由匹配

  • 模块化的路由配置

  • 导航控制(编程式导航、导航守卫)

  • 自动的 CSS 类链接激活

  • 滚动行为控制

2. 路由模式对比

模式URL 示例原理服务器配置要求
Hash 模式http://site.com/#/about使用 URL hash(#后的部分)无需特殊配置
History 模式http://site.com/about依赖 HTML5 History API需要服务端支持

二、基础配置

1. 安装与初始化

npm install vue-router@4
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'const routes = [{path: '/',name: 'Home',component: () => import('@/views/Home.vue')},{path: '/about',name: 'About',component: () => import('@/views/About.vue')}
]const router = createRouter({history: createWebHistory(), // 使用history模式routes
})export default router

2. 挂载到Vue实例

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

三、路由视图与导航

1. 路由出口
在布局组件中使用 <router-view> 作为组件渲染容器:

<!-- App.vue -->
<template><nav><router-link to="/">首页</router-link><router-link :to="{ name: 'About' }">关于</router-link></nav><!-- 路由匹配的组件将渲染在这里 --><router-view></router-view>
</template>

2. 导航方式对比

方式代码示例特点
声明式导航<router-link to="/about">自动处理激活状态
编程式导航router.push('/about') 或 router.push({ name: 'About' })适合逻辑触发跳转
替换当前路由router.replace('/login')不产生历史记录
前进/后退router.go(1) 或 router.go(-1)类似浏览器历史操作

四、动态路由与参数传递

1. 动态路径参数

{path: '/user/:id',name: 'User',component: () => import('@/views/User.vue'),props: true // 启用props接收参数
}

2. 参数获取方式
在目标组件中获取参数:

<script setup>
import { useRoute } from 'vue-router'const route = useRoute()// 方式1:通过路由对象
console.log(route.params.id)// 方式2:通过props(需配置props: true)
defineProps({id: String
})
</script>

3. 参数匹配规则

// 限定数字ID
path: '/user/:id(\\d+)'// 可选参数
path: '/search/:keyword?'

五、导航守卫

1. 守卫类型

守卫类型执行时机使用场景
全局前置守卫路由跳转前权限验证、登录检查
全局解析守卫导航被确认前数据预加载
全局后置钩子导航完成之后页面分析统计
路由独享守卫进入特定路由前路由级别权限控制
组件内守卫组件生命周期特定阶段组件进入/离开时的操作

2. 典型应用

// 全局前置守卫
router.beforeEach((to, from, next) => {const isAuthenticated = localStorage.getItem('token')if (to.meta.requiresAuth && !isAuthenticated) {next({ name: 'Login' })} else {next()}
})// 路由独享守卫
{path: '/admin',component: Admin,beforeEnter: (to, from, next) => {// 管理员权限验证}
}// 组件内守卫
onBeforeRouteLeave((to, from, next) => {if (formDataChanged && !confirm('数据未保存,确定离开?')) {next(false)} else {next()}
})

六、嵌套路由

1. 配置方式

{path: '/dashboard',component: DashboardLayout,children: [{path: '', // 默认子路由component: DashboardHome},{path: 'settings',component: DashboardSettings}]
}

2. 视图结构

<!-- DashboardLayout.vue -->
<template><div class="dashboard"><sidebar /><div class="content"><router-view></router-view> <!-- 子路由组件在此渲染 --></div></div>
</template>

七、高级功能

1. 路由懒加载

component: () => import('./views/HeavyComponent.vue')

2. 滚动行为控制

const router = createRouter({scrollBehavior(to, from, savedPosition) {if (savedPosition) {return savedPosition} else if (to.hash) {return { el: to.hash }} else {return { top: 0 }}}
})

3. 路由元信息

{path: '/admin',meta: {requiresAuth: true,transition: 'slide-left'}
}

八、最佳实践

  1. 路由分层管理

src/
├── router/
│   ├── index.js        # 主路由配置
│   ├── authRoutes.js   # 认证相关路由
│   └── adminRoutes.js  # 管理后台路由
  1. 动态路由加载

// 根据权限动态添加路由
function setupRoutes(userRole) {const baseRoutes = [...]const adminRoutes = [...]if (userRole === 'admin') {router.addRoute(adminRoutes)}
}
  1. 路由组件缓存

<router-view v-slot="{ Component }"><keep-alive><component :is="Component" /></keep-alive>
</router-view>
  1. 类型安全(TypeScript)

declare module 'vue-router' {interface RouteMeta {requiresAuth?: booleantransition?: string}
}

九、常见问题解决方案

Q1: History模式刷新404

# Nginx配置
location / {try_files $uri $uri/ /index.html;
}

Q2: 路由重复导航警告

// 封装安全的导航方法
function safePush(path) {if (route.path !== path) {router.push(path)}
}

Q3: 路由过渡动画

<router-view v-slot="{ Component }"><transition name="fade" mode="out-in"><component :is="Component" /></transition>
</router-view>

Q4: 多级路由缓存

<router-view v-slot="{ Component, route }"><keep-alive :include="cachedViews"><component :is="Component" :key="route.fullPath" /></keep-alive>
</router-view>

http://www.xdnf.cn/news/130735.html

相关文章:

  • Windows与CasaOS跨平台文件同步:SyncThing本地部署与同步配置流程
  • WebGL2简介
  • Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
  • 畅游Diffusion数字人(28):InstantID原班人马提出个性化人物定制InstantCharacter
  • [AI Workflow] 基于多语种知识库的 Dify Workflow 构建与优化实践
  • 【产品经理】常见的交互说明撰写方法
  • leetcode刷题日记——逆波兰表达式求值
  • R7周:糖尿病预测模型优化探索
  • 佐航BYQ2321直阻变比二合一全面升级!
  • RunnerGo API性能测试实战与高并发调优
  • Python图形界面编程(二)
  • 使用 Frp 同时实现 HTTP 和 HTTPS 内网穿透
  • SQLMesh 表格对比指南:深入理解 table_diff 工具的实际应用
  • c++进阶——类与继承
  • 命令行指引的尝试
  • 【Linux学习笔记】进程的fork创建 exit终止 wait等待
  • 如何让 HTML 文件嵌入另一个 HTML 文件:详解与实践
  • Java面试高频问题(26-28)
  • 使用浏览器的Clipboard API实现前端复制copy功能
  • 基准指数选股策略思路
  • 风光储能+智能调度,这才是企业未来能源管理的最优解
  • Linux进程学习【基本认知】
  • vscode切换Python环境
  • C++中的浅拷贝和深拷贝
  • 【现代深度学习技术】循环神经网络06:循环神经网络的简洁实现
  • 头歌实训之索引
  • MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
  • 深度解析之算法之分治(快排)
  • Python-36:饭馆菜品选择问题
  • 使用jsrsasign进行RSA加密解密