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

学习笔记:Vue Router 编程式导航详解

1. 核心概念重述

        在 Vue.js 应用中,除了使用 <router-link> 进行声明式路由跳转外,还可以通过调用路由器实例的方法实现编程式导航。这种方式允许我们在逻辑代码中动态控制页面跳转,适用于按钮点击、表单提交、权限判断等场景。

2. 编程式导航方法概览

方法对应声明式功能描述
router.push()<router-link :to="...">导航到新路径,并在浏览器历史中添加一条记录
router.replace()<router-link :to="..." replace>导航并替换当前历史记录,不会保留原页面
router.go(n)——在历史记录中前进或后退 n 步

3. 详解三大导航方法

 router.push(path)

用于导航到新的 URL,并将该记录添加到浏览器的 history 栈中。

使用方式:
// 字符串路径
router.push('/users/eduardo')// 路径对象
router.push({ path: '/users/eduardo' })// 命名路由 + 参数(推荐)
router.push({ name: 'user', params: { username: 'eduardo' } })// 查询参数
router.push({ path: '/register', query: { plan: 'private' } }) // /register?plan=private// Hash 片段
router.push({ path: '/about', hash: '#team' }) // /about#team

⚠️ 注意:如果提供了 path,则 params 会被忽略。必须使用 name 或手动拼接路径来传递参数。

const username = 'eduardo'// ❌ 错误:path 与 params 不兼容
router.push({ path: '/user', params: { username } }) // 结果为 /user// ✅ 正确:使用 name
router.push({ name: 'user', params: { username } }) // /user/eduardo// ✅ 正确:手写完整 path(需自行编码)
router.push({ path: `/user/${username}` })
返回 Promise
router.push({ name: 'user', params: { username: 'eduardo' } }).then(() => {console.log('导航成功')}).catch(err => {if (err.name !== 'NavigationFailure') {console.error('导航失败:', err)}})

这使得我们可以处理导航异常(如重复导航、权限不足等)。

✅ router.replace(path)

push 类似,但不向 history 添加新记录,而是替换当前条目

使用方式:
// 方式一:直接调用 replace
router.replace('/home')// 方式二:在 push 中设置 replace: true
router.push({ path: '/home', replace: true })

应用场景:登录后跳转首页,用户按“返回”不应回到登录页。

✅ router.go(n)

在浏览器历史栈中移动指定步数。

router.go(1)   // 前进一步,相当于 forward()
router.go(-1)  // 后退一步,相当于 back()
router.go(3)   // 前进三步
router.go(-100)// 若历史不足,则静默失败

        Vue Router 模拟了 window.history.go(n) 的行为,无论使用何种 history 模式(hash、history、abstract),均可正常工作。

4. 在组件中的访问方式

选项式 API(Options API)

通过 this.$router 访问:

<script>
export default {methods: {goToUser() {this.$router.push({ name: 'user', params: { username: 'alice' } })},goBack() {this.$router.go(-1)}}
}
</script>

组合式 API(Composition API)

使用 useRouter() 钩子:

<script setup>
import { useRouter } from 'vue-router'const router = useRouter()function navigateToHome() {router.push('/')
}function replaceAndGo() {router.replace({ path: '/dashboard', query: { from: 'login' } })
}
</script>

5. 参数传递规则总结

类型写法示例URL 输出
path 字符串router.push('/path')/user/eduardo/user/eduardo
path + query{ path: '', query: {} }{ path: '/search', query: { q: 'vue' } }/search?q=vue
path + hash{ path: '', hash: '' }{ path: '/info', hash: '#top' }/info#top
name + params{ name: '', params: {} }{ name: 'user', params: { username: 'bob' } }/user/bob(需路由定义支持)
❌ path + params不支持{ path: '/user', params: { id: 1 } }/user(params 被忽略)

💡 推荐:优先使用 命名路由 + params,可自动进行 URL 编码,避免手动处理特殊字符。

6. 路由跳转对比图表示意

7. 常见问题与最佳实践

❓为什么 params 在 path 下无效?

        因为 params 只有在通过 name 匹配路由时才生效。Vue Router 需要根据路由名称查找对应的模式(如 /user/:username)才能正确填充参数。

✅ 正解:

router.push({ name: 'user', params: { username: 'john' } })

❌ 错误:

router.push({ path: '/user', params: { username: 'john' } }) // params 被丢弃

🛠️ 如何安全地拼接带参数的路径?

使用模板字符串并配合 encodeURIComponent

const username = '张三'
router.push(`/user/${encodeURIComponent(username)}`)

或者更推荐的方式是使用 name params,由框架自动编码。

✅ 编程式导航的优势

  • 条件跳转(如登录验证)

  • 表单提交后跳转

  • 异常处理后跳转错误页

  • 动态构建目标路径

  • 支持 Promise 处理导航结果

8. 总结归纳

方法是否新增 history 记录是否可返回典型用途
push()✅ 是✅ 可返回正常跳转
replace()❌ 否❌ 不可返回登录跳转、防止回退
go(n)——控制前进后退自定义导航逻辑

9. 知识点

  • $router 与 useRouter():在组件中访问路由器实例的方式,选项式用 this.$router,组合式用 useRouter()

  • 命名路由与 params:通过 name params 实现安全参数传递,避免手动编码 URL。

  • history 操作机制pushreplacego 分别对应浏览器 history 的三种操作,模拟其行为且跨模式兼容。

http://www.dtcms.com/a/410782.html

相关文章:

  • Centos 7 创建ftp 权限最大支持上传删减
  • 哪家公司设计网站学用php做网站
  • 租用网站服务器网站改版 升级的目的是什么意思
  • java 项目docker 部署。
  • 【知识库文档】数据预处理PDF文档转成MD格式(gptpdf )
  • Java 高效实现 PowerPoint 转 PDF:不依赖Office
  • 新奇特:神经网络烘焙坊(下),万能配方的甜蜜奥义
  • 翁恺老师C语言基础教程代码学习
  • 天津建设网站的公司哪家好云南昆明网站建设价格
  • 网站开发需求书中山网络推广公司
  • RPC在分布式存储系统中的应用
  • 交互式手机网站网站建设功能
  • 07.容器监控
  • 学做网站哪里学郑州一网网站建设
  • react中redux的使用详细说明
  • 解码Android 系统蓝牙音频全流程
  • 做网站的文案wordpress 标签 修改
  • 疑难bug之正确处理InterruptedException
  • 【学习日记】[SSM]
  • 告别Print: Python调试入门,用PDB高效找Bug
  • 解决跨浏览器兼容性问题:CSS Flexbox布局在IE中的错位BUG
  • LeetCode 0611.有效三角形的个数:双指针
  • js 网站校验网络营销推广的优势
  • 好的响应式网站注册域名免费永久
  • 无人机图传模块——让飞行视界无界限
  • Redis有序集合:高效排行榜实现方案
  • 专门做化妆的招聘网站新手要如何让网站被收录
  • Gli appunti di scienza dei dati[5]
  • 【mdBook】1 安装
  • 唐山网站建设费用廊坊市做网站的公司有哪些