基于HarmonyOS API 24 React Native鸿蒙在跨端传递时会被强制校验,避免因鸿蒙ArkTS的静态类型特性与JavaScript动态类型特性导致逻辑错误
在公共卫生与智慧医疗融合的趋势下,疫苗接种管理类应用需要兼顾医疗数据的精准性、接种计划的智能推送以及多终端的适配能力。鸿蒙系统的分布式全场景特性为医疗应用跨端部署提供了天然优势,而React Native则凭借“一次开发、多端运行”的特性,成为这类应用跨端开发的核心技术底座。本文将从数据模型设计、核心业务逻辑、UI适配到鸿蒙跨端兼容的底层实现,全方位拆解这款疫苗接种计划应用的技术架构,剖析React Native与鸿蒙生态深度融合的关键技术要点。
跨端架构
这款疫苗接种管理应用的核心架构遵循React Native的“通用抽象层+平台适配层”设计原则,所有核心功能均基于React Native的通用API(View、TextInput、Modal、TouchableOpacity)和Hooks体系构建,未引入任何平台专属代码,这是实现鸿蒙跨端兼容的核心前提。
从底层适配逻辑来看,React Native for HarmonyOS框架会将React Native的通用组件无缝映射为鸿蒙ArkUI的原生组件:TouchableOpacity对应鸿蒙的Button原生组件,保留点击反馈的同时适配鸿蒙的交互规范;TextInput映射为鸿蒙的TextInput控件,保证输入框在鸿蒙设备上的响应速度和输入体验;Modal组件转换为鸿蒙的Dialog原生模态框,适配鸿蒙系统的弹窗交互逻辑;Alert则调用鸿蒙的系统级弹窗能力,确保提示信息的原生展示效果。这种映射机制不仅保证了UI渲染和交互逻辑在鸿蒙设备上的一致性,更规避了因平台差异导致的代码碎片化问题,尤其适配了疫苗接种管理这类对操作安全性要求较高的医疗场景。
此外,应用通过Dimensions.get('window')获取设备屏幕尺寸,该API在鸿蒙系统中会被React Native框架适配为鸿蒙的getWindowSize原生能力,能够精准获取不同形态鸿蒙设备(手机、平板、智慧屏)的屏幕参数,保证了布局在多终端上的自适应展示——例如在鸿蒙平板上展示完整的疫苗接种计划详情,在手机上则呈现精简的预约记录列表,符合医疗应用多终端展示的核心需求。
强类型数据模型:
疫苗接种管理的核心是医疗数据的精准性和完整性,代码中通过TypeScript构建了多层级的强类型数据模型,从用户档案、疫苗信息到接种计划、预约记录,形成了闭环的医疗数据体系,既规避了前端开发中的类型错误,又在跨端编译阶段拦截了数据格式偏差,适配鸿蒙ArkTS的静态类型特性。
// 用户档案模型:整合基础信息与病史,适配疫苗接种评估需求
type User = {
id: string;
name: string;
age: number; // 数值型年龄,为疫苗推荐年龄校验提供基础
gender: string;
medicalHistory: string[]; // 数组型病史,兼容多病史场景
};
// 疫苗核心模型:标准化接种关键信息
type Vaccine = {
id: string;
name: string;
description: string;
recommendedAge: number; // 数值型推荐年龄,支持跨端数值比较
doseSchedule: string; // 字符串型接种周期,适配自然语言描述
};
// 接种计划模型:用户-疫苗的业务关联核心
type VaccinationPlan = {
id: string;
userId: string;
vaccines: Vaccine[]; // 多疫苗集合,适配组合接种场景
};
// 预约记录模型:对接线下接种流程
type Appointment = {
id: string;
userId: string;
vaccineId: string;
appointmentDate: string; // 字符串型日期,兼容跨端日期格式
status: string; // 字符串型状态,适配"已预约/已接种"等场景
};
这些类型定义严格约束了疫苗接种相关数据的格式和类型,在鸿蒙系统中,React Native的TypeScript编译器会对JS层与鸿蒙ArkTS层之间的数据交互进行严格校验。例如,recommendedAge(疫苗推荐年龄)作为数值类型,在跨端传递时会被强制校验,避免因鸿蒙ArkTS的静态类型特性与JavaScript动态类型特性不兼容导致的疫苗推荐逻辑错误;medicalHistory采用数组类型存储用户病史,既满足多病史记录的业务需求,又保证了跨端数据解析的一致性,符合医疗数据标准化的行业规范。
应用的核心业务逻辑(疫苗接种计划智能推送、预约记录管理)均基于React Hooks(useState、useEffect)实现,这种轻量级的状态管理方式完美适配React Native的跨端生命周期模型,同时与鸿蒙组件的生命周期深度融合,保障了核心医疗逻辑的跨端稳定运行。
状态设计与不可变更新:
应用通过useState管理核心数据状态,采用“不可变更新”的方式修改状态,避免了引用类型数据在跨端环境下的共享冲突。例如,添加新的疫苗接种预约时,通过解构赋值创建新数组副本:
setAppointments([...appointments, newAppt]);
这种不可变更新策略在鸿蒙系统中尤为关键——鸿蒙的分布式数据管理要求数据副本的一致性,不可变更新保证了每次状态变更都会生成新的数据源,避免了多端数据同步时的冲突问题,确保疫苗预约记录在鸿蒙多设备间的同步准确性。
疫苗接种计划智能推送:
应用通过useEffect实现每分钟一次的疫苗接种计划智能推送,这一核心逻辑在鸿蒙系统中稳定运行的核心在于:setInterval/clearInterval是React Native封装的通用定时器API,已适配鸿蒙的任务调度机制;useEffect的返回清理函数对应鸿蒙组件的onDestroy生命周期,确保定时器在组件卸载时被销毁,避免鸿蒙设备的内存泄漏。
useEffect(() => {
const interval = setInterval(() => {
const randomUser = users[Math.floor(Math.random() * users.length)];
// 基于年龄的疫苗推荐逻辑,跨端数值比较无偏差
const recommendedVaccines = vaccines.filter(vaccine => vaccine.recommendedAge <= randomUser.age);
const newPlan: VaccinationPlan = {
id: (vaccinationPlans.length + 1).toString(),
userId: randomUser.id,
vaccines: recommendedVaccines
};
setVaccinationPlans([...vaccinationPlans, newPlan]);
}, 60000);
return () => clearInterval(interval); // 适配鸿蒙组件销毁生命周期
}, [users, vaccines, vaccinationPlans]);
推荐逻辑中使用的数组filter方法是ES6通用API,在鸿蒙系统中会被React Native框架转换为ArkTS的数组过滤逻辑,保证了不同平台下疫苗推荐结果的一致性,避免了因平台API差异导致的接种计划推送错误,符合疫苗接种管理的医疗安全要求。
应用的UI层基于React Native的StyleSheet统一管理样式,既保证了鸿蒙系统中的原生渲染效果,又兼顾了疫苗接种管理应用对数据展示清晰性、操作安全性的特殊要求。
跨端
StyleSheet将CSS样式抽象为跨平台的样式对象,核心样式属性(flex、borderRadius、padding、elevation)在鸿蒙系统中会被精准转换为ArkUI的布局属性。例如:
const styles = StyleSheet.create({
section: {
backgroundColor: '#ffffff',
marginHorizontal: 16,
borderRadius: 12,
padding: 16,
// 阴影跨端适配:elevation适配鸿蒙/Android,shadow系列适配iOS
elevation: 2,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
},
input: {
flex: 1,
backgroundColor: '#f0f9ff', // 医疗场景专属浅蓝主题,适配鸿蒙视觉规范
borderRadius: 8,
paddingHorizontal: 12,
paddingVertical: 8,
fontSize: 14,
color: '#0c4a6e',
}
});
其中,elevation属性在鸿蒙系统中会被解析为原生的阴影层级,borderRadius适配鸿蒙的圆角渲染规则,保证了UI视觉效果的跨端一致性;医疗场景专属的浅蓝主题(#f0f9ff)既符合医疗应用的视觉规范,又适配鸿蒙系统的色彩体系,提升了疫苗接种管理界面的专业度和可读性。
交互组件
核心交互组件TouchableOpacity在鸿蒙系统中会被渲染为具备原生点击反馈的按钮,选中态的selectedCard样式(边框高亮)能够清晰标识当前选择的用户/疫苗,符合医疗应用“操作可追溯、状态可识别”的核心要求。用于录入预约日期的TextInput组件采用标准化的输入格式提示(YYYY-MM-DD),在鸿蒙设备上保证了日期输入的规范性,避免因平台输入组件差异导致的预约信息错误。
Modal组件通过animationType="slide"实现滑动弹窗效果,在鸿蒙系统中适配为原生的滑动模态框,用于展示疫苗接种计划详情、预约记录等核心医疗信息,既保证了数据展示的完整性,又符合鸿蒙系统的交互规范,提升了用户操作的安全性。
当前代码已实现基础的鸿蒙跨端兼容,在生产环境中,可针对鸿蒙系统的特性和疫苗接种管理的业务需求进行深度优化,进一步提升应用的医疗服务能力:
1. 高性能列表
应用中疫苗接种计划、预约记录等列表采用ScrollView + map的方式渲染,在鸿蒙系统中面对大量历史接种数据时可能出现卡顿。可替换为React Native的FlatList组件,该组件在鸿蒙系统中会适配ArkUI的List原生组件,实现按需渲染和组件复用,通过getItemLayout优化列表滚动性能,尤其适合展示用户长期的疫苗接种记录和预约历史。
2. 鸿蒙原生
疫苗接种提醒是核心业务需求,可通过React Native的Native Module机制封装鸿蒙的NotificationKit和AlarmManager原生API,将预约日期同步到鸿蒙的系统级提醒能力。例如,将Appointment中的appointmentDate对接鸿蒙的系统闹钟,实现跨鸿蒙设备(手机、智能手表)的接种提醒同步,充分利用鸿蒙的分布式能力提升用户的接种依从性。
3. 分布式
基于鸿蒙的分布式数据管理能力,可通过React Native的跨端通信机制,实现疫苗接种数据在多鸿蒙设备间的同步。例如,用户在手机上预约的疫苗接种时间,可实时同步到鸿蒙平板的社区医疗端和智能手表的个人端,医护人员可通过平板查看辖区内用户的接种预约情况,用户则通过手表接收接种提醒,形成“用户-医护-设备”的闭环管理。
这款基于React Native开发的疫苗接种管理应用,通过强类型数据模型、React Hooks状态管理和通用UI组件设计,构建了具备完整鸿蒙跨端兼容能力的医疗应用架构,核心技术要点可总结为:
- 通用API选型是实现鸿蒙兼容的基础,基于React Native通用组件构建核心逻辑,规避平台专属代码,保证了疫苗接种管理UI和交互的跨端一致性;
- TypeScript强类型约束不仅提升疫苗数据的精准性,更适配鸿蒙ArkTS的静态类型特性,避免跨端数据交互中的类型错误,保障接种计划推荐逻辑的准确性;
- React Hooks状态管理与鸿蒙组件生命周期深度融合,保障了疫苗接种计划智能推送等周期性任务的跨端稳定运行;
- 统一的StyleSheet样式系统实现了UI在鸿蒙设备上的原生渲染,兼顾疫苗接种管理应用的数据展示清晰性和操作安全性。
在公共卫生领域,疫苗接种是预防疾病的重要手段。本文将深入剖析一个基于 React Native 构建的疫苗接种计划应用,探讨其技术实现细节及鸿蒙跨端能力的应用。
技术选型
该应用采用了现代 React Native 函数式组件架构,通过 TypeScript 类型系统和 React Hooks 实现了一个功能完整的疫苗接种管理系统。核心技术栈包括:
- React Native:作为跨端开发框架,提供了统一的组件 API,确保应用在 iOS、Android 及鸿蒙平台上的一致性体验
- TypeScript:通过严格的类型定义增强代码可维护性,明确了数据结构和组件接口
- React Hooks:使用 useState 管理应用状态,useEffect 处理副作用逻辑,实现了声明式的状态管理
- Base64 图标:采用 Base64 编码的图标资源,避免了不同平台资源格式的差异,提高了跨端兼容性
- 响应式布局:使用 Dimensions API 获取屏幕尺寸,实现适配不同设备的响应式界面
数据模型
应用通过 TypeScript 接口定义了四个核心数据类型,构建了完整的疫苗接种数据模型体系:
// 用户类型
type User = {
id: string;
name: string;
age: number;
gender: string;
medicalHistory: string[];
};
// 疫苗类型
type Vaccine = {
id: string;
name: string;
description: string;
recommendedAge: number;
doseSchedule: string;
};
// 疫苗接种计划类型
type VaccinationPlan = {
id: string;
userId: string;
vaccines: Vaccine[];
};
// 预约记录类型
type Appointment = {
id: string;
userId: string;
vaccineId: string;
appointmentDate: string;
status: string;
};
这种强类型设计不仅提高了代码可读性,也为鸿蒙跨端适配提供了清晰的数据契约,确保不同平台间数据传递的一致性。数据模型的设计充分考虑了疫苗接种管理的核心要素,包含了用户信息、疫苗信息、接种计划和预约记录等关键数据。
状态管理
应用使用 useState Hook 管理多个复杂状态,包括用户列表、疫苗列表、接种计划、预约记录等:
const [users] = useState<User[]>([
{
id: '1',
name: '李先生',
age: 45,
gender: '男',
medicalHistory: ['高血压', '糖尿病']
},
{
id: '2',
name: '王女士',
age: 32,
gender: '女',
medicalHistory: ['过敏史']
}
]);
// 其他状态定义...
特别值得注意的是,应用通过 useEffect 实现了疫苗接种计划的自动推送机制:
// 自动推送疫苗接种计划
useEffect(() => {
const interval = setInterval(() => {
const randomUser = users[Math.floor(Math.random() * users.length)];
const recommendedVaccines = vaccines.filter(vaccine => vaccine.recommendedAge <= randomUser.age);
const newPlan: VaccinationPlan = {
id: (vaccinationPlans.length + 1).toString(),
userId: randomUser.id,
vaccines: recommendedVaccines
};
setVaccinationPlans([...vaccinationPlans, newPlan]);
}, 60000);
return () => clearInterval(interval);
}, [users, vaccines, vaccinationPlans]);
这种基于时间间隔的自动推送机制,模拟了真实场景中医生根据患者年龄和健康状况推荐疫苗的过程,为用户提供了个性化的疫苗接种建议。同时,通过 useEffect 的清理函数,确保了定时器在组件卸载时被正确清除,避免了内存泄漏。
在 React Native 鸿蒙跨端开发中,该应用体现了以下关键技术点:
- 组件兼容性:使用 React Native 核心组件(如 SafeAreaView、View、Text、TouchableOpacity、ScrollView、Modal 等),确保在鸿蒙系统上的兼容性
- 资源管理:通过 Base64 编码的图标资源,避免了不同平台资源格式的差异,提高了跨端部署的一致性
- 尺寸适配:使用 Dimensions API 获取屏幕尺寸,实现响应式布局,适应不同设备屏幕
- 状态管理:采用 React Hooks 进行状态管理,保持跨平台代码一致性
- 类型安全:TypeScript 类型定义确保了数据结构在不同平台间的一致性
- API 调用:使用 React Native 统一的 API 调用方式,如 Alert 组件,确保在鸿蒙平台上的正确显示
疫苗接种
应用实现了基于用户年龄和健康状况的疫苗接种计划管理,系统会自动根据用户信息推荐适合的疫苗:
const recommendedVaccines = vaccines.filter(vaccine => vaccine.recommendedAge <= randomUser.age);
const newPlan: VaccinationPlan = {
id: (vaccinationPlans.length + 1).toString(),
userId: randomUser.id,
vaccines: recommendedVaccines
};
setVaccinationPlans([...vaccinationPlans, newPlan]);
疫苗预约功能
应用提供了疫苗接种的预约功能,用户可以选择疫苗和预约日期:
const handleMakeAppointment = () => {
if (newAppointment.date && selectedUser && selectedVaccine) {
const newAppt: Appointment = {
id: (appointments.length + 1).toString(),
userId: selectedUser,
vaccineId: selectedVaccine,
appointmentDate: newAppointment.date,
status: '已预约'
};
setAppointments([...appointments, newAppt]);
setNewAppointment({ date: '' });
Alert.alert('预约成功', '新的疫苗接种预约已添加');
} else {
Alert.alert('提示', '请选择用户和疫苗并填写预约日期');
}
};
计划与预约查看
应用实现了疫苗接种计划和预约记录的查看功能,通过模态框展示详细信息:
const handleViewPlan = (planId: string) => {
const plan = vaccinationPlans.find(p => p.id === planId);
if (plan) {
const user = users.find(u => u.id === plan.userId);
const vaccinesList = plan.vaccines.map(vaccine => `${vaccine.name}: ${vaccine.description}`).join('\n');
setModalContent(`用户: ${user?.name}\n疫苗接种计划:\n${vaccinesList}`);
setIsModalVisible(true);
}
};
const handleViewAppointment = (appointmentId: string) => {
const appointment = appointments.find(a => a.id === appointmentId);
if (appointment) {
const user = users.find(u => u.id === appointment.userId);
const vaccine = vaccines.find(v => v.id === appointment.vaccineId);
setModalContent(`用户: ${user?.name}\n疫苗: ${vaccine?.name}\n预约日期: ${appointment.appointmentDate}\n状态: ${appointment.status}`);
setIsModalVisible(true);
}
};
应用的 UI 设计遵循了现代移动应用的设计原则,使用了以下组件和交互模式:
- 安全区域:通过 SafeAreaView 确保内容显示在安全区域内,适应不同设备的屏幕刘海和底部指示条
- 滚动视图:通过 ScrollView 实现内容的垂直滚动,适应不同长度的用户列表和疫苗信息
- 卡片布局:使用 TouchableOpacity 和 View 组合实现卡片式列表项,提供清晰的视觉层次和交互反馈
- 模态框:通过 Modal 组件展示详细信息,如疫苗接种计划、预约记录等
- 交互反馈:使用 Alert 组件提供操作反馈和提示信息
- 响应式设计:根据屏幕尺寸动态调整布局,确保在不同设备上的良好显示效果
- 跨端架构:基于 React Native 构建,实现了一次编码多平台运行的目标,特别关注了鸿蒙平台的适配
- 类型安全:全面使用 TypeScript 类型定义,提高代码质量和可维护性,确保疫苗数据的准确性
- 智能疫苗推荐:根据用户年龄自动推荐适合的疫苗,实现了个性化的疫苗接种计划
- 自动化推送:通过定时任务自动推送疫苗接种计划,模拟了真实的医疗服务场景
- 在线预约功能:实现了疫苗接种的在线预约,提高了服务效率
- 模块化设计:通过清晰的类型定义和函数划分,实现了代码的模块化,提高了可维护性
- 实时数据反馈:通过即时的 Alert 反馈,增强用户操作体验
- 数据结构设计:通过嵌套的数据结构,如接种计划包含疫苗,实现了复杂医疗数据的有效组织
- 医疗历史考虑:用户类型中包含了 medicalHistory 字段,为后续基于病史的疫苗推荐提供了扩展空间
在实际应用中,还可以考虑以下性能优化策略:
- 状态管理优化:对于大型应用,可以考虑使用 Redux 或 Context API 进行全局状态管理,提高状态更新的效率
- 组件拆分:将大型组件拆分为更小的可复用组件,提高渲染性能和代码可维护性
- 数据缓存:对用户数据和疫苗信息进行本地缓存,减少重复计算和网络请求
- 动画性能:使用 React Native 的 Animated API 实现流畅的过渡动画,提升用户体验
- 内存管理:确保及时清理不再使用的状态和事件监听器,避免内存泄漏
- 网络优化:对于实际应用中的远程数据同步,实现合理的网络请求策略,如批量上传、增量同步等
- 计算优化:对于疫苗推荐等逻辑,可以考虑使用 memoization 技术缓存计算结果
- 列表优化:对于长列表,使用 FlatList 组件替代 ScrollView,提高渲染性能
在开发过程中,可能面临的技术挑战及解决方案:
- 鸿蒙平台适配:通过使用 React Native 核心组件和统一的 API 调用方式,确保应用在鸿蒙平台上的兼容性
- 疫苗数据更新:建立疫苗数据的定期更新机制,确保疫苗信息的准确性和时效性
- 实时预约管理:结合后端服务,实现预约状态的实时更新和冲突检测
- 数据安全:实现医疗数据的加密存储和传输,保护用户隐私
- 离线功能:实现基本的离线操作能力,确保在网络不稳定情况下的正常使用
- 性能优化:针对不同设备性能差异,实现自适应的性能优化策略,确保在中低端设备上的流畅运行
- 多语言支持:实现多语言支持,满足不同地区用户的需求
- 无障碍访问:确保应用符合无障碍访问标准,方便行动不便的用户使用
通过对这个疫苗接种计划应用的技术解读,我们可以看到 React Native 在跨端开发中的强大能力。该应用不仅实现了完整的疫苗接种管理功能,还展示了如何通过 TypeScript、React Hooks 等现代前端技术构建高质量的跨端应用。
真实演示案例代码:
// App.tsx
import React, { useState, useEffect } from 'react';
import { SafeAreaView, View, Text, StyleSheet, TouchableOpacity, ScrollView, Dimensions, Alert, TextInput, Modal } from 'react-native';
// Base64 图标库
const ICONS_BASE64 = {
vaccine: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
history: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
appointment: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
plan: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
};
const { width, height } = Dimensions.get('window');
// 用户类型
type User = {
id: string;
name: string;
age: number;
gender: string;
medicalHistory: string[];
};
// 疫苗类型
type Vaccine = {
id: string;
name: string;
description: string;
recommendedAge: number;
doseSchedule: string;
};
// 疫苗接种计划类型
type VaccinationPlan = {
id: string;
userId: string;
vaccines: Vaccine[];
};
// 预约记录类型
type Appointment = {
id: string;
userId: string;
vaccineId: string;
appointmentDate: string;
status: string;
};
// 疫苗接种计划应用组件
const VaccinationPlanApp: React.FC = () => {
const [users] = useState<User[]>([
{
id: '1',
name: '李先生',
age: 45,
gender: '男',
medicalHistory: ['高血压', '糖尿病']
},
{
id: '2',
name: '王女士',
age: 32,
gender: '女',
medicalHistory: ['过敏史']
}
]);
const [vaccines] = useState<Vaccine[]>([
{
id: '1',
name: '流感疫苗',
description: '预防季节性流感',
recommendedAge: 6,
doseSchedule: '每年一次'
},
{
id: '2',
name: '肺炎疫苗',
description: '预防肺炎球菌感染',
recommendedAge: 65,
doseSchedule: '每五年一次'
}
]);
const [vaccinationPlans, setVaccinationPlans] = useState<VaccinationPlan[]>([
{
id: '1',
userId: '1',
vaccines: [
{
id: '1',
name: '流感疫苗',
description: '预防季节性流感',
recommendedAge: 6,
doseSchedule: '每年一次'
}
]
}
]);
const [appointments, setAppointments] = useState<Appointment[]>([
{
id: '1',
userId: '1',
vaccineId: '1',
appointmentDate: '2023-12-15',
status: '已预约'
}
]);
const [selectedUser, setSelectedUser] = useState<string | null>(null);
const [selectedVaccine, setSelectedVaccine] = useState<string | null>(null);
const [newAppointment, setNewAppointment] = useState({
date: ''
});
const [isModalVisible, setIsModalVisible] = useState(false);
const [modalContent, setModalContent] = useState('');
// 自动推送疫苗接种计划
useEffect(() => {
const interval = setInterval(() => {
const randomUser = users[Math.floor(Math.random() * users.length)];
const recommendedVaccines = vaccines.filter(vaccine => vaccine.recommendedAge <= randomUser.age);
const newPlan: VaccinationPlan = {
id: (vaccinationPlans.length + 1).toString(),
userId: randomUser.id,
vaccines: recommendedVaccines
};
setVaccinationPlans([...vaccinationPlans, newPlan]);
}, 60000);
return () => clearInterval(interval);
}, [users, vaccines, vaccinationPlans]);
const handleSelectUser = (userId: string) => {
setSelectedUser(userId);
Alert.alert('选择用户', '您已选择该用户进行疫苗接种管理');
};
const handleSelectVaccine = (vaccineId: string) => {
setSelectedVaccine(vaccineId);
Alert.alert('选择疫苗', '您已选择该疫苗进行预约');
};
const handleMakeAppointment = () => {
if (newAppointment.date && selectedUser && selectedVaccine) {
const newAppt: Appointment = {
id: (appointments.length + 1).toString(),
userId: selectedUser,
vaccineId: selectedVaccine,
appointmentDate: newAppointment.date,
status: '已预约'
};
setAppointments([...appointments, newAppt]);
setNewAppointment({ date: '' });
Alert.alert('预约成功', '新的疫苗接种预约已添加');
} else {
Alert.alert('提示', '请选择用户和疫苗并填写预约日期');
}
};
const handleViewPlan = (planId: string) => {
const plan = vaccinationPlans.find(p => p.id === planId);
if (plan) {
const user = users.find(u => u.id === plan.userId);
const vaccinesList = plan.vaccines.map(vaccine => `${vaccine.name}: ${vaccine.description}`).join('\n');
setModalContent(`用户: ${user?.name}\n疫苗接种计划:\n${vaccinesList}`);
setIsModalVisible(true);
}
};
const handleViewAppointment = (appointmentId: string) => {
const appointment = appointments.find(a => a.id === appointmentId);
if (appointment) {
const user = users.find(u => u.id === appointment.userId);
const vaccine = vaccines.find(v => v.id === appointment.vaccineId);
setModalContent(`用户: ${user?.name}\n疫苗: ${vaccine?.name}\n预约日期: ${appointment.appointmentDate}\n状态: ${appointment.status}`);
setIsModalVisible(true);
}
};
const openModal = (content: string) => {
setModalContent(content);
setIsModalVisible(true);
};
const closeModal = () => {
setIsModalVisible(false);
};
return (
<SafeAreaView style={styles.container}>
{/* 头部 */}
<View style={styles.header}>
<Text style={styles.title}>疫苗接种计划</Text>
<Text style={styles.subtitle}>根据用户年龄、病史自动推送疫苗接种计划,支持在线预约接种时间</Text>
</View>
<ScrollView style={styles.content}>
{/* 用户列表 */}
<View style={styles.section}>
<Text style={styles.sectionTitle}>用户列表</Text>
{users.map(user => (
<TouchableOpacity
key={user.id}
style={[
styles.card,
selectedUser === user.id && styles.selectedCard
]}
onPress={() => handleSelectUser(user.id)}
>
<Text style={styles.icon}>👤</Text>
<View style={styles.cardInfo}>
<Text style={styles.cardTitle}>{user.name}</Text>
<Text style={styles.cardDescription}>年龄: {user.age}</Text>
<Text style={styles.cardDescription}>性别: {user.gender}</Text>
<Text style={styles.cardDescription}>病史: {user.medicalHistory.join(', ')}</Text>
</View>
</TouchableOpacity>
))}
</View>
{/* 疫苗列表 */}
<View style={styles.section}>
<Text style={styles.sectionTitle}>疫苗列表</Text>
{vaccines.map(vaccine => (
<TouchableOpacity
key={vaccine.id}
style={[
styles.card,
selectedVaccine === vaccine.id && styles.selectedCard
]}
onPress={() => handleSelectVaccine(vaccine.id)}
>
<Text style={styles.icon}>💉</Text>
<View style={styles.cardInfo}>
<Text style={styles.cardTitle}>{vaccine.name}</Text>
<Text style={styles.cardDescription}>描述: {vaccine.description}</Text>
<Text style={styles.cardDescription}>推荐年龄: {vaccine.recommendedAge}岁+</Text>
<Text style={styles.cardDescription}>接种计划: {vaccine.doseSchedule}</Text>
</View>
</TouchableOpacity>
))}
</View>
{/* 疫苗接种计划 */}
<View style={styles.section}>
<Text style={styles.sectionTitle}>疫苗接种计划</Text>
{vaccinationPlans.map(plan => (
<TouchableOpacity
key={plan.id}
style={styles.planCard}
onPress={() => handleViewPlan(plan.id)}
>
<Text style={styles.icon}>📋</Text>
<View style={styles.cardInfo}>
<Text style={styles.cardTitle}>计划ID: {plan.id}</Text>
<Text style={styles.cardDescription}>疫苗数量: {plan.vaccines.length}</Text>
</View>
</TouchableOpacity>
))}
</View>
{/* 预约接种时间 */}
<View style={styles.section}>
<Text style={styles.sectionTitle}>预约接种时间</Text>
<View style={styles.inputRow}>
<TextInput
style={styles.input}
placeholder="预约日期 (YYYY-MM-DD)"
value={newAppointment.date}
onChangeText={(text) => setNewAppointment({ ...newAppointment, date: text })}
/>
</View>
<TouchableOpacity
style={styles.addButton}
onPress={handleMakeAppointment}
>
<Text style={styles.addText}>预约接种</Text>
</TouchableOpacity>
</View>
{/* 预约记录 */}
<View style={styles.section}>
<Text style={styles.sectionTitle}>预约记录</Text>
{appointments.map(appointment => (
<TouchableOpacity
key={appointment.id}
style={styles.appointmentCard}
onPress={() => handleViewAppointment(appointment.id)}
>
<Text style={styles.icon}>📅</Text>
<View style={styles.cardInfo}>
<Text style={styles.cardTitle}>预约ID: {appointment.id}</Text>
<Text style={styles.cardDescription}>预约日期: {appointment.appointmentDate}</Text>
<Text style={styles.cardDescription}>状态: {appointment.status}</Text>
</View>
</TouchableOpacity>
))}
</View>
{/* 使用说明 */}
<View style={styles.infoCard}>
<Text style={styles.sectionTitle}>📘 使用说明</Text>
<Text style={styles.infoText}>• 选择用户进行疫苗接种管理</Text>
<Text style={styles.infoText}>• 查看推荐的疫苗接种计划</Text>
<Text style={styles.infoText}>• 在线预约疫苗接种时间</Text>
<Text style={styles.infoText}>• 跟踪预约记录和接种状态</Text>
</View>
{/* 弹框内容 */}
<Modal
animationType="slide"
transparent={true}
visible={isModalVisible}
onRequestClose={closeModal}
>
<View style={styles.modalContainer}>
<View style={styles.modalContent}>
<Text style={styles.modalTitle}>详细信息</Text>
<Text style={styles.modalText}>{modalContent}</Text>
<TouchableOpacity
style={styles.closeButton}
onPress={closeModal}
>
<Text style={styles.closeButtonText}>关闭</Text>
</TouchableOpacity>
</View>
</View>
</Modal>
</ScrollView>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#f0f9ff',
},
header: {
flexDirection: 'column',
padding: 16,
backgroundColor: '#ffffff',
borderBottomWidth: 1,
borderBottomColor: '#bae6fd',
},
title: {
fontSize: 20,
fontWeight: 'bold',
color: '#0c4a6e',
marginBottom: 4,
},
subtitle: {
fontSize: 14,
color: '#0284c7',
},
content: {
flex: 1,
marginTop: 12,
},
section: {
backgroundColor: '#ffffff',
marginHorizontal: 16,
marginBottom: 12,
borderRadius: 12,
padding: 16,
elevation: 2,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
},
sectionTitle: {
fontSize: 16,
fontWeight: '600',
color: '#0c4a6e',
marginBottom: 12,
},
card: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: '#f0f9ff',
borderRadius: 12,
padding: 16,
marginBottom: 12,
},
selectedCard: {
borderWidth: 2,
borderColor: '#0284c7',
},
planCard: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: '#f0f9ff',
borderRadius: 12,
padding: 16,
marginBottom: 12,
},
appointmentCard: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: '#f0f9ff',
borderRadius: 12,
padding: 16,
marginBottom: 12,
},
icon: {
fontSize: 28,
marginRight: 12,
},
cardInfo: {
flex: 1,
},
cardTitle: {
fontSize: 16,
fontWeight: '500',
color: '#0c4a6e',
marginBottom: 4,
},
cardDescription: {
fontSize: 14,
color: '#0284c7',
marginBottom: 2,
},
inputRow: {
flexDirection: 'row',
justifyContent: 'space-between',
marginBottom: 12,
},
input: {
flex: 1,
backgroundColor: '#f0f9ff',
borderRadius: 8,
paddingHorizontal: 12,
paddingVertical: 8,
fontSize: 14,
color: '#0c4a6e',
marginRight: 8,
},
addButton: {
backgroundColor: '#0284c7',
padding: 12,
borderRadius: 8,
alignItems: 'center',
},
addText: {
color: '#ffffff',
fontSize: 14,
fontWeight: '500',
},
infoCard: {
backgroundColor: '#ffffff',
marginHorizontal: 16,
marginBottom: 80,
borderRadius: 12,
padding: 16,
elevation: 2,
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
},
infoText: {
fontSize: 14,
color: '#64748b',
lineHeight: 20,
marginBottom: 4,
},
modalContainer: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'rgba(0, 0, 0, 0.5)',
},
modalContent: {
width: '80%',
backgroundColor: '#ffffff',
borderRadius: 12,
padding: 20,
elevation: 5,
},
modalTitle: {
fontSize: 18,
fontWeight: 'bold',
color: '#0c4a6e',
marginBottom: 12,
textAlign: 'center',
},
modalText: {
fontSize: 14,
color: '#0c4a6e',
lineHeight: 20,
marginBottom: 20,
},
closeButton: {
backgroundColor: '#0284c7',
padding: 10,
borderRadius: 8,
alignItems: 'center',
},
closeButtonText: {
color: '#ffffff',
fontSize: 14,
fontWeight: '500',
},
});
export default VaccinationPlanApp;

打包
接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。

打包之后再将打包后的鸿蒙OpenHarmony文件拷贝到鸿蒙的DevEco-Studio工程目录去:

最后运行效果图如下显示:

本文介绍了基于React Native开发的疫苗接种管理应用如何实现鸿蒙系统跨端兼容。通过React Native通用API构建核心功能,将组件映射为鸿蒙原生控件,确保UI交互一致性。采用TypeScript强类型数据模型保障医疗数据准确性,利用React Hooks实现状态管理和智能推送逻辑,适配鸿蒙生命周期。样式系统跨端转换保证视觉统一性,同时针对医疗场景优化交互体验。该架构充分发挥了鸿蒙分布式特性与React Native跨平台优势,为智慧医疗应用开发提供了高效解决方案。
更多推荐


所有评论(0)