前端路由解析(一) —— hash路由

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 前端路由解析(一) —— hash路由

640.jpg

写在前面


现在的前端应用很多都是单页应用。路由对于单页应用来说,是一个重要的组成部分。本系列文章将讲解前端路由的实现原理。这是系列文章的第一篇:hash路由。


hash


首先来说一说什么是hash。我们经常能看到这种url:


1、https://www.baidu.com/#1232、https://www.baidu.com/#234


url后面的#/123,就是hash值,可以通过下面的代码来获取:


window.location.hash// #123// #234


hash最初是用来进行页面快速定位的,当页面很长的时候,是很有用的,比如下面的例子:


<header>  <a href='#p1'>前往段落1</a>  <a href='#p2'>前往段落2</a>  <a href='#p3'>前往段落3</a></header><main>  <p id='p1'>11111111111111111111111111</p>  <p id='p2'>22222222222222222222222222</p>  <p id='p3'>33333333333333333333333333</p></main>


假设我们的三个</p>上下间距很大,点击最上面的</a>标签,可以迅速定位到对应的段落。像下面这样:


640.gif

我们也可以用过代码来控制hash值,同样可以达到定位的效果,比如:


window.location.hash = '#p2'


hash路由


当页面的hash值变化时,是可以监听到的:


window.addEventListener('hashchange', e => {    console.log(e); // HashChangeEvent     const oldUrl = e.oldURL; // 旧的页面地址    const newUrl = e.newURL; // 新的页面地址    const type = e.type // hashchange - 事件类型    const cancelable = e.cancelable; // false - 表示该事件无法取消。即无法通过e.preventDefault()阻止hash跳转});


hash路由就是利用了hash值变化可监听这一点来实现的。我们来实现一个最最简单的:


<body>    <header>        <a href='#p1'>前往段落1</a>        <a href='#p2'>前往段落2</a>        <a href='#p3'>前往段落3</a>    </header>    <main>        <div id="content">            这是首页        </div>    </main>    <script>        const routerMap = {            'p1': () => { document.getElementById('content').innerHTML = '这是段落1的内容' },            'p2': () => { document.getElementById('content').innerHTML = '这是段落2的内容' },            'p3': () => { document.getElementById('content').innerHTML = '这是段落3的内容' },        }        const handleRouter = e => {            const newURL = e && e.newURL || window.location.href;            const newHash = newURL.split('#').pop();            typeof routerMap[newHash] === 'function' && routerMap[newHash]();        };        window.addEventListener('hashchange', handleRouter);        window.addEventListener('load', handleRouter);</script></body>


最终的效果如下图所示:

640.gif



hash路由的兼容性很不错,可以兼容到IE8。并且,hash路由完全由前端就可以实现。


写在后面


本文解析了前端的hash,以及hash路由的实现原理,符合预期。其实很多看起来强大的功能,底层的原理其实很简单。后续会解析另一种常用的路由方式:history路由。


另外,一些我们平时不常用的api等,或许可以做很多事情。比如我之前这篇文章里讲的:


你可能不知道的LocalStorage用法

相关文章
|
13天前
|
JavaScript 前端开发 开发者
Vue.js 框架大揭秘:响应式系统、组件化与路由管理,震撼你的前端世界!
【8月更文挑战第27天】Vue.js是一款备受欢迎的前端JavaScript框架,以简洁、灵活和高效著称。本文将从三个方面深入探讨Vue.js:响应式系统、组件化及路由管理。响应式系统为Vue.js的核心特性,能自动追踪数据变动并更新视图。例如,通过简单示例代码展示其响应式特性:`{{ message }}`,当`message`值改变,页面随之自动更新。此外,Vue.js支持组件化设计,允许将复杂界面拆分为独立且可复用的组件,提高代码可维护性和扩展性。如创建一个包含标题与内容的简单组件,并在其他页面中重复利用。
34 3
|
17天前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
44 0
|
24天前
|
JSON 前端开发 Java
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
【8月更文挑战第12天】SpringBootWeb极速入门-请求参数解析(02)
14 1
【前端学java】SpringBootWeb极速入门-请求参数解析(02)
|
17天前
|
存储 前端开发 JavaScript
深入Web前端:栈与堆的优缺点全解析,让你大开眼界!
【8月更文挑战第23天】本文以问答形式解析了Web前端开发中至关重要的内存管理概念——栈与堆。栈采用后进先出(LIFO)原则存储执行上下文,适用于函数调用管理;而堆则灵活存储如对象和数组等复杂数据类型。栈操作迅速但访问受限,堆则提供动态空间分配但可能牺牲内存效率。理解两者特性有助于提升JavaScript编程技巧。
27 1
|
20天前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
35 1
|
9天前
|
前端开发 UED 开发者
React组件优化全攻略:深度解析让你的前端应用飞速运行的秘诀——从PureComponent到React.memo的彻底性能比较
【8月更文挑战第31天】在构建现代Web应用时,性能是提升用户体验的关键因素。React作为主流前端库,其组件优化尤为重要。本文深入探讨了React组件优化策略,包括使用`PureComponent`、`React.memo`及避免不必要的渲染等方法,帮助开发者显著提升应用性能。通过实践案例对比优化前后效果,不仅提高了页面渲染速度,还增强了用户体验。优化React组件是每个开发者必须关注的重点。
20 0
|
17天前
|
自然语言处理 前端开发 JavaScript
前端进阶必读:JS闭包深度解析,掌握这一特性,你的代码将焕然一新!
【8月更文挑战第23天】闭包是JavaScript的一项高级功能,让函数能够访问和操作外部函数作用域中的变量。本文深入解析闭包概念、组成及应用场景。闭包由函数及其词法环境构成,通过在一个函数内定义另一个函数来创建。它有助于封装私有变量、维持状态和动态生成函数。然而,不当使用闭包可能导致内存泄漏或性能问题。掌握闭包对于实现模块化代码和成为优秀前端开发者至关重要。
28 0
|
19天前
|
索引 容器
容器镜像解析问题之获取 Image 的 ConfigFile 的 hash 值如何解决
容器镜像解析问题之获取 Image 的 ConfigFile 的 hash 值如何解决
9 0
|
26天前
|
JavaScript 前端开发 API
如何在 Angular 路由中使用路由解析器
如何在 Angular 路由中使用路由解析器
26 0
|
28天前
|
存储 前端开发 JavaScript
前端语言串讲 | 青训营笔记
前端语言串讲 | 青训营笔记
20 0

热门文章

最新文章

推荐镜像

更多
下一篇
DDNS