【前端路由】使用hash、history改善页面渲染体验

简介: 【前端路由】使用hash、history改善页面渲染体验

前端路由

路由的概念来源于服务端,在服务端中路由描述的是 URL 与处理函数之间的映射关系。

在 Web 前端单页应用 SPA(Single Page Application)中,路由描述的是 URL 与 UI 之间的映射关系,这种映射是单向的,即 URL 变化引起 UI 更新(无需刷新页面)。

实现前端路由

核心:

  • 不引起页面刷新
  • 检测URL变化

方法:

  • hash:URL中(#)及(#)后面的部分。通过hashchange事件监听URL变化,改变URL的方式:
  1. 通过浏览器前进后退改变URL
  2. 通过<a>标签改变URL
  3. 通过window.locatioin改变URL
  • history:提供pushStatereplaceState两个方法:
  1. 提供popstate事件,但popstate事件有些不同:
  • 通过浏览器前进后退改变URL时会触发popstate事件
  • 通过pushState/replaceState<a>标签改变URL时不会触发popstate事件
  1. 可以通过拦截pushState/replaceState的调用和<a>标签的点击事件来检测URL是否发生变化

实现方式(1):hash

<body>
  <!-- route -->
  <ul>
    <li>
      <a href="#/home">home</a>
    </li>
    <li>
      <a href="#/about">about</a>
    </li>
  </ul>
  <!-- view -->
  <div id="routerView"></div>
  <script>
    window.addEventListener('DOMContentLoaded',onLoad)
    //监听路由变化
    window.addEventListener('hashchange',onHashChange)
    let routerView = null;
    function onLoad() {
      routerView = document.querySelector('#routerView');
      onHashChange();
    }
    function onHashChange() {
      switch(location.hash) {
        case '#/home':
          routerView.innerHTML = 'HOME';
          return;
        case '#/about':
          routerView.innerHTML = 'About';
          return;
        default:
          routerView.innerHTML = '';
          return;
      }
    }
  </script>
</body>

实现方式2:history

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <ul>
    <li>
      <a href="/home">home</a>
    </li>
    <li>
      <a href="/about">about</a>
    </li>
    <div id="routeView"></div>
  </ul>
  <script>
    window.addEventListener('DOMContentLoaded',onLoad)
    //监听路由变化
    window.addEventListener('popstate',onPopState)
    //routeView
    let routeView = null;
    function onLoad () {
      routeView = document.querySelector('#routeView');
      onPopState()
      //拦截a标签点击事件,点击时使用pushState修改URL并手动更新routeView
      let linkList = document.querySelectorAll('a[href]')
      linkList.forEach(el => el.addEventListener('click',function(e){
        e.preventDefault()
        history.pushState(null,'',el.getAttribute('href'))
          onPopState()
      }))
    }
    function onPopState() {
      switch (location.pathname) {
        case '/home':
          routeView.innerHTML = 'HOME'
          return
        case '/about':
          routeView.innerHTML = 'About'
          return
        default:
          routeView.innerHTML = ''
          return
      }
    }
  </script>
</body>
</html>

我们看到,使用history的方式,需要多判断a标签点击事件并拦截。


相关文章
|
7天前
|
前端开发 JavaScript 开发者
前端 CSS 优化:提升页面美学与性能
前端CSS优化旨在提升页面美学与性能。通过简化选择器(如避免复杂后代选择器、减少通用选择器使用)、合并样式表、合理组织媒体查询,可减少浏览器计算成本和HTTP请求。利用硬件加速和优化动画帧率,确保动画流畅。定期清理冗余代码并使用缩写属性,进一步精简代码。这些策略不仅加快页面加载和渲染速度,还提升了视觉效果,为用户带来更优质的浏览体验。
|
2月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
移动开发 缓存 前端开发
深入理解前端路由:原理、实现与应用
本书《深入理解前端路由:原理、实现与应用》全面解析了前端路由的核心概念、工作原理及其实现方法,结合实际案例探讨了其在现代Web应用中的广泛应用,适合前端开发者和相关技术人员阅读。
|
2月前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
18 1
.自定义认证前端页面
|
2月前
|
前端开发 JavaScript 搜索推荐
前端懒加载:提升页面性能的关键技术
前端懒加载是一种优化网页加载速度的技术,通过延迟加载非首屏内容,减少初始加载时间,提高用户访问体验和页面性能。
|
2月前
|
缓存 前端开发 JavaScript
JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式
本文深入解析了JavaScript前端路由的实现原理及其在单页应用中的重要性,涵盖前端路由概念、基本原理、常见实现方式(Hash路由和History路由)、优点及挑战,并通过实际案例分析,帮助开发者更好地理解和应用这一关键技术,提升用户体验。
92 1
|
2月前
|
前端开发 安全 JavaScript
在阿里云快速启动Appsmith搭建前端页面
本文介绍了Appsmith的基本信息,并通过阿里云计算巢完成了Appsmith的快速部署,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Appsmith,非技术同学也能轻松搞定。
|
3月前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
46 18
|
3月前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
3月前
|
前端开发 JavaScript API
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
112 3