当前位置: 首页 > news >正文

博客2:通用组件开发与布局系统

一、 开发背景

在健康管理系统中,用户界面的一致性和易用性是非常重要的。为了提高开发效率和保证界面的统一性,我们需要开发一系列通用组件和布局系统。这些组件将在整个应用中被多次复用,不仅可以减少代码冗余,还能确保用户在不同页面的操作体验一致。作为前端开发负责人,我负责设计和实现这些通用组件和布局系统,为整个应用奠定基础。

二、技术实现

1. 通用组件设计
Header 组件

- 功能 :展示应用标题、用户信息、通知和设置入口
- 实现 :

<template> <header class="header"> <div class="header-left"> <h1 class="app-title">AI-HEALTH</h1> </div> <div class="header-right"> <el-dropdown trigger="click" @command="handleUserMenu"> <span class="user-info"> <img :src="user.avatar" class="user-avatar" /> <span>{{ user.username }}</span> </span> <template #dropdown> <el-dropdown-menu> <el-dropdown-item command="profile">个人中心</el-dropdown-item> <el-dropdown-item command="settings">设置</el-dropdown-item> <el-dropdown-item command="logout">退出登录</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </header> </template>

- 亮点 :使用Element Plus的Dropdown组件实现用户菜单,响应式设计适配不同屏幕尺寸

Sidebar 组件

- 功能 :提供应用导航菜单,支持折叠/展开功能
- 实现 :

<template> <aside class="sidebar" :class="{ 'sidebar-collapsed': isCollapsed }"> <div class="sidebar-header"> <el-button @click="toggleSidebar" icon="el-icon-s-fold" circle /> </div> <nav class="sidebar-nav"> <el-menu :default-active="activeMenu" @select="handleMenuSelect" :collapse="isCollapsed" > <el-menu-item index="/dashboard"> <el-icon><Home /></el-icon> <span slot="title">仪表盘</span> </el-menu-item> <!-- 其他菜单项 --> </el-menu> </nav> </aside> </template>

- 亮点 :实现了菜单的折叠/展开功能,根据路由自动高亮当前菜单项

Layout 组件

- 功能 :整合Header和Sidebar,提供应用的整体布局
- 实现 :

<template> <div class="layout"> <Header /> <div class="layout-content"> <Sidebar /> <main class="main-content"> <router-view /> </main> </div> </div> </template>

- 亮点 :使用flex布局实现响应式设计,适配不同屏幕尺寸

ThemeToggle 组件

- 功能 :实现应用的明暗主题切换
- 实现 :

<template> <el-switch v-model="isDark" active-text="深色" inactive-text="浅色" @change="toggleTheme" /> </template> <script setup> import { useThemeStore } from '@/stores/themeStore' const themeStore = useThemeStore() const isDark = computed(() => themeStore.isDark) const toggleTheme = (value) => { themeStore.setTheme(value ? 'dark' : 'light') } </script>

- 亮点 :使用Pinia管理主题状态,实现主题的持久化存储

2. 响应式布局实现

- 技术 :使用CSS Flexbox和媒体查询实现响应式布局
- 实现 :

