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

vue-router

vue3路由管理器

单页面应用程序 SPA (Single Page Application) 是指 所有的功能都在一个HTML页面 上实现。

单页应用 VS 多页应用

分类实现方式页面性能开发效率用户体验首屏加载SEO
单页一个HTML页面按需更新
多页多个HTML页面整页更新一般一般

SEO(Search Engine Optimization,搜索引擎优化),通过优化网站结构、内容,提高网站在搜索引擎结构页中的排名。

1. 路由介绍

Vue Router 是 Vue 官方的路由管理器,是构建单页面应用的核心功能之一,允许不刷新页面的情况下切换视图

Vue Router 是 路径和组件映射 关系。

  • 组件的分类

    • 页面组件配合路由切换,建议放置在 src/views 目录下

    • 普通组件用于复用,建议放置在 src/components 目录下

  • import 中路径可以使用 @ 代表 src 目录。

2. 基本使用

2.1 步骤拆分

1️⃣下载 Vue Router 模块。

npm install vue-router

2️⃣导入相关函数。

// main.js
import { createRouter, createWebHashHistory } from 'vue-router'

3️⃣创建路由实例。

// main.js
const router = createRouter({history: createWebHashHistory(),    // 哈希模式routes: []  // 路由表规则, 即 path 与 component 的对应关系                   
}

4️⃣注册路由。

// main.js
app.use(router)

5️⃣src/views目录下,创建页面组件。

src/
├─ views/
│   ├─ Login.vue
│   ├─ Home.vue

6️⃣导入组件并配置路由规则。

// main.js
routes: [{path: '/login',component: Login},{path: '/home',component: Home}
]

7️⃣ 设置路由出口(路径匹配时,组件的显示位置)。

// App.vue
<template><div><!-- 路由出口 --><router-view></router-view></div>
</template>

2.2 完整代码示例

// main.js
import { createApp } from 'vue'
import { createRouter , createWebHashHistory } from 'vue-router'
import App from './App.vue'
import Login from './views/Login.vue'
import Home from '@/views/Home..vue'const router = createRouter({history: createWebHashHistory(),routes: [{path: '/login',component: Login},{path: '/home',component: Home}]
})const app = createApp(App)
app.use(router)
app.mount('#app')// App.vue
<script setup></script><template><div><router-view></router-view></div>
</template><style scoped></style>

2.3 路由模式

2.3.1 Hash模式(默认)
  • http://localhost:5173/#/login
import { createWebHashHistory } from 'vue-router'
2.3.2 History模式
  • http://localhost:5173/login

  • 上线需要服务器端支持,开发环境不影响

import { createWebHistory } from 'vue-router'

2.4 路由运作原理

  1. 浏览器的 url 改变时,匹配路由表数组中 path 值。

  2. 找到对应组件 component

  3. 将其渲染到 <router-view /> 的位置。

2.5 封装路由模块

新建 router/index.js ,将路由模块抽离出来,方便管理和维护。

// router/index.js
import { createRouter , createWebHashHistory , createWebHistory} from 'vue-router'
import Login from '@/views/Login.vue'
import Home from '@/views/Home.vue'const router = createRouter({history: createWebHistory(),routes: [{path: '/login',component: Login},{path: '/home',component: Home}]
})export default router// main.js
import { createApp } from 'vue'
import App from './App.vue'
// ./router/index.js -> index.js可省略
import router from './router'const app = createApp(App)
app.use(router)
app.mount('#app')// App.vue
<template><div><router-view></router-view></div>
</template>

3. 路由配置

3.1 重定向

网页刚打开时,url 默认是 / 路径,未匹配到组件时,会出现空白。

 routes: [{  // 访问 / ,会自动跳转 /loginpath: '/',redirect: '/login'}]

3.2 404

在 Vue Router 中配置 404 页面是确保用户访问不存在的路由时获得良好体验的重要方式。

 routes: [{  path: '/:pathMatch(.*)*',component: NotFound}]

4. 声明式导航与传参

4.1 声明式导航

声明式导航提供了一个全局组件 router-link,可以为其添加 to 属性,用于点击跳转。

  • router-link 标签会默认渲染成一个 <a> 标签,点击后会渲染 /login 匹配的组件。

  • 当链接匹配到当前路由时,会自动添加激活类名。

    • router-link-active 模糊匹配,只要以 /login 开头的路径都可以匹配到

    • router-link-exact-active 精确匹配,仅能匹配 /login

  • router-link 添加原生事件的方式 @click.native

<router-link to="login">登录</router-link>

4.2 声明式导航传参

4.2.1 查询参数传参
// 1.字符串的形式
<router-link to="/path?key=value&key=value&..."></router-link>
// 2.对象
<router-link :to="{path: '/path',query: {key:value,...}
}"></router-link>
4.2.2 接收查询参
<script setup>
import { useRoute } from 'vue-router'
// 1.得到当前激活的路由对象
const route = useRoute()
// 2.获取查询参数
console.log(route.query)
</script>
4.2.3 动态路由传参
// 1.改写路由表中path值
routes: [{name: login,    // 仅当使用对象动态传参时,需要指定name属性path: '/login/:id/:name/...'component: Login}
]
// 字符串的形式
<router-link to="/path/value1/value2/..."></router-link>
// 对象
<router-link :to="{name: 'login',params: {key:value,...}
}"></router-link>
4.2.4 接收动态参
<script setup>
import { useRoute } from 'vue-router';
const route = useRoute()
console.log(route.params)
</script>

5. 编程式导航与传参

5.1 编程式导航

编程式导航是通过 JavaScript 代码控制路由跳转的方式,相比声明式导航(<router-link>)更加灵活,适合在方法、钩子函数或异步操作后执行导航。

// Login.vue
import { useRouter } from 'vue-router';
onMounted(() => {setTimeout(() => {// 1.字符串router.push('/home')// 2.对象router.push({path: '/home'})}, 1000)
})

5.2 编程式导航传参

5.2.1 查询参数传参
// 1.字符串的方式
router.push('/path?key=value&key=value&...')
// 2.对象
router.push({        path: '/path',query:{ key: value,...}
})
5.2.2 接收查询参
<script setup>
import { useRoute } from 'vue-router'
// 1.得到当前激活的路由对象
const route = useRoute()
// 2.获取查询参数
console.log(route.query)
</script>
5.2.3 动态路由传参
// 1.改写路由表中path值
routes: [{name: login,    // 仅当使用对象动态传参时,需要指定name属性path: '/login/:id/:name/...'component: Login}
]// 1.字符串的形式
router.push('/login/110/abc')
// 2.对象
router.push({name: 'login'params: {id: 101,name: 'abc'}
})
5.2.4 接收动态参
<script setup>
import { useRoute } from 'vue-router';
const route = useRoute()
console.log(route.params)
</script>

6. 路由嵌套

步骤:

  1. 创建二级路由页面组件。

  2. 路由表数组中,在相应的一级路由配置规则中,配置 children 属性。

  3. 在相应的一级路由页面组件中,添加 router-view 出口。

注意:

  • 二级路由中的 path 推荐不加 /

  • 路由跳转时需要写完整路径(父路径 + 当前路径)。

  • 防止二级路由页面空白,建议在一级路由中添加重定向。

// router/index.js
const router = createRouter({history: createWebHistory(),routes: [{path: '/',redirect: '/login'},{path: '/login',component: Login},{path: '/home',component: Home,redirect: '/home/recommend',children: [{path: 'recommend',component: Recommend},{path: 'setting',component: Setting}]}]
})// Home.vue
<template><div class="home"><router-link to="/home/recommend">推荐</router-link><br><router-link to="/home/setting">设置</router-link><p>这是登录成功的页面</p><p><router-view></router-view></p></div>
</template>

7. 路由守卫

路由守卫是 Vue Router 提供的导航控制机制,允许开发者在路由导航过程中插入控制逻辑,实现权限验证、数据预加载等功能。

7.1 全局守卫(作用于所有路由)

每个路由跳转前都会触发该回调函数。

const router = new VueRouter({ ... })router.beforeEach((to, from) => {// to: 即将要进⼊的路由// from: 当前正要离开的路由// return false: 取消导航// return undefined | true 同意导航// return { name: 'xxx' } 重定向
}

7.2 路由独享守卫

const routes = [{path: '/home',component: Home,beforeEnter: (to, from) => {}}
]
http://www.dtcms.com/a/285897.html

相关文章:

  • 前端篇——番外篇 Bootstrap框架
  • 【密码学】1. 引言
  • c++继承详解
  • 【物联网】基于树莓派的物联网开发【12】——树莓派硬件GPIO模块原理知识
  • 模式结构-微服务架构设计模式
  • 【PTA数据结构 | C语言版】二叉堆的快速建堆操作
  • 一文讲清楚React性能优化
  • mysql 性能优化之Explain讲解
  • RHEL/CentOS 的系统安装程序界面介绍
  • 周志华《机器学习导论》第9章 聚类
  • 分布式面试点
  • 算法-动态规划
  • MyBatis缓存实战指南:一级与二级缓存的深度解析与性能优化
  • 分布式短剧平台核心技术解析:CDN优化、AI推荐与多语言支付集成
  • 在 ASP.NET Core 和 JavaScript 中配置 WebSocket
  • Jfinal+SQLite处理 sqlite数据库执行FIND_IN_SET报错
  • .NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!
  • 从复合变量到分组分析:piecewiseSEM 解析生态系统多因子交互作用
  • 深度剖析:最新发布的ChatGPT Agent 技术架构与应用场景
  • 专题:2025智能体研究报告|附70份报告PDF、原数据表汇总下载
  • NJU 凸优化导论(8) Lagrange Dual 拉格朗日对偶
  • Kotlin集合分组
  • 解决selenium元素定位不到疑难杂症
  • TCL 电视安装 APK 文件主要有 U 盘安装——仙盟创梦IDE
  • nastools继任者?极空间部署影视自动化订阅系统『MediaMaster』
  • echarts dataZoom 文本显示不完整
  • 响应式编程入门教程第六节:进阶?Combine、Merge、SelectMany 与错误处理
  • 【怜渠客】简单实现手机云控Windows电脑锁屏
  • MySQL中的锁有哪些
  • 【软件重构】如何避免意外冗余