96SEO 2026-05-02 06:07 19
单页面应用早Yi成为主流。而在Vue.js的世界里vue-router无疑是连接各个页面模块的“血管”。你是否曾遇到过点击按钮页面纹丝不动?或者刷新一下页面辛辛苦苦传递的参数就人间蒸发了?对于新手而言,从Vue2过渡到Vue3,路由跳转的语法变化和逻辑差异往往让人头大。今天我们就抛开那些晦涩的理论,用Zui接地气的方式,彻底搞懂Vue2和Vue3中的路由跳转实战技巧。

在开始跳转之前,我们得先确保“路”是铺好的。无论你用的是Vue2还是Vue3,路由配置的核心思想没变,但写法上却有着明显的代沟。
我们习惯使用new VueRouter来实例化路由,并且需要显式调用Vue.use。这就像老式手机需要装SIM卡一样,是必不可少的步骤。而到了Vue3,随着Composition API的兴起,一切dou变得geng加函数式。我们不再依赖this,而是通过createRouter和createWebHistory来构建路由实例。
下面这段代码展示了两个版本在配置文件中的具体差异,请仔细对比:
// Vue2 经典写法
import Vue from 'vue'
import VueRouter from 'vue-router'
// 必须注册插件
Vue.use
const routes =
const router = new VueRouter({
mode: 'history', // 这里是关键,去除URL中的#
routes
})
export default router
// Vue3 现代写法
import { createRouter, createWebHistory } from 'vue-router'
const routes =
// 使用工厂函数创建实例
const router = createRouter({
history: createWebHistory, // 环境变量处理基础路径
routes
})
export default router
kan到区别了吗?Vue3的配置geng加纯粹,完全拥抱了ES模块的标准。配置好之后千万别忘了在App.vue中留个“坑”——也就是标签,否则你的组件将无处安放。
对于简单的页面导航,比如导航栏菜单,我们Zui常用的是声明式跳转。这就像是在HTML里写标签一样简单,但功Neng却强大得多。
跳转无非就是告诉浏览器“去哪儿”。你Ke以直接告诉它路径,也Ke以给它一个代号。使用name的好处是一旦路径修改,你不需要改动所有引用它的地方,只要名字不变,跳转依然有效。
首页
关于我们
首页
关于我们
2. 携带参数:Query vs Params
实际业务中,我们经常需要带着数据跳转,比如点击用户列表中的某个人,跳转到详情页并带上用户ID。这里就有两个“派系”:query和params。
Query参数: 拼接在URL后面刷新页面不会丢失,适合传递非敏感的、公开的数据。
Params参数: 依赖路由配置,URLkan起来geng干净(/user/123。但在Vue Router中,Ru果只传params而不配path,刷新后参数可Neng会丢失,这点新手极易踩坑!
查kan张三
查kan用户ID 1001
三、 编程式导航:用代码掌控全局
Ru果说router-link是自动挡,那编程式导航就是手动挡,geng适合需要逻辑判断的场景。比如“用户登录成功后跳转”、“表单提交后跳转”等。
this.$router时代
在Vue2的组件内部,我们通过this.$router来访问路由实例,进而调用push或replace。
// Vue2 编程式跳转示例
export default {
methods: {
goHome {
// 简单跳转
this.$router.push
},
goUserDetail {
// 带Query参数
this.$router.push({
path: '/user',
query: { id: 1001, name: '李四' }
})
},
goUserParams {
// 带Params参数
this.$router.push({
name: 'User',
params: { id: 1001 }
})
},
replacePage {
// 替换当前页,用户点“返回”按钮不会回退到这里
this.$router.replace
},
goBack {
// 后退一步
this.$router.go
}
}
}
2. Vue3的Composition API革命
进入Vue3,特别是使用了语法糖后thisYi经不复存在。我们需要从vue-router中引入useRouter钩子来获取路由实例。这不仅是语法的改变,geng是逻辑复用思维的转变。
// Vue3 编程式跳转示例
import { useRouter } from 'vue-router'
const router = useRouter
const jumpToHome = => {
router.push
}
const jumpWithQuery = => {
router.push({
path: '/user',
query: { id: 2001, status: 'active' }
})
}
const jumpWithParams = => {
router.push({
name: 'User',
params: { id: 2001 }
})
}
// 替换跳转
const replaceToLogin = => {
router.replace
}
特别提醒: hen多刚从Vue2转过来的朋友,在Vue3的setup中习惯性地打出this.$router,结果报错“Cannot read property 'push' of
四、 接收参数:如何获取传递的数据?
跳转过去了参数也带了那在目标页面怎么拿出来呢?这又是一个Vue2和Vue3差异明显的领域。
1. Vue2的this.$route
在Vue2中,我们通过this.$route来获取当前路由信息,包括query和params。
// Vue2 接收参数
export default {
mounted {
// 获取Query参数
const queryId = this.$route.query.id
const queryName = this.$route.query.name
// 获取Params参数
const paramsId = this.$route.params.id
console.log
}
}
2. Vue3的useRoute
同理,Vue3中我们需要使用useRoute钩子。
// Vue3 接收参数
import { useRoute } from 'vue-router'
import { onMounted } from 'vue'
const route = useRoute
onMounted => {
// 获取Query
const id = route.query.id
// 获取Params
const userId = route.params.id
console.log
})
五、 进阶实战:监听路由变化与参数丢失问题
这里有一个经典的面试题,也是实战中极易遇到的Bug:从/user/1跳转到/user/2,页面组件复用了并没有销毁重建,导致mounted钩子不再触发,页面数据不geng新。
解决这个问题的办法是监听路由对象的变化。
在Vue2中,我们使用watch属性:
// Vue2 监听路由
export default {
watch: {
'$route' {
// 当路由发生变化时重新请求数据
console.log
this.getUserData
}
},
methods: {
getUserData {
// 模拟API请求
console.log
}
}
}
在Vue3中,我们使用watch函数配合useRoute
// Vue3 监听路由
import { watch } from 'vue'
import { useRoute } from 'vue-router'
const route = useRoute
watch(
=> route.params,
=> {
// params发生变化时触发
console.log
getUserData
},
{ deep: true } // 深度监听
)
2. Params参数刷新丢失的真相
hen多新手抱怨:“我明明传了params,为什么一刷新页面就没了?”
原因hen简单:params传参Ru果不体现在URL的path中,那么刷新页面时Vue Router会重新根据URL匹配路由,而URL中没有包含这些参数,自然就丢失了。
解决方案:
方案A: Ru果数据允许,改用query传参,因为query是拼在URL后面的,刷新不丢失。
方案B: Ru果必须用params且不想暴露在URL,Ke以在跳转前将数据存入localStorage或sessionStorage,刷新时从存储中读取。
方案C: 在路由定义中明确加上path: '/user/:id',这样参数就成为了URL的一部分,刷新自然存在。
路由跳转不仅仅是“去哪儿”,还有“Neng不Neng去”。比如用户没登录Neng不Neng进个人中心?这就需要用到导航守卫。
1. 全局前置守卫通常我们在路由配置文件中定义全局守卫,拦截所有路由跳转。
// 全局导航守卫
router.beforeEach => {
// to: 即将进入的目标路由
// from: 当前导航正要离开的路由
// next: 必须调用该方法来 resolve 这个钩子
const token = localStorage.getItem
// 假设我们给需要权限的路由加了 meta: { requireAuth: true }
if {
// 需要登录但未登录,强制跳转到登录页
next
} else {
// 放行
next
}
})
2. 组件内守卫
有时候我们只想在某个特定组件内Zuo拦截,比如用户正在编辑表单,误触了返回按钮,这时候需要提示“未保存,确定离开吗?”。
Vue2写法:
export default {
beforeRouteLeave {
if ) {
next
} else {
next // 取消跳转
}
}
}
Vue3写法:
import { onBeforeRouteLeave } from 'vue-router'
onBeforeRouteLeave => {
if ) {
next
} else {
next
}
})
七、 常见报错与避坑指南
Zui后我们来几个新手Zui容易遇到的“坑”。
1. 跳转后页面空白,没有任何报错?请检查你的App.vue。是不是忘记写了?这个标签是路由组件的出口,没有它,组件渲染了你也kan不见。
2. History模式下刷新404?
当你设置了mode: 'history' 或 createWebHistory ,URL会变得hen漂亮。但是当你直接访问http://localhost:8080/user/123或刷新页面时浏览器会向服务器请求这个路径。而服务器并没有配置这个路径,就会返回404。
解决: 需要在服务端配置“回退”策略,所有找不到的路径dou指向index.html,让Vue Router接手处理。
有时候我们需要访问根路径/时自动跳转到/home,或者旧链接跳转到新链接,这时候Ke以用redirect。
const routes =
Vue路由跳转kan似简单,实则暗藏玄机。从Vue2到Vue3,变的只是语法糖,不变的是对单页面应用路由机制的理解。掌握了pushparamsquery以及导航守卫这些核心武器,你就Neng在构建复杂前端应用时游刃有余。希望这篇实战指南Neng帮你少走弯路,早日成为Vue高手。下次遇到路由跳转不生效,别慌,回头kankan这篇文章,答案就在其中!
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback