前端学习教程-Vue Router 教程

news/2025/10/4 22:36:56/文章来源:https://www.cnblogs.com/smalldong/p/19126025

Vue Router 是 Vue.js 官方的路由管理器,它与 Vue.js 核心深度集成,让构建单页应用(SPA)变得简单。

一、安装 Vue Router

1. 在 Vue 3 项目中安装

Vue 3 需使用 Vue Router 4+ 版本:

npm install vue-router@4 --save
# 或
yarn add vue-router@4

2. 项目结构准备

创建如下路由相关目录结构:

src/
├── router/
│   └── index.js  # 路由配置文件
├── views/        # 页面级组件
│   ├── Home.vue
│   ├── About.vue
│   └── User.vue
├── App.vue
└── main.js

二、基本配置与使用

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

import { createRouter, createWebHistory } from 'vue-router'
// 导入页面组件
import Home from '../views/Home.vue'
import About from '../views/About.vue'
import User from '../views/User.vue'// 路由规则
const routes = [{path: '/',          // 路径name: 'Home',       // 路由名称(可选)component: Home     // 对应的组件},{path: '/about',name: 'About',component: About},{path: '/user',name: 'User',component: User}
]// 创建路由实例
const router = createRouter({history: createWebHistory(),  // 使用 HTML5 history 模式(无 # 号)// history: createWebHashHistory(), // 使用 hash 模式(带 # 号)routes  // 注入路由规则
})export default router

2. 在 Vue 中引入路由(main.js)

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'  // 导入路由实例// 创建应用并使用路由
createApp(App).use(router)  // 安装路由插件.mount('#app')

3. 路由出口与导航(App.vue)

路由出口是路由组件渲染的位置,导航用于切换路由:

<template><div id="app"><!-- 导航链接:替代 a 标签,避免页面刷新 --><nav><router-link to="/">首页</router-link> |<router-link to="/about">关于</router-link> |<router-link to="/user">用户中心</router-link></nav><!-- 路由出口:匹配的组件将在这里渲染 --><router-view /></div>
</template><style>
/* 激活的导航链接会自动添加 router-link-active 类 */
router-link-active {color: #42b983;font-weight: bold;text-decoration: none;
}
</style>

三、核心功能详解

1. 动态路由(带参数的路由)

用于匹配动态变化的路径(如 /user/123/user/456):

// router/index.js 中添加动态路由
{path: '/user/:id',  // :id 是动态参数name: 'UserDetail',component: () => import('../views/UserDetail.vue')  // 懒加载组件
}

在组件中获取参数(UserDetail.vue):

<template><div><h2>用户详情</h2><p>用户 ID: {{ $route.params.id }}</p></div>
</template><script setup>
// 在 Composition API 中使用
import { useRoute } from 'vue-router'
const route = useRoute()
console.log('用户 ID:', route.params.id)  // 输出动态参数
</script>

2. 嵌套路由

用于实现页面内的子路由(如 /about/team/about/history):

// router/index.js 中配置嵌套路由
{path: '/about',name: 'About',component: About,// 子路由children: [{path: 'team',  // 相对路径,完整路径是 /about/teamcomponent: () => import('../views/AboutTeam.vue')},{path: 'history',  // 完整路径是 /about/historycomponent: () => import('../views/AboutHistory.vue')},{path: '',  // 默认子路由(/about 时显示)component: () => import('../views/AboutIndex.vue')}]
}

在父组件(About.vue)中添加子路由出口:

<template><div><h2>关于我们</h2><!-- 子导航 --><div><router-link to="/about/team">团队</router-link> |<router-link to="/about/history">历史</router-link></div><!-- 子路由出口:子组件将在这里渲染 --><router-view /></div>
</template>

3. 编程式导航

除了 <router-link>,还可以通过代码切换路由:

<template><button @click="goToHome">回到首页</button><button @click="goToUser(123)">查看用户 123</button>
</template><script setup>
import { useRouter } from 'vue-router'
const router = useRouter()// 跳转到首页
const goToHome = () => {router.push('/')  // 通过路径跳转// 或通过路由名称跳转(更推荐,路径变化时无需修改)// router.push({ name: 'Home' })
}// 跳转到带参数的路由
const goToUser = (id) => {router.push({ name: 'UserDetail',  // 使用路由名称params: { id }       // 传递参数})
}// 后退/前进
const goBack = () => router.go(-1)  // 后退一页
const goForward = () => router.go(1)  // 前进一页
</script>

4. 路由参数与查询字符串

  • params:用于动态路由参数(如 /user/:id),必须在路由规则中定义
  • query:用于查询字符串(如 /search?keyword=vue),无需在路由规则中定义
// 跳转到带查询参数的路由
router.push({path: '/search',query: { keyword: 'vue', page: 1 }  // 生成 /search?keyword=vue&page=1
})// 在组件中获取查询参数
import { useRoute } from 'vue-router'
const route = useRoute()
console.log(route.query.keyword)  // 输出 'vue'

5. 路由守卫

用于控制路由的访问权限(如登录验证、权限检查),分为三类:

(1)全局守卫

影响所有路由,定义在 router/index.js 中:

// 全局前置守卫:路由跳转前执行
router.beforeEach((to, from, next) => {// to: 目标路由// from: 来源路由// next(): 继续跳转;next('/login'): 跳转到登录页// 示例:未登录禁止访问个人中心const isLogin = localStorage.getItem('token')if (to.path === '/user' && !isLogin) {return next('/login')  // 未登录跳转到登录页}next()  // 允许跳转
})// 全局后置守卫:路由跳转后执行(无需调用 next())
router.afterEach((to, from) => {// 示例:修改页面标题document.title = to.meta.title || '我的应用'
})

(2)路由独享守卫

只影响当前路由,定义在路由规则中:

{path: '/admin',component: Admin,// 路由独享守卫beforeEnter: (to, from, next) => {// 示例:只有管理员可访问const role = localStorage.getItem('role')if (role === 'admin') {next()  // 允许访问} else {next('/forbidden')  // 无权限跳转到禁止页}}
}

(3)组件内守卫

在组件内部定义,控制组件的路由行为:

<script setup>
import { onBeforeRouteEnter, onBeforeRouteLeave } from 'vue-router'// 进入组件前执行(此时组件实例还未创建,不能用 this)
onBeforeRouteEnter((to, from, next) => {// 可以在这里做权限检查next()
})// 离开组件前执行
onBeforeRouteLeave((to, from, next) => {// 示例:未保存时提示if (confirm('数据未保存,确定离开吗?')) {next()} else {next(false)  // 取消跳转}
})
</script>

6. 路由元信息(meta)

用于存储路由的额外信息(如标题、是否需要登录):

// 定义路由元信息
const routes = [{path: '/user',component: User,meta: { requiresAuth: true,  // 需要登录title: '用户中心'    // 页面标题}},{path: '/public',component: Public,meta: { requiresAuth: false, // 无需登录title: '公共页面'}}
]// 在全局守卫中使用元信息
router.beforeEach((to, from, next) => {// 检查是否需要登录if (to.meta.requiresAuth && !localStorage.getItem('token')) {next('/login')} else {next()}
})// 在后置守卫中设置标题
router.afterEach((to) => {document.title = to.meta.title || '默认标题'
})

7. 路由懒加载

减少初始加载时间,只在访问路由时才加载组件:

// 普通加载(会一次性加载所有组件)
import Home from '../views/Home.vue'// 懒加载(推荐)
const About = () => import('../views/About.vue')// 路由配置中直接使用
const routes = [{path: '/about',component: () => import('../views/About.vue')  // 直接在路由中定义}
]

四、常见问题与最佳实践

  1. history 模式与 hash 模式的区别

    • createWebHistory():URL 无 # 号,需服务器配置支持(避免刷新 404)
    • createWebHashHistory():URL 带 # 号,无需服务器配置,兼容性更好
  2. 避免路由冗余

    • 使用路由名称(name)跳转,而非硬编码路径
    • 提取公共路由配置(如需要登录的路由可统一处理)
  3. 路由模块化:大型项目可拆分路由配置:

    // router/modules/user.js
    export default [{ path: '/user', component: User },{ path: '/user/:id', component: UserDetail }
    ]// router/index.js 中合并
    import userRoutes from './modules/user'
    const routes = [...userRoutes, ...otherRoutes]
    

五、总结

  • 路由的基本配置与使用
  • 动态路由、嵌套路由、编程式导航
  • 路由守卫与权限控制
  • 路由元信息与懒加载

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

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

相关文章

教育网站制作论文邯郸的网站建设

C#是一种面向对象的编程语言&#xff0c;主要用于开发跨平台的应用程序。它是.NET框架的一部分&#xff0c;并且可以在.NET平台上运行。 ASP&#xff08;Active Server Pages&#xff09;是一种用于构建动态Web页面的技术&#xff0c;使用VBScript或JScript作为服务器端脚本语…

漯河市郾城区网站建设wordpress4.7安装

声明&#xff1a;本文源于Centos 7.2系统vim自带的练习教程--vimtutor欢迎阅 读《 V I M 教 程 》 - 版本 1.7 Vim 是一个具有很多命令的功能非常强大的编辑器。限于篇幅&#xff0c;在本教程当中就不详细介绍了。本教程的设计目标是讲述一些必要的基本命令&#xff0c;而掌握…

详细介绍:Java-Spring 入门指南(十七)SpringMVC--Apipostl与RestFul实战测试

详细介绍:Java-Spring 入门指南(十七)SpringMVC--Apipostl与RestFul实战测试pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

高中数列梳理

upd.2025.10.3 高中数学中的数列 本文内容有: \(1.数列意义\) \(2.特殊数列(等差\&等比)\) \(3.数列单调性\) \(4.数列通项方法\) \(5.数列求和方法\) (以下待施工) \(6.数列不等式\) \(ex.差分算子方法\) 1.数列意…

详细介绍:告别 403 Forbidden!详解爬虫如何模拟浏览器头部(User-Agent)

详细介绍:告别 403 Forbidden!详解爬虫如何模拟浏览器头部(User-Agent)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

工程建设造价全过程监督网站中国新冠疫苗接种率

最大矩形 难度&#xff1a;困难 题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例1 输入&#xff1a;matrix [["1","0","1","0",&qu…

Redis Zset的底层秘密:跳表(Skip List)的精妙设计 - 详解

Redis Zset的底层秘密:跳表(Skip List)的精妙设计 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

网站开发部职责搜款网站一起做网店

我们通过将近半天的搜索数据&#xff0c;查到了美国五大湖中优势物种的食物网数据&#xff0c;以Eric伊利湖为例&#xff0c;共包含34各优势物种&#xff0c;相互之间的关系如下图所示&#xff1a; 一、题目 &#xff08;一&#xff09; 赛题原文 2024 MCM Problem A: Reso…

实用指南:TCP连接关闭的“礼貌告别“与“果断离场“:深入解析Linger选项

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

郑州做网站和推广哪家好wordpress 顶部栏

文章目录 ISO文件格式光盘的基本概念光盘种类特点DVDR光盘使用windows调用Linux调用Linux平台下用到的C库:读取设备驱动列表向光驱中写文件 数字存储媒体快速发展的今天&#xff0c;光驱的使用已经不像以前那样普及了。但是在数据备份、安装软件和操作系统、旧设备兼容等领域还…

虚拟商品购物网站源码网站设计参考网址

Nginx是一个高性能的web服务器和反向代理服务器&#xff0c;用于HTTP、HTTPS、SMTP、POP3和IMAP协议。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。 &#xff08;1&#xff09;更快 这表现在两个方面&#xff1a;一方面&#xff0c;在正常情况下&…

网站的字体做多大企业管理咨询类公司

本文实例讲述了Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;前言&#xff1a;laravel创建数据库&#xff0c;实际可以手动创建&#xff0c;如古老的phpmyadmin 等均可以。一、数据库连接&#xff1a…

深入解析:从 CefSharp 迁移至 DotNetBrowser

深入解析:从 CefSharp 迁移至 DotNetBrowser2025-10-04 22:18 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: b…

为什么很多地级市、县级市都把高铁站盖到了郊区呢 —— 以鞍山西站、海城西站为例

为什么很多地级市、县级市都把高铁站盖到了郊区呢 —— 以鞍山西站、海城西站为例每次假期都是要从高铁西站下车,每每如此总是免不得抱怨,毕竟这个郊区的西站无形之中就把回家的距离拉远了快30公里,如果短途做高铁,…

AtCoder Beginner Contest 426 实况记录 + A-D 题解

省流:只有 \(1000\) 分,遗憾离场。 这篇文章用来警示大家不要在比赛中犯相同的错误。 A. OS Versions AI 出来解释一下 \(\texttt{newer than}\) 翻译成“更新”何意味?请判断版本 \(X\) 与版本 \(Y\) 是否相同或更…

提示词攻击如何防范(2025):从 Indirect Prompt Injection 到 RAG 供应链的分层防御实战

2025 年 LLM 首要风险仍是 Prompt Injection / 间接提示词注入(Indirect Prompt Injection, IPI),RAG 供应链与外部工具风险 针对主要AI应用的暴露面。 需要对齐OWASP LLM01 / MITRE ATLAS / NIST AI RMF,并提供 *…

但行好事,莫问前程

但行好事,莫问前程又是一次忘了在第一天前写的考试。 这一个月经历了太多的跌宕起伏:从上一次考试的惊喜,到渐渐出现问题,再到逐渐回归正常的学习,最后在第二次考试之前又出现了大问题。具体问题是什么不好说。 我…

【STM32项目开源】基于STM32的智能养殖场环境监测系统 - 详解

【STM32项目开源】基于STM32的智能养殖场环境监测系统 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

wordpress地址为灰色免费智能seo收录工具

集成联调交付&#xff08;Integrated Joint Debugging and Delivery&#xff09;是软件开发过程中的一个阶段&#xff0c;主要涉及将不同的软件模块或组件整合在一起&#xff0c;并进行联合调试和测试&#xff0c;以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…

前端学习教程-Axios

Axios 是一个基于 Promise 的流行的 HTTP 客户端,用于浏览器和 Node.js 环境,支持 Promise API、拦截请求和响应、转换请求数据和响应数据等功能。 一、安装 Axios使用 npm 或 yarn 安装(适用于 Vue/React 等项目)…