原文网址:Vue--Router--路由模式--种类/区别/原理_IT利刃出鞘的博客-CSDN博客

简介

说明

本文介绍Vue Router的三种路由模式,包括原理、优缺点、使用场景。

Router三种路由模式

  1. hash:使用URL的hash值作为路由。

    1. Vue的默认路由模式。
    2. 支持所有浏览器。
  2. history:使用History API:pushState() 和 replaceState() 方法。
    1. HTML5之后支持。
  3. abstract:支持所有 JavaScript 运行环境(包括Node.js 服务器端)
    1. 如果发现没有浏览器的 API,路由会自动强制进入这个模式。

官网

HTML5 History 模式 | Vue Router

API 参考 | Vue Router

hash模式

说明

根据MDN:Location 接口的 hash 属性返回一个 USVString,包含URL标识中的 '#' 和 后面URL片段标识符,被称为 hash。

例如:http://www.abc.com/#/article,hash 的值为 #/article。

  1. 第一个#后的所有字符,都会被浏览器解读为位置标识符,它只用来表示页面位置(一个锚点)。这些字符都不会被发送到服务器端。
  2. 单单改变#后的部分,浏览器只会滚动到相应位置,不会重新加载网页。
  3. 每次改变#后的部分,都会在浏览器的访问历史中增加一个记录。见:此文
  4. window.location.hash 表示 hash 值。此属性可读可写。
  5. 使用 window.addEventListener("hashchange", fun) 可以监听 hash 的变化

原理

Vue的Router的hash模式的原理是:使用 window.addEventListener("hashchange", fun) 监听 hash 的变化,hash变化之后,根据这个新的hash找到相应的页面,然后更新视图。

优点

  1. 后端不需要额外配置

    1. 原因:#及之后的字符不会被发到服务器
    2. 例如:http://www.abc.com/#/article在Vue Router中有对应的路由,而我直接输入了http://www.abc.com/#/article/id,Vue Router中没有对应路由。
      1. 此时并不会报错。
      2. 原因:只有http://www.abc.com会被发送到服务器。

