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

实用指南:Vue编程式路由导航

一、前言

在 Vue 开发中,页面跳转通常使用 <router-link> 标签实现声明式导航:

首页

但很多时候,我们需要在 JavaScript 代码中控制跳转,比如:

  • 表单提交成功后跳转到列表页
  • 登录成功后自动跳转到首页
  • 权限校验失败时返回登录页
  • 点击按钮、监听事件、异步操作后跳转

这些场景就需要使用 编程式导航(Programmatic Navigation)

本文将带你: ✅ 全面掌握 router.push()replace()go() 等核心 API
✅ 理解命名路由、参数传递、跳转选项
✅ 避开常见坑点,写出健壮的跳转逻辑
✅ 提供完整代码示例,拿来即用

二、什么是编程式导航?

类型说明示例
声明式导航通过模板标签跳转<router-link to="/home">
编程式导航通过 JavaScript 控制跳转this.$router.push('/home')

编程式导航 = 在 JS 中调用 router 实例的方法来跳转

三、核心 API 详解

1. router.push(location, onComplete?, onAbort?)

用途:向浏览器历史栈添加一条新记录,点击“后退”可以返回。

适用场景:普通页面跳转,如“提交 → 成功页”。

✅ 基本用法
// 1. 字符串路径
this.$router.push('/home')
// 2. 带参数的对象
this.$router.push({path: '/user',query: { id: 123 } // ?id=123
})
// 3. 使用命名路由(推荐)
this.$router.push({name: 'UserProfile',params: { id: 456 } // /user/456
})

⚠️ 注意:使用 params 时,必须使用 name,不能用 path,否则参数会丢失!

✅ 完整对象格式
this.$router.push({name: 'Detail',params: { id: 1 },query: { from: 'list' },hash: '#section2',// 跳转完成后的回调(可选)onComplete: (to) => {console.log('跳转成功', to)},// 跳转被中断的回调(可选)onAbort: (from) => {console.log('跳转中断', from)}
})

2. router.replace(location, onComplete?, onAbort?)

用途替换当前历史记录,不会新增记录,点击“后退”不会回到原页面。

适用场景:登录页、404 页面、表单防重复提交。

✅ 基本用法
// 替换当前页面
this.$router.replace('/login')
// 对象形式
this.$router.replace({path: '/404',query: { msg: '页面不存在' }
})

效果相当于:

this.$router.push({ path: '/login', replace: true })

3. router.go(n)

用途:在浏览器历史记录中前进或后退 n 步。

适用场景:自定义“返回上一页”按钮、多步表单导航。

✅ 基本用法
// 后退一步
this.$router.go(-1)
this.$router.back() // 等价写法
// 前进一步
this.$router.go(1)
this.$router.forward() // 等价写法
// 后退两步
this.$router.go(-2)
// 如果历史记录不足,会静默失败(不报错)
this.$router.go(-100) // 无效果

四、实战场景示例

场景1:表单提交后跳转


