Vue-Router模式和钩子的用法


Posted in Javascript onFebruary 28, 2018

上一篇主要写了一下vuer-router的基本使用,可以说解决温饱了,下面就再来点下午茶吧

模式

vue-router中的模式选项主要在router实例化的时候进行定义的,如下

const router = new VueRouter({
 mode: 'history', // 两种类型history 还有 hash
   routes: routes // 可以缩写成routes
})

有两种模式可供选择,history 和 hash,大致对比一下,

模式 优点 缺点
hash 使用简单、无需后台支持 在url中以hash形式存在,不会传到后台
history 地址明确,便于理解和后台处理 需要后台配合

hash模式对于后台来讲就是一个url,因为地址中的hash值是不会传到后台的,所以服务器端做一个根地址的映射就可以了。
history模式最终的路由都体现在url的pathname中,这部分是会传到服务器端的,因此需要服务端对每一个可能的path值都作相应的映射。或者采用模糊匹配的方式进行映射。

除此之外,history模式下,如果后端不是一对一的进行映射,而是模糊匹配的话,那么就要注意一下404的情况了。这个时候就需要在前端router中定义404页面了。

404路由的定义

由于router本身的匹配是从上到下的,如果在前面找到了匹配的路由,就跳转了。因此可以直接在最后添加404的路由,如下

let routerConfig = [{
  path: '/pages',
  component: App,
  children: [{
    path: 'demo/step1/list',
    component: coupon,
    name: 'coupon-list',
    meta: {
      title: '红包'
    }
  }]
}, {
  path: '*',
  component: NotFound,
  name: 'notfound',
  meta: {
    title: '404-页面丢了'
  }
}]

在前面匹配不到的时候,* 代表全部,就是都指向404页面

路由钩子

路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的,靠。。好拗口啊。

总体来讲vue里面提供了三大类钩子

1、全局钩子
2、某个路由独享的钩子
3、组件内钩子

全局钩子

顾名思义,全局钩子全局用,使用如下

const router = new VueRouter({
  mode: 'history',
  base: __dirname,
  routes: routerConfig
})

router.beforeEach((to, from, next) => {
  document.title = to.meta.title || 'demo'
  if (!to.query.url && from.query.url) {
    to.query.url = from.query.url
  }
  next()
})

router.afterEach(route => {
})

某个路由独享钩子

就像说的一样,给某个路由单独使用的,本质上和后面的组件内钩子是一样的。都是特指的某个路由。不同的是,这里的一般定义在router当中,而不是在组件内。如下

const router = new VueRouter({
 routes: [
  {
   path: '/foo',
   component: Foo,
   beforeEnter: (to, from, next) => {
    // ...
   },
   beforeLeave: (to, from, next) => {
    // ...
   }
  }
 ]
})

组件内钩子

首先看一下官方定义:

你可以在路由组件内直接定义以下路由导航钩子

  1. beforeRouteEnter
  2. beforeRouteUpdate (2.2 新增)
  3. beforeRouteLeave

路由组件!路由组件!路由组件!重要的事情说三遍,大家一定要注意这里说的是“路由组件”,而路由组件!== 组件,路由组件!== 组件,路由组件!== 组件!之前一直没注意这点,然后在子组件里面傻乎乎的调钩子函数发现一直没用。。。

我们先来看一下什么是路由组件?

路由组件:直接定义在router中component处的组件

也就是说router中定义的入口vue文件之外的组件,是没有钩子函数的,也就不用说使用了。但是如果你使用了并不会报错,只是没反应。(本想画个图的,太懒了。。。自己理解理解吧,很好理解的)

这里再回头看下这个路由内钩子是怎么用的,很简单和data、method平级的方法

beforeRouteLeave(to, from, next) {
  // ....
  next()
},
beforeRouteEnter(to, from, next) {
  // ....
  next()
},
beforeRouteUpdate(to, from, next) {
  // ....
  next()
},
computed: {},
method: {}

三种路由钩子中都涉及到了三个参数,这里直接上官方介绍吧

  1. to: Route: 即将要进入的目标 路由对象
  2. from: Route: 当前导航正要离开的路由
  3. next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
  4. next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
  5. next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
  6. next(‘/') 或者 next({ path: ‘/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

模式和钩子基本就到这了,有需要的可以在仔细研究一个官当的文档。以上仅是个人学习使用过程的一些理解,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript中声明函数的方法及调用函数的返回值
Jul 22 Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
Feb 12 Javascript
JQuery EasyUI的一些常用组件
Jul 12 jQuery
Angular4 中内置指令的基本用法
Jul 31 Javascript
浅谈vue-router 路由传参的方法
Dec 27 Javascript
vue 之 .sync 修饰符示例详解
Apr 21 Javascript
vue-router 源码实现前端路由的两种方式
Jul 02 Javascript
VUE v-model表单数据双向绑定完整示例
Jan 21 Javascript
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 Javascript
angularjs 获取默认选中的单选按钮的value方法
Feb 28 #Javascript
angularJS的radio实现单项二选一的使用方法
Feb 28 #Javascript
vue cli 全面解析
Feb 28 #Javascript
js实现动态改变radio状态的方法
Feb 28 #Javascript
快速了解vue-cli 3.0 新特性
Feb 28 #Javascript
jquery radio 动态控制选中失效问题的解决方法
Feb 28 #jQuery
vue.js根据代码运行环境选择baseurl的方法
Feb 28 #Javascript
You might like
php下保存远程图片到本地的办法
2010/08/08 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
Google排名中的10个最著名的 JavaScript库
2010/04/27 Javascript
JavaScript高级程序设计 客户端存储学习笔记
2011/09/10 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
在Python中用has_key()方法查找键是否存在的教程
2015/05/21 Python
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
数以千计的折扣工业产品:ESE Direct
2018/05/20 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
创建学习型党组织实施方案
2014/03/29 职场文书
情况说明书格式范文
2014/05/06 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
内勤岗位职责
2015/02/10 职场文书
心灵点滴观后感
2015/06/02 职场文书
环保宣传语大全
2015/07/13 职场文书
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL