首页 > 其他分享 >深入理解前端中的 hash 和 history 路由

深入理解前端中的 hash 和 history 路由

时间:2023-02-04 23:56:05浏览次数:57  
标签:hash URL url history 路由 页面

我们在使用 Vue 或者 React 等前端渲染时,通常会有 hash 路由和 history 路由两种路由方式。

  1. hash 路由:监听 url 中 hash 的变化,然后渲染不同的内容,这种路由不向服务器发送请求,不需要服务端的支持;
  2. history 路由:监听 url 中的路径变化,需要客户端和服务端共同的支持;

我们一步步实现这两种路由,来深入理解下底层的实现原理。我们主要实现以下几个简单的功能:

  1. 监听路由的变化,当路由发生变化时,可以作出动作;
  2. 可以前进或者后退;
  3. 可以配置路由;

1. hash 路由

当页面中的 hash 发生变化时,会触发hashchange事件,因此我们可以监听这个事件,来判断路由是否发生了变化。

window.addEventListener(
    'hashchange',
    function (event) {
        const oldURL = event.oldURL; // 上一个URL
        const newURL = event.newURL; // 当前的URL
        console.log(newURL, oldURL);
    },
    false
);

 

2. history 路由

在 history 路由中,我们一定会使用window.history中的方法,常见的操作有:

  • back():后退到上一个路由;
  • forward():前进到下一个路由,如果有的话;
  • go(number):进入到任意一个路由,正数为前进,负数为后退;
  • pushState(obj, title, url):前进到指定的 URL,不刷新页面;
  • replaceState(obj, title, url):用 url 替换当前的路由,不刷新页面;

调用这几种方式时,都会只是修改了当前页面的 URL,页面的内容没有任何的变化。但前 3 个方法只是路由历史记录的前进或者后退,无法跳转到指定的 URL;而pushStatereplaceState可以跳转到指定的 URL。如果有面试官问起这个问题“如何仅修改页面的 URL,而不发送请求”,那么答案就是这 5 种方法。

如果服务端没有新更新的 url 时,一刷新浏览器就会报错,因为刷新浏览器后,是真实地向服务器发送了一个 http 的网页请求。因此若要使用 history 路由,需要服务端的支持。

2.1 应用的场景

pushState 和 replaceState 两个方法跟 location.href 和 location.replace 两个方法有什么区别呢?应用的场景有哪些呢?

  1. location.href 和 location.replace 切换时要向服务器发送请求,而 pushState 和 replace 仅修改 url,除非主动发起请求;
  2. 仅切换 url 而不发送请求的特性,可以在前端渲染中使用,例如首页是服务端渲染,二级页面采用前端渲染;
  3. 可以添加路由切换的动画;
  4. 在浏览器中使用类似抖音的这种场景时,用户滑动切换视频时,可以静默修改对应的 URL,当用户刷新页面时,还能停留在当前视频。

 

参考网址

标签:hash,URL,url,history,路由,页面
From: https://www.cnblogs.com/miangao/p/17092662.html

相关文章

  • 为什么重写了 equals 还要重写 hashCode
    目录1.先说一下为什么要重写equals方法?2.再说为什么还要重写hashCode方法?借鉴:https://blog.csdn.net/weixin_44061521/article/details/128194172日期:2023年2月4日......
  • linux基本功系列之history命令实战
    (文章目录)前言......
  • vue.js客服系统实时聊天项目开发(二十二)vue项目中router.js路由介绍
    vue项目的路由就相当于我们在网址url上输入的地址,访问的具体网址就是路由拿到项目先看看路由文件,就能知道具体的访问地址了例如下面的router.jsimportVuefrom'vue'......
  • vue的路由的注意点
    2.vue路由-声明式导航2.0声明式导航-基础使用目标:可用全局组件router-link来替代a标签vue-router提供了一个全局组件router-linkrouter-link实质上最终会......
  • drf之路由Routers
    #2.路由Routers对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。如果是非视图集,不需......
  • 路由的使用
               ......
  • vue嵌套路由子路由 path 注意
    子路由的地址如果是希望拼接父路由地址,子路由的path仅写名称,不写“/”,如果希望是另外的地址,则直接以“/”开头。{path:"/lifetools",name:"li......
  • 兔子与兔子(hash模板题)
    题意描述:很久很久以前,森林里住着一群兔子。有一天,兔子们想要研究自己的DNA序列。我们首先选取一个好长好长的DNA序列(小兔子是外星生物,DNA序列可能包含26个小写英文字......
  • 数据结构-Hash常见操作实践
    数据结构-Hash常见操作实践目录介绍01.什么是哈希算法02.哈希算法的应用03.安全加密的场景04.唯一标识的场景05.数据校验的场景06.散列函数的场景07.Git版本的控......
  • Linux 路由表详解
    一、查看路由表[root@VM_139_74_centos~]#routeKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIfacedefault......