当前位置: 首页 > news >正文

【JavaScript】基于SPA的单页面路由

文章目录

    • 一. 基于SPA的单页面路由
    • 二. hash 实现
    • 三. history 实现

一. 基于SPA的单页面路由

  • 什么是路由和前端路由

    • 路由(英文:router)就是对应关系
    • 路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系
    • 前端路由就是浏览器地址栏中的 URL 与所见网页的对应关系(Hash地址与组件之间的对应关系)
      • 组件(英文:components):指对具体的某个功能进行封装,来达到组件复用,提高开发效率。
  • 什么是SPA

    • SPA(single page application),翻译过来就是单页应用,SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换打断用户体验
    • 在单页应用中,所有必要的代码(HTML、JavaScript和CSS)都通过单个页面的加载而检索,或者根据需要(通常是为响应用户操作)动态装载适当的资源并添加到页面
    • 页面在任何时间点都不会重新加载(刷新),也不会将控制转移到其他页面
    • 我们熟知的JS框架如react,vue,angular都属于SPA
    • 举个例子来讲就是一个杯子,早上装的牛奶,中午装的是开水,晚上装的是茶,我们发现,变的始终是杯子里的内容,而杯子始终是那个杯子
  • 如何实现前端路由?要实现前端路由,需要解决两个核心:

    • 如何改变 URL 却不引起页面刷新?
    • 如何检测 URL 变化了?
  • 实现路由的方式有两种:

    • 依赖 hash 的改变(锚点)
    • 依赖历史记录(history)

二. hash 实现

  • 当一个窗口的hash (URL 中 # 后面的部分)值改变时就会触发 hashchange 事件。

  • 改变 URL 中的 hash 部分不会引起页面刷新。

  • 触发 hashchange 事件的几种方式:通过浏览器前进后退改变 URL、通过a标签改变 URL、通过window.location改变URL。

<body>
  <ul>
    <!-- 定义路由 -->
    <li><a href="#/home">home</a></li>
    <li><a href="#/about">about</a></li>

    <!-- 渲染路由对应的 UI -->
    <div id="routeView"></div>
  </ul>
</body>
// 监听路由变化
window.addEventListener('hashchange', onHashChange)

// 路由视图
var routerView = null

function onLoad () {
  routerView = document.querySelector('#routeView')
  onHashChange()
}

// 路由变化时,根据路由渲染对应 UI
function onHashChange () {
  switch (location.hash) {
    case '#/home':
      routerView.innerHTML = 'Home'
      return
    case '#/about':
      routerView.innerHTML = 'About'
      return
    default:
      return
  }
}

三. history 实现

  • history 提供了 pushState方法改变 URL 的 path 部分不会引起页面刷新。

  • pushState() 方法三个参数: 一个状态对象(一般为null), 一个标题 (目前被忽略), 和 (可选的) 一个URL.

  • popstate 事件每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发.

  • 需要后端配合

相关文章:

  • Java基础:Lambda表达式方法引用
  • 嵌入式:ARM常用开发编译软件介绍
  • (三)HTTPTomcatServlet
  • MySQL主从搭建
  • 20221226编译Toybrick的TB-RK3588X开发板的Android12系统3
  • 并查集解决重复员工问题
  • 详细介绍关于自定义类型:结构体、枚举、联合【c语言】
  • 【swaggo】swaggo使用详解
  • 2022圣诞代码合集(圣诞树+圣诞老人)
  • 使用 JavaScript 检测用户是否在线
  • 倒单摆22Inverted pendulum)c++代码1201
  • 车载诊断数据库ODX——Flash(刷写)
  • Linux中的进程状态
  • 【C函数】函数详解
  • jdk11新特性——ZGC
  • 【java】stream流
  • 在linux中配置redis去中心化集群
  • 2022圣诞树(C语言摇钱树版本)
  • 【圣诞节】飘雪圣诞树
  • 口罩佩戴监测系统 yolo
  • 四川在浙江公开招募200名退休教师,赴川支教帮扶
  • 民调显示特朗普执政百日支持率为80年来美历任总统最低
  • 财政部下达农业生产防灾救灾资金3.76亿元,支持黄淮海等地抗旱保春播
  • 加拿大温哥华一车辆冲撞人群,造成多人伤亡
  • 俄罗斯称已收复库尔斯克州
  • 新版国家卫生监督抽查计划发布,首次明确打击网络“医托”