【前端路由】使用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标签点击事件并拦截。


相关文章
|
5天前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
5 1
.自定义认证前端页面
|
22小时前
|
前端开发 安全 JavaScript
在阿里云快速启动Appsmith搭建前端页面
本文介绍了Appsmith的基本信息,并通过阿里云计算巢完成了Appsmith的快速部署,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Appsmith,非技术同学也能轻松搞定。
|
1天前
|
前端开发 JavaScript
前端在移动端使用 100vh 导致页面出现滚动条的解决方案
前端在移动端使用 100vh 导致页面出现滚动条的解决方案
10 2
|
23天前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
36 18
|
17天前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
24天前
|
前端开发 JavaScript API
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
深度剖析:前端如何驾驭海量数据,实现流畅渲染的多种途径
63 3
|
1月前
|
JavaScript 前端开发 API
前端技术分享:Vue.js 动态路由与守卫
【10月更文挑战第1天】前端技术分享:Vue.js 动态路由与守卫
|
1月前
|
前端开发 数据安全/隐私保护
angular前端基本页面验证
angular前端基本页面验证
28 1
|
1月前
|
前端开发
搭建个人博客--1、前端页面
搭建个人博客--1、前端页面
19 1
|
24天前
|
JavaScript 前端开发 应用服务中间件
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
Vue开发中,在实现单页面应用(SPA)前端路由时的hash模式和history模式的区别及详细介绍
20 0
下一篇
无影云桌面