前言

  路由这个概念最早在后端出现,随后前后端分离,直至当今的单页面应用,路由也在一直发生变化。本文来总结一下路由变化和vue-router中的路由模式区别相关知识点。

正文

  1、什么是前端路由

  (1)后端路由阶段

  早期的页面都是由html页面在服务端渲染的,服务端直接返回给客户端渲染好的html页面供展示,一个页面对应一个URL,首先向服务端请求对应的URL,服务器根据此URL去匹配对应的controller,最终生成html页面返回给客户端。这种方法有利于SEO的优化,但是这种页面html和数据逻辑混合在一块,开发人员开发维护起来困难。

  (2)前后端分离路由阶段

  随着Ajax的出现,由了前后端分离的开发方式,后端只负责逻辑处理和返回数据,前端只负责通过ajax将数据渲染到页面。

  (3)单页面应用阶段

  其实SPA最主要的特点就是在前后端分离的基础上加了一层前端路由.也就是前端来维护一套路由规则。

  2、vue-router 提供了 hash 和 history 两种路由模式

  vue-router的作用就是通过改变URL,在不重新请求页面的情况下,更新页面视图。简单的说就是,虽然地址栏的地址改变了,但是并不是一个全新的页面,而是之前的页面某些部分进行了修改。要想解决上面的问题,前提需要知道浏览器window的history对象和location对象的hash属性(详情见 history对象详解),这两个对象分别存在页面路径跳转,但是页面不刷新的功能。

  (1)hash模式

  对应了location对象的hash属性,vue-router 默认 hash 模式,使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。

  location.hash 对应 "(#)" 后面的字符串,比如:https://xxx.cn/xxx/6844904062698127367#heading  对应的值为 "#heading",后面 hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。另外每次  hash  值的变化,还会触发 hashchange  这个事件,通过这个事件我们就可以知道 hash 值发生了哪些变化。然后我们便可以监听 hashchange 来实现更新页面部分内容的操作:比如下面的代码监听一个网页 hash 值变化

        window.addEventListener('hashchange', function() {
console.log('The hash has changed!')
}, false);

  当网页点击返回或者前进的时候,hash值会发生变化,会触发上面的hashchange事件并打印。

  (2)history模式

  如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面,同时还有popstate 事件来监听state变化,这样地址栏中路径就没有了"#",但是当用户使用了刷新等操作的时候,浏览器会给服务器发送请求,为了避免这种情况出现,所以这个实现需要服务端的支持,需要把所有路由都重定向到根路由,这里省略服务端的配置。

        window.addEventListener('popstate', function() {
console.log('The state has changed!')
}, false);

  (3)两种模式的比较

同:hash和history都是属于浏览器自身的特性,Vue-router只是利用了这两个特性(通过调用浏览器接口)来实现前端路由。

不同:hash模式 会在浏览器的URL中加入'#',而HTM5History就没有'#'号,URL和正常的URL一样。

  history比于直接修改hash主要有以下优势:a、pushState设置的新URL可以是与当前URL同源的任意URL;而hash只可修改#后面的部分,故只可设置与当前同文档的URL;b、pushState设置的新URL可以与当前URL一模一样,这样也会把记录添加到栈中;而hash设置的新值必须与原来不一样才会触发记录添加到栈中;c、pushState通过stateObject可以添加任意类型的数据到记录中;而hash只可添加短字符串,且pushState可额外设置title属性供后续使用。

写在最后

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。



