简说vue-router原理

  • vue-router原理
    • hash模式
      • 实现原理
        • 改变描点
        • 监听描点变化
    • history模式
      • 实现原理
        • 改变url
        • 监听url变化
    • abstract
    • hash 和 history 模式有什么区别?
      • url 不一样
      • 原理不同
    • 其他
    • 总结
    • 扩展 history 出现404错误

vue-router原理

vue-router是vue项目的重要组成部分,用于构建单页应用。

单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。

路由的本质就是建立url和页面之间的映射关系。

实现原理:vue-router 的原理就是更新视图而不重新请求页面

更多详细内容,请微信搜索“前端爱好者戳我 查看

vue-router 可以通过 mode 参数设置为三种模式:hash 模式、history 模式、abstract 模式

hash模式

hash模式是vue-router的默认模式。

hash指的是url描点,当描点发生变化的时候,浏览器只会修改访问历史记录,不会访问服务器重新获取页面。

因此可以监听描点值的变化,根据描点值渲染指定dom。

实现原理
改变描点

可以通过location.hash = "/hashpath"的方式修改浏览器的hash值。

监听描点变化

可以通过监听hashchange事件监听hash值的变化。

window.addEventListener('hashchange', () => {
   const hash = window.location.hash.substr(1)
   // 根据hash值渲染不同的dom
})

当调用 push 时,把新路由添加到浏览器访问历史的栈顶。