/* 基础布局 */ .layout-content { display: flex; height: calc(100vh - 60px); } .main-content { flex: 1; padding: 20px; overflow-y: auto; } /* 响应式适配 */ @media (max-width: 768px) { .layout-content { flex-direction: column; } .sidebar { height: auto; border-right: none; border-bottom: 1px solid #eaeaea; } }

- 亮点 :在小屏幕设备上自动调整布局,确保良好的用户体验

3. 自定义指令
lazyLoad 指令

- 功能 :实现图片的懒加载,提高页面加载速度
- 实现 :

// directives/lazyLoad.js export default { mounted(el, binding) { const imgSrc = binding.value const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { el.src = imgSrc observer.unobserve(el) } }) }) observer.observe(el) } }

- 亮点 :使用IntersectionObserver API实现高效的图片懒加载,减少页面加载时间

三、遇到的问题与解决方案

1. 响应式布局适配问题

问题 :在小屏幕设备上,Sidebar和主内容区域的布局显示异常。 解决方案 :使用媒体查询,在小屏幕设备上将flex布局方向从row改为column,确保内容垂直排列。

2. 主题切换状态管理

问题 :主题切换后,刷新页面会恢复默认主题。 解决方案 :使用localStorage存储主题设置,在应用启动时读取存储的主题设置。

3. 组件间通信

问题 :Header和Sidebar组件需要共享用户信息和菜单状态。 解决方案 :使用Pinia状态管理库,创建userStore和themeStore,实现组件间的数据共享。

4. 图片懒加载性能

问题 :大量图片的懒加载可能影响页面滚动性能。 解决方案 :优化IntersectionObserver的配置,减少不必要的观察,提高性能。

四、效果展示

1.通用组件效果

- Header :显示应用标题和用户信息,点击用户头像展开菜单
- Sidebar :提供应用导航菜单,支持折叠/展开功能
- Layout :整合Header和Sidebar,提供响应式布局
- ThemeToggle :实现明暗主题切换,实时更新界面样式
- lazyLoad :图片进入视口时才加载,提高页面加载速度

2、响应式布局效果

- 桌面端 :Sidebar和主内容区域水平排列
- 平板端 :Sidebar可折叠,主内容区域自适应
- 移动端 :Sidebar自动隐藏,通过菜单按钮展开

五、总结与反思

总结

- 成功开发了一系列通用组件,包括Header、Sidebar、Layout、ThemeToggle等
- 实现了响应式布局,适配不同屏幕尺寸
- 开发了自定义指令lazyLoad,提高页面加载速度
- 使用Pinia管理应用状态,实现组件间的通信

反思

- 通用组件的设计应更加模块化,便于后续扩展
- 响应式布局的适配需要考虑更多设备尺寸
- 主题切换功能可以进一步优化,支持更多自定义主题
- 图片懒加载可以结合预加载策略,提升用户体验

后续计划

- 开发健康数据记录组件
- 实现数据可视化功能
- 集成AI助手功能
- 优化用户认证流程
- 完善个人中心功能

http://www.jsqmd.com/news/632274/

相关文章:

  • 2026年可靠四川找人公司价格盘点:四川找人公司电话/四川找人公司网址/成都商务调查公司价格/成都商务调查公司品牌/选择指南 - 优质品牌商家
  • LeetCode 删除无效的括号:python 题解恳
  • 正规社交软件源码品牌大揭秘,市场热门之选!
  • C语言变量与数据类型笔记(狗都能听懂版)
  • STM32F407VET6+TB6612驱动4路直流电机:从硬件接线到PID调参全流程实战
  • 年没人敢碰的老代码,我用AI重构了它——然后翻车了址
  • 开源家政服务小程序源码系统 完整前后端+搭建教程
  • 基于yolo26算法的大坝缺陷识别 智慧水利工程监测 防寒抗洪监测 水坝安全防护监测 水利工程安全监测 坝体结构状态分析第10428期
  • mqtt-plus 架构解析(六):多 Broker 管理,如何让一个应用同时连接多个 MQTT 服务
  • 2026年Q2宜宾优质单位搬家服务标杆名录及选购指南:宜宾酒店宾馆搬迁/搬迁公司/宜宾个人搬家/宜宾仓库搬迁/宜宾企事业单位搬迁/选择指南 - 优质品牌商家
  • SimpleIOT SDK:ESP32接入AWS IoT的轻量级C++框架
  • 游戏虚拟资产交易安全技术解析:以三角洲生态为例
  • 义乌微创医院怎么样:专业、暖心、值得信赖的健康守护者
  • GraphRAG开源生态全景:大主流开源项目,微软/蚂蚁/港大项目同台PK郊
  • Function Calling不是加个JSON Schema就完事:2026奇点大会披露的3个被92%团队忽略的语义对齐漏洞
  • 如何用c# 做 mcp/ChatGPT app室
  • dplyr和tidyr用法亚
  • Elasticvue:轻量级Elasticsearch图形化管理工具的全方位解析
  • 笔试训练48天:过河卒
  • 一天一个Python库:greenlet - 轻量级并发,协程切换的基石液
  • 使用腾讯云COS作为WordPress图床的实践
  • 为什么92%的企业选错推理硬件?SITS2026 2026Q1实测数据揭示:模型精度损失>0.8%的隐性成本藏在这3个硬件参数里
  • wso~.升级到.需要更新的数据表凭
  • 手把手教你用MATLAB实现自适应噪声抵消:从PPG信号去噪到代码实战
  • AI 时代,计算机专业学生该怎么学?伎
  • ESP8266 AT驱动库:嵌入式WiFi透传中间件设计与实践
  • PHP中文网源码:免费网站源码与电商系统下载,适合PHP开发者学习交流
  • 2026优质口腔医院根管治疗名录:牙齿不齐怎么做牙齿矫正、牙齿矫正一般多少钱、牙齿矫正哪家医院好、牙齿矫正费用选择指南 - 优质品牌商家
  • victor.x.qu谟
  • 【windows11_config】:电源按钮配置——取消按钮【sleep】【lock】