<script>
export default {data() {return {username: ''}},methods: {async handleSubmit(e) {e.preventDefault()try {await submitForm(this.username) // 模拟提交// 跳转到成功页this.$router.push({path: '/success',query: { user: this.username }})} catch (err) {alert('提交失败')}}}
}
</script>

场景2:登录成功后跳转

async login() {const { data } = await api.login(this.form)if (data.success) {// 保存 tokenlocalStorage.setItem('token', data.token)// 跳转到首页this.$router.push('/dashboard')// 或跳转到来源页const from = this.$route.query.redirect || '/dashboard'this.$router.push(from)}
}

场景3:权限校验拦截

// 全局守卫中使用
router.beforeEach((to, from, next) => {if (to.meta.requiresAuth && !isLogin()) {// 未登录,跳转登录页,并记录来源next({path: '/login',query: { redirect: to.fullPath }})} else {next()}
})

<script>
export default {mounted() {// 登录成功后跳回原页面const redirect = this.$route.query.redirect || '/home'this.$router.replace(redirect)}
}
</script>

场景4:自定义返回按钮


<script>
export default {methods: {goBack() {// 方式1:直接后退this.$router.back()// 方式2:带判断的后退if (window.history.length > 1) {this.$router.go(-1)} else {// 如果没有上一页,跳转到首页this.$router.push('/')}}}
}
</script>

五、高级技巧与注意事项

1. 跳转失败的处理

router.push() 返回一个 Promise,可以捕获错误:

this.$router.push('/home').catch(err => {// 避免 "NavigationDuplicated" 错误(重复跳转同一页面)if (err.name !== 'NavigationDuplicated') {console.error(err)}
})

常见错误:NavigationDuplicated,表示重复跳转到同一路由。

2. 防止重复跳转

// 封装安全跳转方法
function safePush(router, location) {return router.push(location).catch(err => {if (err.name === 'NavigationDuplicated') returnthrow err})
}
// 使用
safePush(this.$router, '/home')

3. 在 Composition API 中使用

Vue 3 的 setup 中无法使用 this,需通过 useRouter 获取:

import { useRouter } from 'vue-router'
export default {setup() {const router = useRouter()const goToHome = () => {router.push('/home')}return { goToHome }}
}

六、push vs replace 对比

方法是否新增历史记录后退能否返回适用场景
push()✅ 是✅ 可以普通跳转
replace()❌ 否❌ 不行登录、404、防重复

口诀

  • 想让用户能“返回” → 用 push
  • 不想让用户“返回” → 用 replace

七、总结

API作用是否新增记录典型场景
router.push()跳转到新页面✅ 是表单提交、页面导航
router.replace()替换当前页面❌ 否登录、404、重定向
router.go(n)前进/后退 n 步-自定义返回按钮
router.back()后退一页-返回上一页
router.forward()前进一步-前进一页

最佳实践

  1. 优先使用 name + params 跳转,更稳定
  2. 复杂跳转使用对象形式
  3. 捕获跳转错误,避免白屏
  4. 在 Composition API 中使用 useRouter

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.jsqmd.com/news/63073/

相关文章:

  • Ubuntu 22.04 与 24.04 常用操作命令
  • 【Java】String
  • 拒绝智商税!2025最新学习机榜单发布,十大热门机型横向对比,一看就懂
  • 2025年12月留学生求职陪跑服务推荐榜:哪家更贴合专业背景定制
  • 2025年留学生求职机构排名推荐指南 途鸽求职榜首领跑赛道
  • 网络安全的守护与利器:r/netsec 月度技术讨论与工具分享
  • 重组蛋白表达纯化技术流程解析:从基因到蛋白的精准制备
  • 拒绝“中间商赚差价”!2025南京静音舱源头工厂综合实力排名发布:声博士Soundbox断层领先
  • 软件测试的分类1(含黑盒测试、白盒测试、Alpha测试、Beta测试、灰盒测试)
  • 全国中医师承选哪个机构靠谱?——在对比多家机构后最终选择了阿虎医考师承
  • 全国中医师承选哪个机构靠谱?——理性对比后选择了阿虎医考师承
  • 小白必看!CAD 超详细安装教程
  • 深入解析:探索JavaScript前端开发:开启交互之门的神奇钥匙(二)
  • 2025.12.5——2蓝
  • Node-RED:5分钟快速上手:安装与环境安装
  • 个人电脑本地私有知识库推荐:访答软件全解析
  • Java中的反射
  • 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案(或者说使用缓存的过程中有没有遇到什么问题,怎么应对的)
  • 12月5日总结 - 作业----
  • Markdown 使用教程
  • 2025年行业内排行前列的清障车源头厂家推荐排行榜单,黄牌清障车/前四后八平板拖车/8吨清障车/重载清障车/二手拖车清障车企业口碑推荐
  • 参与GenAI黑客马拉松六个月的实战心得
  • 写给自己看,自己写自己
  • MySQL性能优化
  • 2025.12.5——1蓝
  • 子弹射击
  • “我爱你,也讨厌你。”—— 一位研究者与他的AI伙伴的创作随想
  • 2025年现浇楼板施工验收标准排行,你家合格吗?混凝土现浇/钢筋混凝土现浇/现浇楼梯/现浇楼板现浇楼板多少钱一平推荐榜单
  • 安装Vivado
  • GoldenDB数据库工程师培训(中兴GoldenDB金融级/运营商级分布式数据库) 原创