1. 项目背景与需求分析
在医药零售行业数字化转型过程中,一个长期存在的技术痛点是如何高效管理药品与多药店之间的复杂关联关系。传统解决方案通常采用关系型数据库的表连接方式,但这在移动端应用场景下会面临性能瓶颈和开发效率问题。
我们最近在开发一个医药零售管理系统时,遇到了这样的典型场景:
- 单个药品可能同时存在于多个门店
- 每个门店对同一药品可能有不同的库存、价格和销售策略
- 需要支持快速查询某药品在所有门店的分布情况
- 同时也要能查看某门店的所有药品信息
这种多对多的关联关系如果采用传统方案,在React Native跨鸿蒙平台开发中会遇到几个棘手问题:
- 频繁的网络请求导致性能低下
- 不同平台的数据解析逻辑不一致
- 开发复杂度高,维护困难
2. 技术选型与架构设计
2.1 为什么选择嵌套数组结构
经过多次技术论证,我们最终采用了JS原生嵌套数组结构作为核心数据模型,主要基于以下考量:
性能优势:
- 一次请求即可获取完整数据关系
- 客户端本地解析,减少网络交互
- 鸿蒙和React Native都能高效处理JSON数据
开发效率:
- 前端开发者熟悉的JS语法
- 无需编写平台特定解析代码
- 调试方便,console.log直接查看数据结构
数据结构示例:
const pharmacyData = [ { pharmacyId: "P001", pharmacyName: "中心大药房", drugs: [ { drugId: "D001", stock: 50, price: 28.5 }, // 其他药品... ] }, // 其他药店... ]2.2 跨平台兼容性设计
为了实现React Native与鸿蒙平台的完美兼容,我们在架构设计上做了以下关键决策:
数据协议层:
- 统一使用JSON作为数据传输格式
- 严格定义字段类型和结构
- 添加版本控制字段应对未来变更
业务逻辑层:
- 核心业务逻辑用纯JavaScript实现
- 避免使用平台特定的API
- 关键算法进行单元测试
平台适配层:
- React Native侧使用标准组件
- 鸿蒙侧通过JS引擎直接解析
- 平台特定功能通过抽象接口实现
3. 核心实现细节
3.1 嵌套数组的数据结构设计
药品-药店关联关系的核心数据结构采用了三级嵌套设计:
- 药店列表:最外层数组包含所有药店信息
- 药品子集:每个药店对象包含该店的药品数组
- 药品详情:每个药品对象包含具体属性
// 完整数据结构示例 const data = [ { pharmacyId: "P001", name: "健康药店", location: "北京市朝阳区", drugs: [ { drugId: "D001", name: "阿莫西林胶囊", specification: "0.25g*24粒", stock: 100, price: 15.8, discount: 0.9 }, // 更多药品... ] }, // 更多药店... ]3.2 React Native侧实现
在React Native侧,我们主要解决了以下几个技术难点:
数据加载与缓存:
// 使用React Query管理数据状态 const { data, isLoading } = useQuery('pharmacyData', () => fetch('/api/pharmacy-drugs').then(res => res.json()) );列表性能优化:
// 使用FlatList实现高效渲染 <FlatList data={pharmacyData} keyExtractor={item => item.pharmacyId} renderItem={({item}) => ( <PharmacyCard pharmacy={item} onPress={() => navigation.navigate('DrugList', {drugs: item.drugs})} /> )} />复杂查询处理:
// 查找特定药品在所有药店中的分布 function findDrugDistribution(drugId) { return pharmacyData.map(pharmacy => { const drug = pharmacy.drugs.find(d => d.drugId === drugId); return drug ? {...drug, pharmacyName: pharmacy.name} : null; }).filter(Boolean); }3.3 鸿蒙端适配方案
鸿蒙平台通过内置的JavaScript引擎直接解析相同的JSON数据结构,关键实现点包括:
数据解析:
// 鸿蒙JS侧代码 export default { data: { pharmacyData: [] }, onInit() { // 从Native获取数据 const data = requireNativeModule('DataModule').getPharmacyData(); this.pharmacyData = JSON.parse(data); } }UI渲染:
// 鸿蒙的hml模板 <list> <list-item for="{{pharmacyData}}" type="pharmacy"> <div class="pharmacy-item"> <text>{{$item.name}}</text> <list> <list-item for="{{$item.drugs}}" type="drug"> <text>{{$item.name}} - 库存:{{$item.stock}}</text> </list-item> </list> </div> </list-item> </list>4. 性能优化与实践经验
4.1 数据结构优化技巧
在实际项目中,我们发现当数据量较大时(超过1000家药店,每家药店数百种药品),需要特别考虑性能问题。以下是几个有效的优化手段:
数据分片加载:
// 分批加载药店数据 async function loadPharmacyDataBatch(batchSize, lastId) { const response = await fetch( `/api/pharmacy-data?limit=${batchSize}&after=${lastId}` ); return response.json(); }内存优化:
- 使用数字ID代替字符串ID
- 对重复的药品名称使用引用
- 压缩传输数据,服务端启用gzip
本地缓存策略:
// 使用React Native的AsyncStorage缓存数据 const cacheData = async (data) => { try { await AsyncStorage.setItem( 'pharmacyDataCache', JSON.stringify(data) ); } catch (e) { console.error('缓存失败', e); } };
4.2 跨平台调试技巧
在开发过程中,我们总结了以下调试经验:
数据结构验证工具:
// 开发环境下的数据校验 if (__DEV__) { validatePharmacyDataSchema(pharmacyData); }性能分析:
- React Native使用Performance Monitor
- 鸿蒙使用HiDebug工具
- 关键操作添加时间戳日志
错误边界处理:
// React Native错误边界组件 class ErrorBoundary extends React.Component { componentDidCatch(error, info) { logErrorToService(error, info); } render() { return this.props.children; } }
4.3 实际踩坑记录
在项目开发过程中,我们遇到了几个典型问题及解决方案:
问题1:鸿蒙端数组解析异常
- 现象:某些嵌套层级的数据无法正确渲染
- 原因:鸿蒙JS引擎对深度嵌套对象的处理有差异
- 解决:将数据层级控制在3层以内,过深的结构进行扁平化处理
问题2:React Native列表卡顿
- 现象:药店列表滚动时有明显卡顿
- 解决:
// 优化方案 <FlatList initialNumToRender={10} maxToRenderPerBatch={5} windowSize={7} // 其他优化参数... />
问题3:数据同步冲突
- 场景:多端同时修改药品库存
- 方案:实现乐观UI更新+后端校验
function updateStock(drugId, newStock) { // 乐观更新 setLocalData(prev => /*...*/); // 实际请求 api.updateStock(drugId, newStock).catch(() => { // 回滚本地更改 }); }
5. 扩展应用与未来优化
当前方案已经稳定运行在多个医药零售项目中,但仍有改进空间:
数据类型扩展:
- 添加药品图片等多媒体数据
- 支持药品分类的多级树形结构
- 引入时间序列数据记录价格变动
性能进阶优化:
- 考虑使用Protocol Buffers替代JSON
- 实现增量数据更新机制
- 探索SQLite本地缓存方案
开发体验提升:
- 自动生成TypeScript类型定义
- 开发可视化数据结构编辑器
- 完善Mock数据生成工具
实践证明,基于React Native和鸿蒙的嵌套数组方案在医药零售领域具有显著优势。它不仅解决了跨平台开发的核心痛点,还通过简洁的数据结构实现了高性能的业务场景支持。这种架构思路同样适用于其他需要处理复杂关联关系的领域,如电商、物流等行业的移动应用开发。