沃梦达 / IT编程 / 前端开发 / 正文

详解SPA中前端路由基本原理与实现方式

下面是详解“详解SPA中前端路由基本原理与实现方式”的完整攻略:

下面是详解“详解SPA中前端路由基本原理与实现方式”的完整攻略:

什么是SPA

SPA即单页应用程序,它是一个不会重新加载整个页面的应用程序,而只会更新页面的局部区域。这样能够提高用户的体验,减少页面加载时间和流量消耗。

前端路由的概念

前端路由是指在单页应用程序中,通过监听浏览器url变化,使得不同的url对于不同的页面呈现。一般来说,前端路由是通过修改hash值或者通过HTML5新增的history API来实现。

实现方式

hash实现方式

hash是浏览器中URL地址中的#号后面的内容,可以在不刷新页面的情况下改变URL地址而不会请求新的页面。我们可以利用hash来实现前端路由。

以下是一个实现前端路由的示例:

function onHashChange() {  // 监听hash变化的函数
   var hash = location.hash;  // 获取当前hash
   showPage(hash.substring(1));  // 根据hash显示对应的页面
}

function showPage(pageName) { // 显示对应页面的函数
   var pages = document.getElementsByClassName('page');  // 获取所有的页面元素
   for (var i = 0; i < pages.length; i++) {
      if (pages[i].getAttribute('id') == pageName) {  // 根据页面名称来判断哪个页面需要显示
         pages[i].style.display = 'block';
      } else {
         pages[i].style.display = 'none';
      }
   }
}

window.addEventListener('hashchange', onHashChange); // 监听hash变化事件

通过以上代码,我们实现了一个简单的前端路由。

history实现方式

HTML5新增了history API,我们可以利用history API来实现前端路由。

以下是一个实现前端路由的示例:

function onPopstate() {  // 监听历史记录的函数
   var path = location.pathname;  // 获取当前路径
   showPage(path.substring(1));  // 根据路径显示对应的页面
}

function showPage(pageName) { // 显示对应页面的函数
   var pages = document.getElementsByClassName('page');  // 获取所有的页面元素
   for (var i = 0; i < pages.length; i++) {
      if (pages[i].getAttribute('id') == pageName) {  // 根据页面名称来判断哪个页面需要显示
         pages[i].style.display = 'block';
      } else {
         pages[i].style.display = 'none';
      }
   }
}

window.addEventListener('popstate', onPopstate); // 监听历史记录变化事件

通过以上代码,我们实现了一个基于history API的前端路由。

示例介绍

示例一:基于hash实现的前端路由

我们可以使用示例代码,创建一个demo.html文件,包含以下内容:

<!DOCTYPE html>
<html>
<head>
   <title>基于hash实现的前端路由</title>
</head>
<body>
   <ul>
      <li><a href="#home">首页</a></li>
      <li><a href="#about">关于我们</a></li>
      <li><a href="#contact">联系我们</a></li>
   </ul>
   <div class="page" id="home">这是首页</div>
   <div class="page" id="about">这是关于我们</div>
   <div class="page" id="contact">这是联系我们</div>
   <script>
       function onHashChange() {  // 监听hash变化的函数
           var hash = location.hash;  // 获取当前hash
           showPage(hash.substring(1));  // 根据hash显示对应的页面
       }

       function showPage(pageName) { // 显示对应页面的函数
           var pages = document.getElementsByClassName('page');  // 获取所有的页面元素
           for (var i = 0; i < pages.length; i++) {
               if (pages[i].getAttribute('id') == pageName) {  // 根据页面名称来判断哪个页面需要显示
                   pages[i].style.display = 'block';
               } else {
                   pages[i].style.display = 'none';
               }
           }
       }

       window.addEventListener('hashchange', onHashChange); // 监听hash变化事件
   </script>
</body>
</html>

我们可以在浏览器中打开demo.html文件,点击导航菜单中的链接,发现页面可以不刷新而进行切换。

示例二:基于history API实现的前端路由

同样是创建一个demo.html文件,修改一下代码,把我们前面使用的hash改为history API方式:

<!DOCTYPE html>
<html>
<head>
   <title>基于history API实现的前端路由</title>
</head>
<body>
   <ul>
      <li><a href="/home">首页</a></li>
      <li><a href="/about">关于我们</a></li>
      <li><a href="/contact">联系我们</a></li>
   </ul>
   <div class="page" id="home">这是首页</div>
   <div class="page" id="about">这是关于我们</div>
   <div class="page" id="contact">这是联系我们</div>
   <script>
       function onPopstate() {  // 监听历史记录的函数
           var path = location.pathname;  // 获取当前路径
           showPage(path.substring(1));  // 根据路径显示对应的页面
       }

       function showPage(pageName) { // 显示对应页面的函数
           var pages = document.getElementsByClassName('page');  // 获取所有的页面元素
           for (var i = 0; i < pages.length; i++) {
               if (pages[i].getAttribute('id') == pageName) {  // 根据页面名称来判断哪个页面需要显示
                   pages[i].style.display = 'block';
               } else {
                   pages[i].style.display = 'none';
               }
           }
       }

       window.addEventListener('popstate', onPopstate); // 监听历史记录变化事件
       var links = document.getElementsByTagName('a');
       for (var i = 0; i < links.length; i++) {
           links[i].addEventListener('click', function(event) {  // 重写导航菜单的链接的点击事件
               event.preventDefault();  // 阻止默认的跳转行为
               var url = this.getAttribute('href');  // 获取链接的href属性
               history.pushState(null, null, url);  // 利用history API修改url,但不会发送请求
               showPage(url.substring(1));  // 根据路径显示对应的页面
           });
       }
   </script>
</body>
</html>

同样可以在浏览器中打开demo.html文件,点击导航菜单中的链接,页面可以不刷新而进行切换。

以上就是“详解SPA中前端路由基本原理与实现方式”的完整攻略。

本文标题为:详解SPA中前端路由基本原理与实现方式