缺点

  1. 不美观(url中带了个“#”)

history模式

说明

window.history 提供了两类API:

  1. 跳到某个浏览记录:back(), forward(), go(),
  2. 添加/修改历史记录:pushState(), replaceState()

这些方法都只修改当前url,不会向后端发起请求。

原理

  1. Vue监听url改变这个事件:window.addEventListener('popstate', fun);
  2. Vue在切换页面时,使用pushState(), replaceState()来修改当前的url
  3. 切换页面之后,popstate事件被触发,调用相应的回调函数更新视图

优点

  1. 美观(url中不带“#”)

缺点

  1. 后端需要额外配置

    1. 原因:当直接访问一个url时会请求后端。例如:刷新页面、直接通过url访问
    2. 例如:http://www.abc.com/article在Vue Router中有对应的路由,而我直接输入了http://www.abc.com/article/id,Vue Router中没有对应路由。
      1. 此时会报错:404。
      2. 原因:后端没有相应的接口。
    3. 解决方案:
      1. 后端(Apache 或 Nginx)进行简单的路由配置
      2. Vue配置路由的 404 页面。例如:
        1. const router = new Router({mode: 'history',routes: [{ path: '*', component: NotFoundComponent }]
          })

abstract模式

说明

abstract 模式针对的是没有浏览器环境的情况。

比如 Weex 客户端开发,内部是没有浏览器 API 的,那么 Vue-Router 自身会对环境做校验,强制切换到 abstract 模式。

如果在 Vue-Router 的配置项中不写 mode 的值,在浏览器环境下会默认启用 Hash 模式,在移动客户端下使用 abstract 模式。

原理

通过 stack 和 index 2个变量,模拟出浏览器的历史调用记录。

hash和history的区别

hash history
是否有“#”
是否设置后端 不需要 需要
设置的URL

本文档的url。

hash 只可修改 # 后面的部分,因此只能设置与当前 URL 同文档的 URL。

任意同源url。

pushState() 设置的新 URL 可以是与当前 URL 同源的任意 URL。

是否添加到历史记录 hash 设置的新值必须与原来不一样才会触发动作将记录添加到栈中。 pushState() 设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中。
记录的数据 短字符串。

任意类型的数据。

pushState() 通过 stateObject 参数可以添加任意类型的数据到记录中

是否可设置title 不能。 pushState() 可额外设置 title 属性供后续使用。

模式的切换

以切换为history模式为例。

vue2.0.x 的写法

// vue2.0.x 写法比较简单
import Router from 'vue-router'
Vue.use(Router)
const router = new Router({mode: "history",routes
})

vue3.0x 的写法

// 在最顶部引入createWebHistory
import { createRouter, createWebHistory,  } from 'vue-router'  const routes = [{path: '/',name: 'Home',component: Home},{ .... }
]const router = createRouter({history: createWebHistory(),  // 在调用 createWebHistory() 即可routes
})

使用场景

hash模式

若没特殊需求,用默认的hash模式即可。

history模式

如果想路径中没有#,则选择history模式

abstract模式

如果是非浏览器环境,则用abstract模式。

Vue--Router--路由模式--种类/区别/原理相关推荐

  1. Vue Router路由模式的区别 进程线程的区别

    Vue Router hash模式和history模式的区别 hash模式url里面永远带着#号,我们在开发当中默认就是hash模式. 那么什么时候需要用到history模式呢? 肯定是用户觉得#号太 ...

  2. Vue 学习(十、 Vue Router - 路由插件 和 Vue 的插件原理)

    文章目录 一.Vue Router - 路由插件 1. 安装 Vue Router 2. Vue Router 路由的基本使用 3. 设置 router-link 4. 编程式路由 5. 路由嵌套 6 ...

  3. Vue Router 路由管理

    文章目录 Vue Router 路由管理 概述 安装 简单使用 定义2个组件 定义路由信息 支持路由 使用路由 动态路由 配置动态路由 配置404 限制动态参数 嵌套路由 命名路由 编程式导航 简单使 ...

  4. 【Vue】相关生态——Vue Router路由

    Vue Router路由 基本使用 带参数的动态路由匹配 捕获所有路由或404 Not found 路由 嵌套路由 编程式导航 重定向和别名 将props传递给路由组件 不同的历史模式 进阶 导航守卫 ...

  5. Vue Router路由常用功能总结

    Vue Router路由常用功能总结 一.前言 二.安装 1. vueCLI安装 2. npm安装 三.路由配置及使用: 1. 基本配置: 2. 动态路由: 3. 嵌套路由: 四.编程式的导航 五.重 ...

  6. vue-router路由模式的区别和原理

    vue-router路由模式 一.vue-router前端路由有两种模式,hash模式和history模式 hash模式 就是指 url 后面的 # 号以及后面的字符.每次刷新页面时是直接更改 # 后 ...

  7. 路由器NAT模式和路由模式的区别

    1.信息交换不同 路由器NAT模式不进行路由信息交换,路由模式可以进行路由信息的交换. 2.原理不同 路由器NAT模式是指内网与外网经过了网络地址转换,它们之间是不进行路由交换的. 路由器的路由模式是 ...

  8. Vue.js 3.0 学习笔记(十一)Vue Router路由

    一.使用Vue Router 1.HTML页面使用路由 <!DOCTYPE html> <html> <head><meta charset="UT ...

  9. vue router 路由跳转方法概述

    一.概述 使用到Vue的项目,我们最常见使用的就是Vue配套的Vue Router库. 那么在平日开发中,有多少种跳转路由的方法? 二.跳转方法 1.使用router-link标签 使用router- ...

最新文章

  1. 自定义曲线_完美动力小课堂:AnimationCurve(动画曲线编辑) 如何使用?
  2. Android应用框架浅析
  3. java定义说话方法_类定义的基本形式_Java语言程
  4. HDU1225 字符串
  5. php编写九九乘法表
  6. C#按指定长度分割字符串
  7. css 网站素装 追忆过去
  8. 盒子阴影(HTML、CSS)
  9. 注册表删除chrome插件
  10. 擦地机器人毕业设计_救援机器人毕业设计
  11. SQL Server中CTE的另一种递归方式-从底层向上递归
  12. linux系统安装snort,linux下SNORT安装.doc
  13. 清北学堂模拟day4 捡金币
  14. MATLAB深度学习工具箱汇总
  15. Android设备给Android设备刷固件
  16. PHP常用函数总结(一):
  17. pyecharts可视化画3D动态地球仪,世界地图,中国地图。
  18. php 省市区县 四级联动,GitHub - yupoxiong/region: ThinkPHP5/6省市区(县)街道四级联动扩展...
  19. 全球及中国生物制药产业盈利现状及竞争格局展望报告2021-2027年
  20. VScode常用插件下载

热门文章

  1. 魔百盒之小型家庭NAS
  2. 如何在 Linux 中更新 Flatpak 软件包
  3. undefined is not a function
  4. Scala语言学习:Scala是什么?
  5. 海康大华宇视等等安防监控摄像头转成WebRTC流实现Web浏览器超低延迟无插件直播新方案...
  6. React 函数组件导出自定义方法的办法说明
  7. (九) 基于cadence 617 电流镜仿真对比 笔记记录
  8. 佩伯尔幻像_幻像类型提高了编译时的安全性
  9. LeetCode 69: Sqrt(x) 求根号x(牛顿迭代法和二分查找法)
  10. grub 2.0安装linux,grub2引导安装kali2.0及安装ibus拼音输入法