新闻中心

JS实现一个完整的单页应用(SPA)_j*ascript实战

2025-11-01
浏览次数:
返回列表

答案:用原生 J*aScript 可实现 SPA,核心包括路由管理、视图切换、数据绑定和组件化。通过 History API 监听 URL 变化,定义路由表 routes,匹配路径并渲染对应内容;利用 popstate 事件处理浏览器前进后退;拦截 a 标签点击事件,调用 preventDefault() 阻止默认跳转,使用 pushState 更新 URL 并触发 n*igate 函数渲染新视图;将页面封装为返回 HTML 字符串的组件函数,提升可维护性;通过全局 store 对象实现简易状态管理,支持跨页面数据共享,并借助自定义事件“statechange”通知视图更新。此方案无需框架即可完成局部更新、异步加载与动态导航。

JS实现一个完整的单页应用(SPA)_javascript实战

实现一个完整的单页应用(SPA)并不需要依赖框架,用原生 J*aScript 也能完成。核心在于:路由管理、视图切换、数据绑定和组件化思想。下面一步步带你用纯 JS 实现一个简易但功能完整的 SPA。

1. 路由系统:基于 URL 的动态加载

SPA 的关键特征是不刷新页面切换视图,这依赖前端路由。我们使用 History API 来监听 URL 变化并渲染对应内容。