vue--前端路由及vue-router两种模式的更多相关文章

  1. Vue设置路由跳转的两种方法: <router-link :to="..."> 和router.push(...)

    一.<router-link :to="..."> to里的值可以是一个字符串路径,或者一个描述地址的对象.例如: // 字符串 <router-link to= ...

  2. vue路由的两种模式配置以及history模式下面后端如何配置

    vue路由的两种模式配置以及history模式下面后端如何配置 1.hash ——即地址栏URL中的#符号.hash 虽然出现URL中,但不会被包含在HTTP请求中,对后端完全没有影响,因此改变has ...

  3. vue学习指南:第十一篇(详细) - Vue的 路由 第一篇 ( router )

    一.路由的配置 路由  vue-router 1. 什么是路由? 路由相当于一个配置对象 路由:就是我们通过不同的url访问不同的内容,通过angular.js 可以实现多视图的单页,现在流行的单页面 ...

  4. 四、vue前端路由(轻松入门vue)

    轻松入门vue系列 Vue前端路由 七.Vue前端路由 1. 路由的基本概念与原理 后端路由 前端路由 实现简单的前端路由 vue-router基本概念 2. vue-router的基本使用 基本使用 ...

  5. 前端路由两种模式:hash、history

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  6. 前端路由的两种模式: hash 模式和 history 模式

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  7. 前端路由的两种模式:hash(#)模式和history模式(转)

    随着 ajax 的使用越来越广泛,前端的页面逻辑开始变得越来越复杂,特别是spa的兴起,前端路由系统随之开始流行. 从用户的角度看,前端路由主要实现了两个功能(使用ajax更新页面状态的情况下): 记 ...

  8. vue-router路由加载两种模式

    路由安装npm install --save vue-router 安装完成后,打开package.json,如果看到这个"vue-router": 版本号, 就代表安装成功了   ...

  9. vue-router的两种模式的区别

    众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. ### hash模式 hash模式背后的原理是`onhashchange`事件,可以在`window ...

随机推荐

  1. WebGPU图形编程(2):构建一个单色的三角形<学习引自徐博士教程>

    非常兴奋,我坚持了下来,开始更新我的第二篇博客,还是关于WebGPU的,我在学习过程中,对这项技术非常感兴趣,即使它非常抽象,难以理解,因为我看到未来Web3D的发展,WebGPU会成为主流技术,学习 ...

  2. 多线程-线程间通信-多生产者多消费者问题解决(notifyAll)

    1 package multithread4; 2 3 /* 4 * 生产者,消费者. 5 * 6 * 多生产者,多消费者的问题. 7 * 8 * if判断标记,只有一次,会导致不该运行的线程运行了. ...

  3. IEEE754浮点数表示法

    IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985)是一套规定如何用二进制表示浮点数的标准.就像"补码规则"建立了二进制位和正负数的一一对应关系一样,IEE ...

  4. 从服务端生成Excel电子表格(GcExcel + SpreadJS)

    在服务端生成Excel电子表格,除了使用 Node.js + SpreadJS 外,葡萄城官方推荐使用 SpreadJS + GcExcel.该方案不仅能够解决批量绑定数据源并导出Excel.批量修改 ...

  5. HTML横向二级导航

    图片素材没有发,就一个logo还有一个Nav背景图. 效果 HTML <!DOCTYPE html> <html lang="zh-cn"> <hea ...

  6. Python安装pip时, 报错:zipimport.ZipImportError: can't decompress data; zlib not available

    解决办法: 1.安装依赖zlib.zlib-devel 2.重新编译安装Python 具体步骤: 1 到python安装目录下,运行./configure 2 编辑Modules/Setup文件 vi ...

  7. vue+element ui中select组件选择失效问题原因与解决方法

    codejing 2020-07-10 09:13:31  652  收藏 分类专栏: Web Vue Element UI 版权 .当表单form赋完值后,如果后续又对form中某一属性值进行操作如 ...

  8. Android 三种菜单(Menu)的实现

    感谢大佬:https://blog.csdn.net/chileme/article/details/82944764 一.常用方法 java onCreateOptionsMenu(Menu men ...

  9. 模仿UIApplication单例

    要求:程序一启动就创建创建对象.创建的对象只能通过share的⽅方式获取对象.不能够进行alloc 操作,当执⾏行alloc时, 程序发生崩溃 1.程序一启动的时候就创建对象.当类被加载到内存的时候就 ...

  10. svn中.a文件无法上传解决方法

    项目导入后总是缺少.a文件,如shareSDK.a,libPushSDK.a,libbaidumapapi.a等 解决方法 方法一.修改SVN配置文件 通过终端直接打开配置文件: open  ~/.s ...