Vue 3 路由跳转全面指南(Composition API + <script setup>)

一、前言:为什么要学习 Vue Router?

在单页面应用(SPA)开发中,路由管理是核心功能之一。Vue Router 作为 Vue.js 官方推荐的路由解决方案,与 Vue.js 深度集成,提供了以下重要功能:

  • 页面无刷新跳转:保持应用状态的同时切换视图
  • 嵌套路由:构建复杂的页面布局结构
  • 路由守卫:控制导航权限和逻辑
  • 动态路由:根据需求加载路由配置
  • 滚动行为控制:提升用户体验

本教程将使用 Vue 3 的 Composition API 和 <script setup> 语法糖,这是目前最推荐的使用方式,代码更简洁,逻辑更清晰。

二、环境准备:创建带路由的 Vue 项目

对于初学者,推荐使用 Vite 创建 Vue 项目:

npm create vite@latest my-vue-app --template vue
cd my-vue-app
npm install vue-router@4
npm run dev

三、基础路由配置详解

1. 创建路由实例

src/router/index.js 中:

import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'// 定义路由配置
const routes = [{path: '/',  // 访问路径name: 'home', // 路由名称(可选但推荐)component: HomeView // 对应的组件},{path: '/about',name: 'about',// 路由懒加载(性能优化)component: () => import('../views/AboutView.vue')}
]// 创建路由实例
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL), // 使用HTML5 history模式routes // 注入路由配置
})export default router

2. 在主文件中安装路由

src/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')

3. 在 App.vue 中添加路由视图

<script setup>
// 这里可以导入需要的组件或逻辑
</script><template><header><!-- 导航链接 --><nav><router-link to="/">首页</router-link><router-link to="/about">关于</router-link></nav></header><!-- 路由匹配的组件将渲染在这里 --><router-view></router-view>
</template><style>
/* 基础样式 */
.router-link-active {font-weight: bold;
}
</style>

四、编程式导航的三种常用方式

1. 字符串路径

最简单直接的跳转方式:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goToAbout = () => {router.push('/about') // 直接使用路径字符串
}
</script><template><button @click="goToAbout">关于我们</button>
</template>

2. 命名路由(推荐)

使用路由配置中的 name 属性,更易于维护:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goToHome = () => {router.push({ name: 'home' }) // 使用路由名称
}
</script>

3. 带参数的对象形式

