手把手教你构建一个前端路由

news/2024/4/20 16:53:34/文章来源:https://blog.csdn.net/qq_36154157/article/details/128089626

涉及知识点:location对象、history对象

文章目录

    • 基础概念
      • 什么是路由
      • 如何实现前端路由
      • 涉及问题
    • 前端路由实现方式
      • 1. hash方式
      • 2. history方式
      • 3. debug:本地起服务报错
    • 扩展:封装路由类Router
      • hash
      • history

基础概念

什么是路由

路由是一组映射关系,本质上来说是location.href和UI的映射关系

如何实现前端路由

修改location.href,而页面不会主动刷新,需要用js控制对应展示UI

涉及问题

  • 如何修改location.href
  • 何时改变UI
  • 如何浏览器前进/后退🔙事件

前端路由实现方式

在这里插入图片描述
通过hash和history的方式切换路由时都不会引起页面的刷新

1. hash方式

hash通过a标签默认的行为来改变location.hash
通过hashchange事件来监听location.hash改变,可以指定相应呈现内容
此外,还可以跳转到对应id的元素处

  <body>  <a href="#hash1">hash2</a><a href="#hash2">hash3</a><a href="#green">green</a><div id="content">当前路由的内容为:</div><div style="height: 1000px; background: red;"></div><div id="green" style="height: 1000px; background: green;"></div><script>const onHashChange = () => {const contentEl = document.getElementById('content')contentEl.innerHTML = window.location.hash}window.addEventListener('hashchange', onHashChange)</script></body>

2. history方式

单页面应用,变换loctaion的hash,但是页面不会自动刷新,需要js指定要改变的UI
原理:调用 history对象的replaceState或者pushState方法来改变路由,手动改变对应UI样式

 <body><button>nav1</button><button>nav2</button><button>nav3</button><div id="content">当前路由的内容为:</div><script>const onPopState = () => {const contentEl = document.getElementById('content')contentEl.innerHTML = window.location.pathname}// button 只会改变location.path,不会出发popstate实践,监听不到const buttonEls = document.getElementsByTagName('button')for (let btnEl of buttonEls) {// 1 改变location中路径btnEl.onclick = () => {window.history.pushState({ nav: btnEl.innerHTML },'title','/' + btnEl.innerHTML,)// 2 手动改变UIonPopState()}}// 点击前进返回按钮时,会调用popstate.改变UIwindow.addEventListener('popstate', onPopState)</script></body>

3. debug:本地起服务报错

在这里插入图片描述
原因:history路由中的popstate不支持file协议
解决步骤参考:https://blog.csdn.net/am123999/article/details/120582419

扩展:封装路由类Router

如何使用:class Router
注册:register(navName, fn)
执行:emit(navName)
初始化:init() 最初路由对应的UI

hash

  <body><a href="#hash1">hash2</a><a href="#hash2">hash3</a><a href="#green">green</a><div id="content">当前路由的内容为:</div><div style="height: 1000px; background: red;"></div><div id="green" style="height: 1000px; background: green;"></div><script>class Router {routerListconstructor() {this.routerList = {}window.onhashchange = () => {this.routerList[this.getHashName()]()}}getHashName() {return location.hash}register(navName, fn) {this.routerList[navName] = fn}emit(navName) {typeof this.routerList[navName] === 'function' &&this.routerList[navName]()}init() {this.emit('/')}}const router = new Router()router.register('#hash1', () => {console.log('当前hash为#hash1')})router.register('#hash2', () => {console.log('当前hash为#hash2')})router.register('#green', () => {console.log('当前hash为green')})</script></body>