使用 replace 时,把浏览器访问历史的栈顶路由替换成新路由 hash 的值(等于 url 中 # 及其以后的内容)。

浏览器是根据 hash 值的变化,将页面加载到相应的 DOM 位置。

锚点变化只是浏览器的行为,每次锚点变化后依然会在浏览器中留下一条历史记录,可以通过浏览器的后退按钮回到上一个位置。

history模式

hash模式下,url可能为以下形式:

http://localhost:8080/index.html#/book?bookid=1

上面的url中既有#又有?,会让url看上去很奇怪,因此,可以使用history模式,在此模式下,url会如下面所示:

http://localhost:8080/book/1
实现原理
改变url

H5的history对象提供了pushStatereplaceState两个方法,当调用这两个方法的时候,url会发生变化,浏览器访问历史也会发生变化,但是浏览器不会向后台发送请求。

// 第一个参数:data对象,在监听变化的事件中能够获取到
// 第二个参数:title标题
// 第三个参数:跳转地址
history.pushState({}, "", '/a')
监听url变化

可以通过监听popstate事件监听history变化,也就是点击浏览器的前进或者后退功能时触发。

window.addEventListener("popstate", () => {
    const path = window.location.pathname
    // 根据path不同可渲染不同的dom
})

abstract

不涉及和浏览器地址的相关记录。

流程跟 hash 模式一样,通过数组维护模拟浏览器的历史记录栈 服务端下使用。

使用一个不依赖于浏览器的浏览器历史虚拟管理后台

hash 和 history 模式有什么区别?

url 不一样

hash路由再地址栏URL上有“#”,而history路由没有;

原理不同

hash 是通过 hashchange 进行监听历史栈的变化,将浏览器历史记录栈的路由替换为新的 hash
浏览器会根据 hash 变化,将页面加载到相应的 DOM 位置

history 是通过 window.onpopstate 对地址栏进行监听 ,使用 pushState()、replaceState() 对历史记录栈修改,从而实现 url 对加载无需跳转页面。

他有一个问题就是,刷新页面会走后端路由,所以需要服务端的辅助来完成,避免 url 无法匹配到资源时能返回页面。

其他

hash支持一些低版本的浏览器,而history不支持。

总结

  • hash路由在地址栏URL上有#,用 window.location.hash 读取。而history路由没有,会好看一点
  • 我们进行回车刷新操作,hash路由会加载到地址栏对应的页面,而history路由一般就404报错了( 刷新是网络请求,没有后端准备时会报错 )。
  • hash路由支持低版本的浏览器,而 history路由是HTML5新增的API
  • hash的特点在于它虽然出现在了URL中,但是不包括在http请求中,所以对于后端是没有一点影响的,所以改变hash不会重新加载页面,所以这也是单页面应用的必备。
  • history运用了浏览器的历史记录栈,之前有 back,forward,go 方法,之后在HTML5中新增了 pushState()和replaceState() 方法,它们提供了对历史记录进行修改的功能,不过在进行修改时,虽然改变了当前的URL,但是浏览器不会马上向后端发送请求。
  • history的这种模式需要后台配置支持 。比如:当我们进行项目的主页的时候,一切正常,可以访问,但是当我们刷新页面或者直接访问路径的时候就会返回404 【那是因为在history模式下,只是动态的通过js操作window.history来改变浏览器地址栏里的路径,并没有发起http请求,但是当我直接在浏览器里输入这个地址的时候,就一定要对服务器发起http请求,但是这个目标在服务器上又不存在,所以会返回404

扩展 history 出现404错误

1:hash 模式下,仅hash符号之前的内容会被包含在请求中,如http://www.abc.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回404错误。

2:history模式下,前端的URL必须和实际向后端发起请求的URL一致。如htttp://www.abc.com/book/id。如果后端缺少对/book/id 的路由处理,将返回404错误

问题解决:

出现404错误的解决办法:网上介绍的很多方法都不行。安装URL重写模块,配置重写规则,统一指向index.html.或者直接把url重写生成的web.config文件直接放置到网站根目录下即可。

参考文档

  • https://v3.router.vuejs.org/zh/installation.html
  • https://www.cnblogs.com/ifon/p/15881223.html
  • https://zhuanlan.zhihu.com/p/584365427
  • https://www.php.cn/faq/490021.html
  • https://segmentfault.com/a/1190000023662742

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/246197.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32的基本定时器注意点

本文介绍了STM32基本定时器3个重要的寄存器PSC、ARR、CNT,以及缓冲机制和计数细节。 基本定时器的框图 预分频器寄存器(TIMx_PSC)可以在运行过程中修改它的数值,新的预分频数值将在下一个更新事件时起作用。因为更新事件发生时,会把 TIMx_PS…

Flink 流处理流程 API详解

流处理API的衍变 Storm:TopologyBuilder构建图的工具,然后往图中添加节点,指定节点与节点之间的有向边是什么。构建完成后就可以将这个图提交到远程的集群或者本地的集群运行。 Flink:不同之处是面向数据本身的,会把D…

java实现冒泡排序及其动图演示

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复这个过程直到整个数列都是按照从小到大的顺序排列。 具体步骤如下: 比较相邻的两个元素,如果前…

三层交换的原理

一.三层交换技术 1.什么是三层交换机 要实现vlan间通信,就需要路由,解决办法要么是二层交换机加路由器形成单臂路由,要么就是直接使用三层交换机。 ①什么是单臂路由: ②单臂路由实现不同vlan间通信的原理: 路由器…

【C语言程序设计】函数程序设计

目录 前言 一、程序阅读 二、程序设计 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载&#…

亚信科技AntDB数据库——深入了解AntDB-M元数据锁的实现(二)

5.5 防止低优先级锁饥饿 AntDB-M按照优先级将锁又分了两类,用于解决低优先级锁饥饿问题。 ●独占型(hog): X, SNRW, SNW; 具有较强的不兼容性,优先级高,容易霸占锁,造成其他低优先级锁一直处于等待状态。 ●暗弱型(piglet): SW; …

springboot获取配置文件属性值

Value: 作用:属性注入,需要每个值上进行书写变量名 ConfigurationProperties 指定外部属性文件。在类上添加,常与ConfigurationProperties 配合使用

系统登页面——大屏系统深蓝色主题

加了线上验证码校验还有密码账号校验。其他的资料都放在文章末尾了。 <template xmlns"http://www.w3.org/1999/html"><div class"login"><img :src"imgBg" class"login_bg" width"100%" height"100%&q…

持续集成交付CICD:CentOS 7 安装SaltStack

目录 一、理论 1.SaltStack 二、实验 1.主机一安装master 2.主机二安装第一台minion 3.主机三安装第二台minion 4.测试SaltStack 三、问题 1.CentOS 8 如何安装SaltStack 一、理论 1.SaltStack &#xff08;1&#xff09;概念 SaltStack是基于python开发的一套C/S自…

消息队列(MQ)

对于 MQ 来说&#xff0c;不管是 RocketMQ、Kafka 还是其他消息队列&#xff0c;它们的本质都是&#xff1a;一发一存一消费。下面我们以这个本质作为根&#xff0c;一起由浅入深地聊聊 MQ。 01 从 MQ 的本质说起 将 MQ 掰开了揉碎了来看&#xff0c;都是「一发一存一消费」&…

排序算法(二)-冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序

排序算法(二) 前面介绍了排序算法的时间复杂度和空间复杂数据结构与算法—排序算法&#xff08;一&#xff09;时间复杂度和空间复杂度介绍-CSDN博客&#xff0c;这次介绍各种排序算法——冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序。 文章目录 排…

【linux】SSH终端Putty配置:上传/下载、显示中文字体、自动登录

文章目录 写在前面putty上传/下载1. 下载2. 解压和配置3. 使用sz/rz3.1 下载文件:sz3.2 上传文件:rz 显示中文字体1. 下载合适的字体2. 解压和安装3. putty配置 putty自动登录1. putty配置2. putty快捷方式配置3. 使用putty 写在后面 写在前面 一篇博客介绍了12种SSH终端工具的…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 单体gltf模型与Blender中的方向对应关系

作者&#xff1a;taco 在很多包含动画的场景中&#xff0c;像模拟小人的行走、模拟火车的轨迹运行&#xff0c;又或者是模拟风力发电等等等。我们通常会加一些动画模型到里面。而有的时候可能会出现&#xff0c;这火车怎么倒着走啊&#xff01;这人怎么头朝下啊。这种方向的问题…

AIGC - 环境搭建

一. 硬件环境 1. 超微7048主板&#xff0c;最多可搭载4块GPU 2. 2个Intel的 Xen至强 14核 CPU 3. 目前安装了一块Nvidia 的P40 GPU&#xff0c;后续根据需要还最多可以扩展3块GPU 4. 4T机械 2T Nvme固态&#xff0c; 5. 4条64G DDR4内存条&#xff0c;共 196G内存…

VRRP协议与原理

文章目录 VRRP协议与原理一、VRRP 协议二、单网关和多网管的缺陷1、单网关缺陷2、多网管的缺陷 三、VRRP基本概述四、VRRP工作原理1、VRRP主备份备份工作工程2、VRRP 主备路由器切换过程3、VRRP 负载分担工作过程 五、VRRP配置命令1、vrrp配置命令2、配置VRRP步骤&#xff1a; …

基于扩散的图像超分辨率模型:ResShift

1 论文解读 论文地址&#xff1a;ResShift: Efficient Diffusion Model for Image Super-resolution by Residual Shifting 代码地址&#xff1a;https://github.com/zsyOAOA/ResShift 1.1 前言 基于扩散的图像超分辨率(SR)方法由于需要数百甚至数千个采样步骤&#xff0c;…

Amazon SageMaker机器学习之旅的助推器

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 一、前言 在当今的数字化时代&#xff0c;人工智能和机器学习已经…

GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

这章是接上一章&#xff0c;使用RPC包&#xff0c;序列化中没有详细去讲&#xff0c;因为这一块需要看的和学习的地方很多。并且这一块是RPC中可以说是最重要的一块&#xff0c;也是性能的重要影响因子。今天这篇主要会讲其使用方式。 文章目录 Protocol Buffers V3 背景以及概…

网络安全项目实战(四)--报文检测

8. TCP/UDP 段 目标 了解 TCP 段头的组织结构了解 UDP 段头的组织结构掌握 TCP/UDP 段的解析方式 8.1. UDP 段格式 下图是UDP的段格式&#xff08;该图出自[TCPIP]&#xff09;。 8.2. UDP头部 //UDP头部&#xff0c;总长度8字节// /usr/include/linux/udp.h struct udphdr …

Arris VAP2500 list_mac_address未授权RCE漏洞复现

0x01 产品简介 Arris VAP2500是美国Arris集团公司的一款无线接入器产品。 0x02 漏洞概述 Arris VAP2500 list_mac_address接口处命令执行漏洞,未授权的攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。 0x03 复现环境 FOFA…