下面是详解“详解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中前端路由基本原理与实现方式
- javascript计算用户打开网页的停留时间 2024-01-17
- PDF转HTML工具——用springboot包装pdf2htmlEX命令行工具 2023-10-27
- ExtJS 3.x DateField menuListeners 显示/隐藏 2022-09-15
- 浅谈Ajax和JavaScript的区别 2023-01-20
- Jquery判断IE6等浏览器的代码 2024-01-16
- 深入了解最常用的JavaScript 事件 2023-08-08
- 遗迹灰烬重生武器有哪些 武器、套装与特性收集攻略 2024-01-02
- firebug的一个有趣现象介绍 2023-12-01
- Uncaught TypeError: Cannot read properties of undefined (reading ‘install‘)报错 2022-11-02
- How to convert HTML Report to picture format in Email? 2023-10-27