history

  <body><a href="/">主页</a><a href="nav1">nav1</a><a href="nav2">nav2</a><a href="nav3">nav3</a><script>class Router {routerListconstructor() {this.routerList = {}window.onpopstate = () => {this.routerList[this.getPathName()]()}}register(navName, fn) {this.routerList[navName] = fn}getPathName() {return location.pathname}emit(navName) {history.pushState({ nav: navName }, null, navName)typeof this.routerList[navName] === 'function' &&this.routerList[navName]()}init() {this.emit('/')}}// 使用const router = new Router()// 注册函数和路由router.register('/', () => {console.log('切换到主页')})router.register('nav1', () => {console.log('切换到nav1')})router.register('nav2', () => {console.log('切换到nav2')})router.register('nav3', () => {console.log('切换到nav3')})router.init()const aEls = document.getElementsByTagName('a')for (const aEl of aEls) {aEl.onclick = (e) => {e.preventDefault()router.emit(e.target.getAttribute('href'))}}</script></body>

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

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

相关文章

51单片机学习笔记4 新建工程及点亮LED实战

51单片机学习笔记4 新建工程及点亮LED实战一、使用keil新建工程二、项目设置1. 点击魔术棒&#xff0c;钩选Output-Create Hex File2. 设置仿真器三、编写代码1. 尝试编译代码2. 点亮LED的代码3. GPIO引脚介绍4. GPIO内部结构P0端口&#xff1a;P1 端口四、软件仿真一、使用kei…

[附源码]SSM计算机毕业设计校园爱心支愿管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

台积电跪舔美国,日本却醒悟了而选择独立发展芯片产业

近期台积电大举包机10架将精英人才和设备转往美国引发争议&#xff0c;然而这个时候日本却选择了独立发展芯片产业的道路&#xff0c;摆脱美国的限制&#xff0c;显然日本清醒地认识到依赖美国不会有好结果。台积电之前还在左右摇摆&#xff0c;希望既能继续获得美国芯片的订单…

字符串压缩(一)之ZSTD

一、zstd压缩与解压 ZSTD_compress属于ZSTD的Simple API范畴&#xff0c;只有压缩级别可以设置。 ZSTD_compress函数原型如下&#xff1a; size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel) ZSTD_decompress函数原…

全网首发克莱斯勒东南大捷龙jeep道奇DIY数码碟盒增加USB和蓝牙播放音乐功能使用原车接口无损改装

文章目录前言碟盒功能1、设计指标3、外观设计4、PCB设计5、程序设计6、调试7、大捷龙车机尾插接口定义公头东南大捷龙车机白色插头模块与白色插头连接方法8、安装方法9、 使用方法9.1 CD车机按钮功能定义11、 联系我前言 ​ 之前写过四篇关于车机增加音频输入的方法。 1、07宝…

水电站下泄生态流量监控解决方案-智能监测生态流量遥测终端-水电站流量监测站

平升电子水电站下泄生态流量监控解决方案-智能监测生态流量遥测终端-水电站流量监测站是一款集人机交互、视频叠加、4G路由、数据采集、逻辑运算与远程传输功能于一体的多媒体智能终端设备。 此款产品为水电站生态流量监测项目的专用产品&#xff0c;便于监管单位及时掌握水电…

农村城镇面板数据集:地级市人均消费与支出2012-2019各省农村数据2013-2019

1、2002-2019年地级市人均消费与支出数据 1、数据来源&#xff1a;wind 2、时间跨度&#xff1a;2012-2019 3、区域范围&#xff1a;287个地级市 4、指标说明&#xff1a; 包含以下四个指标&#xff1a;人均可支配收入&#xff08;农村&#xff09;、人均可支配收入&#…

Python中的dump() 、load()和dumps()、loads()使用及示例

Python中的dump() 、load()和dumps()、loads() 结论&#xff1a; 1.不加s的标识对json文件的读写&#xff0c;将内存中值读取写入到json后缀文件&#xff0c;或者将json后缀文件中内容读取到内存 2.加了s的主要是字符串类型和其他数据类型的互转 JSON(JavaScript Object No…

如何用R语言在机器学习中建立集成模型?