定义一个简单的路由表: const routes = { 'https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712': '

首页

欢迎来到主页', 'https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712www.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712linkhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712387634a1c9e6dad2026967f0a0f844f6': '

关于

这是一个用原生 JS 实现的 SPA 示例', 'https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712www.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712linkhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd8371280b7b0e690b99b5246e4b11990fb8184': async () => { https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 模拟异步加载用户数据 const res = await fetch('https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712jsonplaceholder.typicode.comhttps:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712www.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712linkhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd8371280b7b0e690b99b5246e4b11990fb8184shttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd837121'); const user = await res.json(); return `

用户信息

姓名: ${user.name}

邮箱: ${user.email}`; } };

创建路由跳转与渲染函数: function n*igate() { const path = window.location.pathname; const route = routes[path]; if (!route) { return render('

404

页面未找到'); } if (typeof route === 'function') { route().then(content => render(content)); } else { render(route); } } function render(content) { document.getElementById('app').innerHTML = content; }

监听浏览器前进后退事件: window.addEventListener('popstate', n*igate);

2. 导航链接拦截:避免页面刷新

为了让点击链接时不刷新页面,我们需要拦截所有内部链接的默认行为。

在 DOM 加载完成后绑定事件: document.addEventListener('DOMContentLoaded', function() { https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 初始化当前页面 n*igate(); https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 拦截所有 a 标签 document.addEventListener('click', e => { if (e.target.tagName === 'A' && e.target.href.startsWith(window.location.origin)) { e.preventDefault(); const href = e.target.getAttribute('href'); window.history.pushState({}, '', href); https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 更新 URL n*igate(); https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 手动触发路由 } }); });

3. 动态视图更新与组件化结构

我们可以将每个页面封装成“组件”函数,返回 HTML 字符串或 Promise。 function HomePage() { return `

? 首页

点击下方链接查看其他页面

  • 关于
  • 用户信息 `; } function AboutPage() { return `

    ℹ️ 关于

    这个 SPA 使用纯 J*aScript 构建,无任何框架。返回首页 `; }

    然后在路由表中使用这些组件: const routes = { 'https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712': HomePage(), 'https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712www.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712linkhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712387634a1c9e6dad2026967f0a0f844f6': AboutPage(), 'https:https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712www.php.cnhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712linkhttps://www.php.cn/link/29a9f8c8460e5e2be4edde557fd8371280b7b0e690b99b5246e4b11990fb8184': async () => { https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 ... 用户数据请求 } };

    4. 简易状态管理(可选扩展)

    如果需要跨页面共享数据,可以创建一个简单的状态对象和订阅机制。 const store = { user: null, setState(newState) { Object.assign(this, newState); https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 触发视图更新(可结合事件) document.dispatchEvent(new Event('statechange')); } }; https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712https://www.php.cn/link/29a9f8c8460e5e2be4edde557fd83712 在需要的地方监听状态变化 document.addEventListener('statechange', () => { console.log('状态已更新:', store); });

    基本上就这些。你已经有了一个具备路由、视图切换、异步加载和基本结构的 SPA。实际项目中可进一步封装成类或模块,加入懒加载、中间件、动画过渡等特性。核心思想不变:控制 URL,响应变化,局部更新 DOM。

    易想商务网 易想商务网

    YxB2B商务网是易想网络旗下的门户型B2B行业网站系统,采用先进的标签技术和静态生成技术,通过网站后台管理轻松实现网站前台多种风格和会员网站多风格,让每一个只要懂得简单网页制作常识的网友,轻松制作出精美专业的的行业商务网站系统。系统高速、稳定、安全,完全仿阿里巴巴功能设计,有供应信息、求购信息、产品库、公司库、专项商机、行业信息、展会服务、人才市场、会员助手、网商博客、商友论坛、全方位搜索等栏目

    易想商务网 0 查看详情 易想商务网

以上就是JS实现一个完整的单页应用(SPA)_j*ascript实战的详细内容,更多请关注其它相关文章!


# 长垣网站建设设计公司  # 绑定  # 有哪些  # 路由表  # 跳转  # 如何实现  # 搜索功能  # 许昌营销推广哪家强  # 房产获客seo  # 首页  # 长春b站关键词排名  # 东莞seo项目排名  # 主要营销推广对象是铁路  # 平谷区现代网站定制推广  # 镇江短视频seo运营  # 长沙天眼seo优化公司  # SEO导航专升本语文  # ai  # java  # html  # js  # 前端  # json  # 浏览器  # app  # 懒加载  # javascript  # 路由  # win  # 邮箱  # 异步加  # 加载  # 商务网  # 如何用 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 汽水音乐在线解析 汽水音乐在线解析入口  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  ACG动漫视频网入口 ACG动漫*免费正版观看地址  b站怎么删除评论_b站评论管理与删除操作  React中useState与局部变量:理解组件状态管理与渲染机制  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  Go语言中JSON数据解析与字段访问教程  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  steam官方入口大全 steam账号注册及操作指南  Go语言HTML解析:利用Goquery精准获取指定元素内容  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  Win11 USB传输速度慢怎么解决 Win11 USB驱动更新与设置  汽车之家官方网站官网入口_汽车之家网页版直接进入  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  微信网页版官方入口教程 微信网页版网页版快速登录步骤  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  poki网页游戏推荐_poki免费游戏平台入口  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  Kafka Streams中基于消息头条件过滤消息的实现指南  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  将HTML动态表格多行数据保存到Google Sheet的教程  Go语言中Map值调用指针接收器方法的限制与应对  海棠账号登录入口_登录海棠账户同步阅读记录  小红书网页版入口链接分享 小红书官网直接进  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  Golang指针如何与map组合使用_Golang map指针组合实践  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  照顾宝贝2小游戏免费秒玩入口  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  处理嵌套交互式控件:前端可访问性指南  抖音怎么赚钱_抖音创作者变现方法与途径指南  《噬血代码2》新预告片发布 展示游戏剧情  微博网页版主页入口 微博官方网站免登录访问  单射、满射与双射的关系 一文理清所有逻辑  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  服务端验证_j*ascript输入检查  uc浏览器网页版入口 uc浏览器网页版最新网址  UC浏览器网页版登录入口官网 电脑版网址入口  黑猫投诉统一入口官网 消费者权益保护投诉平台  c++ dfs和bfs代码 c++深度广度优先搜索算法  PostgreSQL海量数据高效导入策略:Python与Django实践指南  Win10怎么制作U盘启动盘 Win10系统安装U盘制作教程【详解】  DLsite中文平台入口 DLsite官网内容在线查看  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法 

搜索