vue-router

Posted 郭郭郭牧鑫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-router相关的知识,希望对你有一定的参考价值。

Vue Router 是 Vue.js官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。包含的功能有:

  • 嵌套的路由/视图表
  • 模块化的、基于组件的路由配置
  • 路由参数、查询、通配符
  • 基于 Vue.js 过渡系统的视图过渡效果
  • 细粒度的导航控制
  • 带有自动激活的 CSS class 的链接
  • html5 历史模式或 hash 模式,在 IE9 中自动降级
  • 自定义的滚动条行为

路由守卫

路由守卫分为3种
1、全局

论跳转任意的路由都会触发

全局的路由守卫有

router.beforeEach 进入之前
router.beforeResolve 在beforeRouteEnter调用之后调用
router.afterEach 进入路由之后

2、组件

道跳转该组件才会触发钩子函数


组件级的路由守卫有

beforeRouteEnter 路由跳转进入之前
beforeRouteUpdate 页面参数更新时触发
beforeRouteLeave 离开这个路由触发

3、单个

进入这个路由,才会触发相应的钩子函数


单个路由独享的守卫

beforeEnter只有使用这个路由,才能触发钩子函数


有三个参数:

to,from,next
to和from是将要进入和将要离开的路由对象。
next()这个参数是个函数,且必须调用,否则不能进入路由(页面空白)。
next() 进入该路由
next(false): 取消进入路由,url地址重置为from路由地址(也就是将要离开的路由地址)。 next 跳转新路由,当前的导航被中断,重新开始一个新的导航

 

两种路由模式

vue-router通过hashHistory interface两种方式实现前端路由,更新视图但不重新请求页面”是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有两种方式

那么,我们要选择用哪种方式呢?

一、选择

1.  hash ——即地址栏URL中的#符号
比如这个URL:http://www.baidu.com/#/hello, hash 的值为#/hello。它的特点在于:hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变hash不会重新加载页面。
2.  history ——利用了HTML5 History Interface 中新增的pushState() 和replaceState() 方法。
(需要特定浏览器支持)这两个方法应用于浏览器的历史记录站,在当前已有的back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改是,虽然改变了当前的URL,但你浏览器不会立即向后端发送请求。

在vue-router中,它提供mode参数来决定采用哪一种方式,选择流程如下:

mode 参数:

  • 默认hash

  • history 注:如果浏览器不支持history新特性,则采用hash方式

二、404 错误
1、hash模式下,仅hash符号之前的内容会被包含在请求中,如 http://www.abc.com, 因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回404错误;
2、history模式下,前端的url必须和实际向后端发起请求的url 一致,如http://www.abc.com/book/id 。如果后端缺少对/book/id 的路由处理,将返回404错误。

编程式/组件式(声明式)导航

编程式的导航,即js控制跳转

 

声名式编程式
<router-link :to="...">this.$router.push('home')
// 字符串
this.$router.push('home')

// 对象
this.$router.push({ path: 'home' })

// 命名的路由
this.$router.push({ name: 'user', params: { userId: 123 }})

// 带查询参数,变成 /register?plan=private
this.$router.push({ path: 'register', query: { plan: 'private' }})

还有另外一种跳转 

声名式编程式
<router-link :to="..." replace>this.$router.replace('home')

跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。

 

如何传参(优缺点)

方式 发送 接收
querythis.$router.push({path:"/index",query:{id:1}}) this.$route.query.id
params this.$router.push({name:"/Index",params:{id:1}})this.$route.params.id

区别:

1、当用户刷新当前页面的时候,参数就会消失。使用params不在路由配参数跳转,只有第一次进入页面参数有效,刷新页面参数就会消失。

2、query可以使用path和name传参和跳转页面,而params只能使用name传参和跳转页面。

3.params在浏览器地址栏中不显示参数名称,query在浏览器地址栏中显示参数名称

 

还有一种传参,是动态路由传参
你可以在一个路由中设置多段“路径参数”,对应的值都会设置到 $route.params 中。例如:

模式匹配路径$route.params
/user/:username/user/evan{ username: ‘evan’ }
/user/:username/post/:post_id/user/evan/post/123{ username: ‘evan’, post_id: ‘123’ }

以上是关于vue-router的主要内容,如果未能解决你的问题,请参考以下文章

百行代码带你入门 vue-router!

typescript vue-router代码分裂

Vue-Router

vue2.0有哪些变化

Vue.js 生态之vue-router

Vue.js 生态之Vue-router 基础三