介绍 在本文中&#xff0c;我将向您介绍集成建模的基础知识。 另外&#xff0c;为了向您提供有关集成建模的实践经验&#xff0c;我们将使用R进行集成。最近我们被客户要求撰写关于集成模型的研究报告&#xff0c;包括一些图形和统计输出。 1.什么是集成&#xff1f; 通常&am…

初始数据结构

目录 1. 集合的框架 集合框架的重要性 数据结构的介绍 算法的介绍 容器背后对应的数据结构 2. 时间复杂度和空间复杂度 算法效率 时间复杂度 时间复杂度的概念 大O的渐进表示法 常见的时间复杂度的计算 空间复杂度 空间复杂度的概念 从本章开始又要开始新的篇章&a…

【Python实战】“特种兵”们的专属游戏助手,助你吃鸡:极品小助手也是棒呆了~(“大吉大利,今W吃鸡”)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 “注意左边&#xff0c;左边有人&#xff0c;打他&#xff01;” “快上车&#xff01;&#xff0…

idea搭建ssm项目全过程详解:

1&#xff0c;创建maven项目&#xff1a; 然后&#xff0c;点击next 其次 2&#xff0c;在pom.xml导入相关依赖&#xff1a;&#xff08;如果idea没有集成maven需要先集成maven&#xff09; <dependencies><dependency><groupId>org.springframework</gr…

[附源码]计算机毕业设计JAVA同城搬家平台

[附源码]计算机毕业设计JAVA同城搬家平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

流利地回答出面试官提出的八股问题,面试官却突然说“背得不错”,该怎么回答?...

面试前背题是大家心照不宣的做法&#xff0c;一般面试官也不会揭穿&#xff0c;但如果遇到一位犀利的面试官&#xff0c;那该怎么办呢&#xff1f;一位网友就遇到了这样的窘境&#xff1a;面试的时候&#xff0c;十分流利地回答出面试官提出的概念原理方面的问题&#xff0c;面…

[附源码]Python计算机毕业设计SSM基于Java的音乐网站(程序+LW)

环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Maven管理等…

拼多多季报图解:营收355亿同比增65% 研发投入达27亿

雷递网 雷建平 11月28日拼多多今日发布2022年第三季度业绩报告。财报显示&#xff0c;拼多多2022年第三季度营收为355亿元&#xff0c;同比增长65.1%。受到一些项目投入延缓等偶发因素影响&#xff0c;三季度平台运营费用为176.5亿元&#xff0c;占收入的比例从上年同期的59.6&…

IBM MQ MQCSP

一&#xff0c;概念 1.1 用途 用途&#xff1a;MQCSP 结构使授权服务能够验证用户 ID 和密码。您在 MQCONNX 调用上指定 MQCSP 连接安全参数结构。 警告&#xff1a;在某些情况下&#xff0c;客户端应用程序的 MQCSP 结构中的密码将以纯文本形式通过网络发送。要确保客户端应…

[MyBatis]一级缓存/二级缓存/三方缓存

缓存是一种临时存储少量数据至内存或者是磁盘的一种技术.减少数据的加载次数,可以降低工作量,提高程序响应速度 缓存的重要性是不言而喻的。mybatis的缓存将相同查询条件的SQL语句执行一遍后所得到的结果存在内存或者某种缓存介质当中&#xff0c;当下次遇到一模一样的查询SQL时…

【测试沉思录】18.如何测试微信小程序?

作者&#xff1a;雷远缘 编辑&#xff1a;毕小烦 一. 先知道小程序是什么 啥是小程序&#xff1f; “小程序是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用 “触手可及” 的梦想&#xff0c;用户扫一扫或者搜一下即可打开应用。也体现了 “用完即走” 的理念&am…

Nodejs -- Express的安装和定义get、post方法

文章目录Express的基本使用1 安装2 基本使用3 监听GET请求4 监听POST请求5 把内容响应给客户端6 获取URL中携带的查询参数7 获取URL中的动态参数Express的基本使用 1 安装 在项目所处的目录中&#xff0c;运行如下的终端命令&#xff0c;即可将express安装到项目中使用&#…