最灵活的方式,可以添加各种参数:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goToUserProfile = () => {router.push({name: 'user', // 路由名称params: { id: 123 }, // 路径参数query: { tab: 'profile' }, // 查询参数hash: '#contact' // 哈希值})
}
</script>

五、路由传参的三种方法对比

1. params 传参(动态路由)

适用场景:参数是路径的一部分,如 /user/123

路由配置:

{path: '/user/:id', // 动态路径参数name: 'user',component: UserView
}

跳转方法:

router.push({ name: 'user', params: { id: 123 } })

接收参数:

<script setup>
import { useRoute } from 'vue-router'const route = useRoute()
const userId = route.params.id // 123
</script>

2. query 传参(查询参数)

适用场景:可选参数,如 /search?q=vue

跳转方法:

router.push({path: '/search',query: { q: 'vue', page: 1 }
})

接收参数:

<script setup>
import { useRoute } from 'vue-router'const route = useRoute()
const searchQuery = route.query.q // 'vue'
const pageNum = route.query.page // '1' (注意是字符串)
</script>

3. props 传参(最推荐)

优点:组件不直接依赖路由,更易于复用

路由配置:

{path: '/product/:id',name: 'product',component: ProductView,props: true // 将params转为props// 或者使用函数形式更灵活// props: route => ({ id: route.params.id, query: route.query })
}

组件接收:

<script setup>
defineProps({id: {type: String,required: true}
})
</script>

六、导航守卫实战

1. 全局前置守卫(常用做权限控制)

// router/index.js
router.beforeEach((to, from, next) => {const isAuthenticated = checkLoginStatus() // 你的验证逻辑if (to.meta.requiresAuth && !isAuthenticated) {// 如果需要登录且未登录,跳转到登录页next({ name: 'login' })} else if (to.name === 'login' && isAuthenticated) {// 如果已登录又访问登录页,跳转到首页next({ name: 'home' })} else {// 正常放行next()}
})

2. 组件内守卫(处理未保存更改等场景)

<script setup>
import { onBeforeRouteLeave } from 'vue-router'const unsavedChanges = ref(false)// 用户尝试离开时提示
onBeforeRouteLeave((to, from, next) => {if (unsavedChanges.value) {const confirmLeave = confirm('您有未保存的更改,确定要离开吗?')if (confirmLeave) {next()} else {next(false) // 取消导航}} else {next()}
})
</script>

七、常见问题解决方案

1. 路由重复导航错误

router.push('/some-path').catch(err => {if (err.name !== 'NavigationDuplicated') {// 如果不是重复导航错误,抛出其他错误throw err}
})

2. 响应式监听路由参数变化

<script setup>
import { useRoute } from 'vue-router'
import { watch } from 'vue'const route = useRoute()// 监听id参数变化
watch(() => route.params.id,(newId) => {if (newId) {fetchData(newId) // 重新获取数据}},{ immediate: true } // 立即执行一次
)
</script>

八、最佳实践建议

  1. 路由命名:始终为路由设置 name 属性,便于维护
  2. 懒加载:路由组件尽量使用 () => import() 语法
  3. 参数传递:优先使用 props 方式,提高组件复用性
  4. 导航守卫:合理使用,避免过度复杂的逻辑
  5. 错误处理:对可能失败的导航添加错误处理

九、总结

通过本教程,你应该已经掌握了:

✅ Vue Router 的基本配置方法
✅ 编程式导航的各种使用场景
✅ 三种路由传参方式及适用情况
✅ 导航守卫的实际应用
✅ 常见问题的解决方案

路由是 Vue 单页面应用的核心,建议初学者多动手实践,尝试不同的配置和跳转方式。遇到问题时,可以查阅 Vue Router 官方文档 获取最新信息。

如果有任何疑问,欢迎在评论区留言讨论!

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

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

相关文章

JavaScript基础-常用的键盘事件

一、前言 在网页开发中&#xff0c;用户交互 是非常重要的一环。除了鼠标操作之外&#xff0c;键盘事件也是前端开发中最常见的交互方式之一。 JavaScript 提供了多个用于监听和处理键盘输入的事件&#xff0c;例如 keydown、keyup 和 keypress。掌握这些事件可以帮助我们实现…

解决 Android 项目下载依赖缺失导致的问题

解决 Android 项目下载依赖缺失导致的问题 在项目根目录下的 build.gradle 文件中增加下面的代码&#xff1a; buildscript {repositories {...maven {url "https://maven.aliyun.com/repository/jcenter"}maven {url "https://maven.aliyun.com/repository/c…

Clang Code Model: Error: The clangbackend executable “D:\Soft\Qt5.12.12\Tool

Qt Creator->菜单->帮助->关于插件->C>去掉ClangCodeModel勾选->重启Qt Creator 参考&#xff1a;【问题解决】Qt Creator 报错&#xff1a;Clang Code Model: Error: The clangbackend executable_qt clang code model-CSDN博客

高频面试之12 HBase

12 HBase 文章目录 12 HBase12.1 HBase存储结构12.2 HBase的写流程12.3 HBase的读流程12.6 HBase的合并12.7 RowKey设计原则12.8 RowKey如何设计12.9 HBase二级索引原理 12.1 HBase存储结构 架构角色&#xff1a; 1&#xff09;Master 实现类为HMaster&#xff0c;负责监控集群…

Vue3 + TypeScript + Element Plus 表格实例null检查方法

代码分析&#xff1a; // 表格实例对象 const tableRef ref<ElTableExtendedInstance | null>(null); // 表格列配置列表 const columnConfigs ref<IColumnConfig[]>([{ prop: "index", label: "序号", width: 60 },{ prop: "batchNo&…

Neo4j常见语法-unwind

unwind的用法&#xff08;UNWIND 是一个强大的操作符&#xff0c;用于将集合&#xff08;列表、数组&#xff09;展开为多行数据。它类似于关系型数据库中的 UNNEST 或 LATERAL JOIN&#xff0c;是 Cypher 查询中处理集合数据的核心工具&#xff09; &#xff08;1&#xff09;…

JavaEE-Spring-IoCDI

Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. ⽤⼀句更具体的话来概括Spring, 那就是: Spring 是包含了众多⼯具⽅法的 IoC 容器 容器是⽤来容纳…

CppCon 2017 学习:10 Core Guidelines You Need to Start Using Now

C.45: 不要定义一个仅仅初始化成员变量的默认构造函数&#xff0c;而是使用类内成员初始化器 如果你有一个默认构造函数&#xff0c;它的唯一作用是给成员变量赋默认值&#xff08;如 1、2、3&#xff09;&#xff0c;这更清晰、简单的方法是直接在成员变量声明时使用类内初始…

Java并发编程实战 Day 28:虚拟线程与Project Loom

【Java并发编程实战 Day 28】虚拟线程与Project Loom 文章内容 在“Java并发编程实战”系列的第28天&#xff0c;我们将聚焦于**虚拟线程&#xff08;Virtual Threads&#xff09;**和 Project Loom&#xff0c;这是 Java 在高并发场景下的一次重大革新。随着现代应用对性能和…

Linux系统移植⑦:uboot启动流程详解-board_init_r执行过程

Linux系统移植⑦&#xff1a;uboot启动流程详解-board_init_r执行过程 在uboot中&#xff0c;board_init_r 是启动流程中的一个关键函数&#xff0c;负责完成板级&#xff08;board-specific&#xff09;的后期初始化工作。以下是关于该函数的详细说明&#xff1a; 1. 函数作…

OpenStack入门体验

1.1云计算概述 相信大家都听到很多的阿里云、腾讯云、百度云等等这些词,那到底什么是云计算?云 计算又能做什么? 1.1.1什么是云计算 云计算(cloud computing)是一种基于网络的超级计算模式,基于用户的不同需求,提供所需的资源,包括计算资源、存储资源、网络资源等。云计算…

RK 安卓10/11平台 HDMI-IN 调试

这篇文章我们介绍一下在安卓9、10、11的版本上&#xff0c;rk平台的hdmi-in功能是如何实现的&#xff0c;下篇文章我们再介绍安卓12之后的版本有了什么变化。希望对在rk平台调试hdmi-in功能的朋友有一些帮助。 目录 &#xff08;1&#xff09;概述 &#xff08;2&#xff09;…

MongoDB学习记录(快速入门)

MongoDB核心 基础概念 数据库 数据库是按照数据结构来组织、存储和管理数据的仓库。在内存中运行的&#xff0c;一旦程序运行结束或者计算机断电&#xff0c;程序运行中的数据都会丢失。我们需要将一些程序运行的数据持久化到硬盘之中&#xff0c;以确保数据的安全性。数据库…

阿里一面:微服务拆分需要考虑什么因素?

要拆分微服务&#xff0c;首先我们要了解微服务拆了会有什么问题&#xff1f;怎么合理拆服务&#xff1f; 拆分服务会带来什么问题&#xff1f; 举个电商系统下单扣库存的例子。 对于单体应用&#xff0c;通讯在进程内部进行&#xff0c;下单方法调用扣库存方法&#xff0c;…

3D高斯泼溅和4D高斯

1.高斯函数 想象你往平静的湖水里扔一块石头&#xff0c;水波会以石头落点为中心向外扩散&#xff0c;形成一个逐渐衰减的圆形波纹。高斯函数的形状就和这个波纹类似&#xff1a; 中心最高&#xff08;石头落点&#xff0c;波峰最强&#xff09;。越往外&#xff0c;高度&…

comfyui插件和comfyui mac安装

mac comfyui安装包 ComfyUI.zip&#xff0c;官方最新0.3.40&#xff0c;如果后续官方有迭代&#xff0c;可以直接通过git更新源码升级 comfyui插件下载&#xff0c;解压放到custom_nodes目录下&#xff0c;包含 comfyui-animatediff-evolved&#xff08;视频插件&#xff09; 和…

面试题SpringCloud

SpringCloud有哪些特征&#xff1f; 分布式/版本化配置服务注册与发现路由服务到服务的调用负载均衡断路器领导选举和集群状态分布式消息传递 SpringCloud核心组件&#xff1f; Eureka 注册中心Ribbon 客户端负载均衡Hystrix&#xff1a; 服务容错处理Feign:声明式Rest客户端Zu…

ASR-PRO语音识别可能出现的问题

ASR-PRO语音识别可能出现的问题 4月份有一天刷到牢大/爱丽丝语音自开关灯设备&#xff0c;心血来潮&#xff0c;博主也是浅尝了一下&#xff0c;由此也总结一下&#xff0c;实现此项目会出现的问题。 在实现爱丽丝开关灯模块时ASRPRO语音识别可能出现的问题如下&#xff1a; …

苍穹外卖--缓存菜品Spring Cache

Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单地加一个注解&#xff0c;就能实现缓存功能。 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; ①EHCache ②Caffeine ③Redis 常用注解…

个人简历制作MarkDown模板

MarkDown制作个人简历的模板放在了github上&#xff0c;大家如有需求&#xff0c;请自取&#xff1a; https://github.com/QQQQQQBY/ResumeTemplate 介绍一下此模板的特点&#xff1a; &#x1f338;个人面试期间使用的、整理的简历格式&#xff0c;现在分享给大家。 ⭐简历采…