vue-router路由模式详解(小结)


Posted in Javascript onAugust 26, 2019

一、路由模式解析

要讲vue-router的路由模式,首先要了解的一点就是路由是由多个URL组成的,使用不同的URL可以相应的导航到不同的位置。

如果有进行过服务器开发或者对http协议有所了解就会知道,浏览器中对页面的访问是无状态的,所以我们在切换不同的页面时都会重新进行请求。而实际使用vue和vue-router开发就会明白,在切换页面时是没有重新进行请求的,使用起来就好像页面是有状态的,这是什么原因呢。

这其实是借助了浏览器的History API来实现的,这样可以使得页面跳转而不刷新,页面的状态就被维持在浏览器中了。

vue-router中默认使用的是hash模式,也就是会出现如下的URL:vue-router路由模式详解(小结),URL中带有#号

我们可以用如下代码修改成history模式:

import Vue from 'vue'
import Router from 'vue-router'
import Main from '@/components/Main'
Vue.use(Router)

export default new Router({
 mode: 'history',
 routes: [
 {
  path: '/',
  component: Main
 }
 ]
})

这样子URL中的#号就被去除了。

实际上存在三种模式:

Hash: 使用URL的hash值来作为路由。支持所有浏览器。

History: 以来HTML5 History API 和服务器配置。参考官网中HTML5 History模式

Abstract: 支持所有javascript运行模式。如果发现没有浏览器的API,路由会自动强制进入这个模式。

二、两种模式的区别

1、hash模式

hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件:

window.onhashchange = function(event){
 console.log(event.oldURL, event.newURL);
 let hash = location.hash.slice(1);
 document.body.style.color = hash;
}

上面的代码可以通过改变hash来改变页面字体颜色,虽然没什么用,但是一定程度上说明了原理。

更关键的一点是,因为hash发生变化的url都会被浏览器记录下来,从而你会发现浏览器的前进后退都可以用了,同时点击后退时,页面字体颜色也会发生变化。这样一来,尽管浏览器没有请求服务器,但是页面状态和url一一关联起来,后来人们给它起了一个霸气的名字叫前端路由,成为了单页应用标配。

我们写个简单的方法来测试一下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <div>测试一下</div>
 <script type="text/javascript">
  window.onhashchange = function(event){
   console.log(event.oldURL,event.newURL)
   let hash = location.hash.slice(1);
   document.body.style.color = hash;
  }
 </script>
</body>
</html>

vue-router路由模式详解(小结)

vue-router路由模式详解(小结)

并且通过浏览器的前进、后退页面均可以变化。

网易云音乐,百度网盘就采用了hash路由,看起来就是这个样子:

http://music.163.com/#/friend
https://pan.baidu.com/disk/home#list/vmode=list

 2、history路由

随着history api的到来,前端路由开始进化了,前面的hashchange,你只能改变#后面的url片段,而history api则给了前端完全的自由

history api可以分为两大部分:切换和修改

(1)切换历史状态

包括back、forwardgo三个方法,对应浏览器的前进,后退,跳转操作,有同学说了,(谷歌)浏览器只有前进和后退,没有跳转,嗯,在前进后退上长按鼠标,会出来所有当前窗口的历史记录,从而可以跳转(也许叫跳更合适):

history.go(-2);//后退两次
history.go(2);//前进两次
history.back(); //后退
hsitory.forward(); //前进

(2)修改历史状态

包括了pushState、replaceState两个方法,这两个方法接收三个参数:stateObj,title,url

history.pushState({color:'red'}, 'red', 'red')

window.onpopstate = function(event){
 console.log(event.state)
 if(event.state && event.state.color === 'red'){
  document.body.style.color = 'red';
 }
}

history.back();

history.forward();

通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原,这里的页面状态就是页面字体颜色,其实滚动条的位置,阅读进度,组件的开关的这些页面状态都可以存储到state的里面。

通过history api,我们丢掉了丑陋的#,但是它也有个毛病:

不怕前进,不怕后退,就怕刷新,f5,(如果后端没有准备的话),因为刷新是实实在在地去请求服务器的。

在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它玩的,所以没有问题。但是在history下,你可以自由的修改path,当刷新时,如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。

(3)popstate实现history路由拦截,监听页面返回事件

当活动历史记录条目更改时,将触发popstate事件。

1、如果被激活的历史记录条目是通过对 history.pushState() 的调用创建的,或者受到对 history.replaceState() 的调用的影响,popstate事件的state属性包含历史条目的状态对象的副本。

2、需要注意的是调用 history.pushState() 或 history.replaceState() 用来在浏览历史中添加或修改记录,不会触发popstate事件;

只有在做出浏览器动作时,才会触发该事件,如用户点击浏览器的回退按钮(或者在Javascript代码中调用history.back())

我们测试一下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 <div>测试一下</div>
 <script type="text/javascript">
  if (window.history && window.history.pushState) {
   window.onpopstate = function(event) {
    console.log("location: " + document.location + ", state: " + JSON.stringify(event.state));
    //window.history.go(1)
    //window.history.back()
   };
   
   //window.addEventListener("popstate", function(e) {
   // window.location = 'http://www.baidu.com';
   //}, false);
   
   !function() {
    var state = {
     title: "title",
     url: "#"
    };
    window.history.pushState(state, "title", "#");
   }();
  }
 </script>
</body>
</html>

刷新时不打印,刷新多次,再后退,每次都有,直到为null

vue-router路由模式详解(小结)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Gird组件 Part-3:范例RSSFeed Viewer
Mar 10 Javascript
JavaScript 异步调用框架 (Part 6 - 实例 &amp; 模式)
Aug 04 Javascript
javascript继承之为什么要继承
Nov 10 Javascript
使用jquery实现放大镜效果
Sep 02 Javascript
javascript中sort()的用法实例分析
Jan 30 Javascript
VUEJS实战之利用laypage插件实现分页(3)
Jun 13 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 Javascript
使用cropper.js裁剪头像的实例代码
Sep 29 Javascript
在vue中使用express-mock搭建mock服务的方法
Nov 07 Javascript
npm 语义版本控制详解
Sep 10 Javascript
echarts实现晶体球面投影的实例教程
Oct 10 Javascript
vue+moment实现倒计时效果
Aug 26 #Javascript
原生js实现针对Dom节点的CRUD操作示例
Aug 26 #Javascript
Moment.js实现多个同时倒计时
Aug 26 #Javascript
vue获取验证码倒计时组件
Aug 26 #Javascript
seajs和requirejs模块化简单案例分析
Aug 26 #Javascript
JavaScript实现身份证验证代码实例
Aug 26 #Javascript
基于vue、react实现倒计时效果
Aug 26 #Javascript
You might like
星际实力自我测试
2020/03/04 星际争霸
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php curl_init函数用法
2014/01/31 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
分析在Python中何种情况下需要使用断言
2015/04/01 Python
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
Python实现的科学计算器功能示例
2017/08/04 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
python实现简单flappy bird
2018/12/24 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
解释一下钝化(Swap out)
2016/12/26 面试题
公司新员工的演讲稿注意事项
2014/01/01 职场文书
一体化教学实施方案
2014/05/10 职场文书
文明社区申报材料
2014/08/21 职场文书
小学生勤俭节约演讲稿
2014/08/28 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技