本文介绍了一个基于React Native构建的跨平台任务清单应用,采用最小化依赖设计,实现了任务管理、进度跟踪和优先级标记等核心功能。应用通过类型化的状态管理确保数据一致性,智能进度条提供可视化反馈,优先级标记系统实现任务分类。重点分析了在鸿蒙平台的适配方案,包括安全区域处理、性能优化策略和分布式任务同步等关键技术。文章强调了声明式UI、纯视图渲染和受控组件等设计模式对跨平台一致性的重要性,并提供了针对不同设备形态的优化建议,为开发高质量跨平台应用提供了实践参考。


这段“任务清单”代码用最小依赖的 React Native 原语构建出一个完整的待办体验:头部信息、全局进度摘要、视图模式切换、列表渲染与表单添加。它没有引入第三方路由或状态库,桥接面很小;落到鸿蒙(HarmonyOS/OpenHarmony)时,RN-OH 将这些原语稳定映射到 ArkUI 视图与事件,这使跨端统一体验成为可能。真正决定三端一致性的,是状态语义、列表与进度的纯视图实现、输入法与弹窗的工程约束。

状态驱动的页面语义

  • 源状态集中在 todos、viewMode、newTodo、priority,所有 UI 都由它们派生而来。TaskProgressSummary 以派生值(完成数、总数、待完成数)驱动 ProgressBar 与统计文案,属于“源状态 → 派生 UI”的典型范式;这种结构在 ArkUI 映射下能减少桥接抖动,渲染可预测。
  • 视图模式的过滤逻辑(all/completed/pending)在 JS 层完成,再交由 ScrollView 渲染,简化了三端一致性问题;当列表项接近中长规模时,建议切换到 FlatList,以获得虚拟化与窗口渲染调优空间。
  • TodoItem 的勾选与删除行为通过受控回调上行,不做局部突变;不可变更新(map/filter)能避免跨端桥接的意外重绘,保持 UI 一致。

进度条与优先级的纯视图表达

  • ProgressBar 用容器+填充条的百分比宽度表达完成度,不依赖平台控件,这在 ArkUI 映射下最稳定。工程上应对百分比做边界限制(0–100),同时在样式上用视觉等级(低/中/高)映射不同色板,三端可统一感知“进度紧迫度”。
  • PriorityBadge 以纯视图渲染优先级(高/中/低),不引入图标库或平台特性;这类“文本+颜色”的轻量信号是跨端稳健的设计,避免矢量资源桥接差异。

列表与滚动的跨端边界

  • 当前以 ScrollView + map 渲染,适合小型列表;条目增多时,FlatList 提供首屏渲染(initialNumToRender)、窗口控制(windowSize)与裁剪(removeClippedSubviews),在鸿蒙设备上显著提升滚动帧率与内存占用。
  • TodoItem 抽成独立 memo 组件,仅在 props 变化时重绘,降低 JS→UI 桥接负载;key 使用稳定 id,避免重排抖动。不做深嵌套与重阴影,保持绘制成本可控。

输入体验

  • 表单使用 TextInput 收集新任务与优先级选择,中文 IME 在鸿蒙设备上的组合键入与联想确认频率与 iOS 有细微差异。受控输入可以屏蔽大部分差异,但复杂校验(例如非空检查)建议在提交时做,而不是每次字符变更即触发,减少桥接压力。
  • 键盘弹出时的遮挡在三端都会出现,鸿蒙侧也需要 KeyboardAvoidingView 或滚动到可视区域保障“输入可达”。表单区已经放在页面底部,适当的容器内边距与安全区域处理能避免“被底部导航覆盖”的问题。
  • 重要工程提醒:当前文件未从 react-native 导入 TextInput,但使用了它;需要补充 import,否则编译即失败。这是跨端稳定性的“硬性前置条件”。

弹窗、阴影与安全区域

  • Alert 用于轻交互闭环(提示/失败/删除确认),鸿蒙端映射 ArkUI Dialog,按钮样式与阻塞行为会随系统主题略有差异。如果需要品牌一致性与统一动效,抽象一个 Modal 工具层,在鸿蒙走 ArkUI Dialog、其他平台走 RN Modal,对外保持一致 API。
  • 阴影同时使用 iOS 的 shadow* 与安卓/鸿蒙的 elevation,是跨端一致性的正确做法。为进一步统一视觉等级,建议抽象“阴影适配器”,集中维护三端的强度与半径映射。
  • SafeAreaView 在鸿蒙设备形态(圆角/打孔/折叠屏)下的 inset 表现与 iOS/Android相近,但建议引入 react-native-safe-area-context 做兜底,确保头部与底部表单不同形态下都不被系统 UI 遮盖。

在鸿蒙生态系统中,React Native应用的运行依赖于一套精密的桥接机制。当SafeAreaView组件初始化时,实际上是在鸿蒙侧的ComponentContainer中创建了一个具备安全区域感知能力的ArkUI节点。这种设计巧妙地屏蔽了不同设备形态(如刘海屏、瀑布屏)带来的布局差异,确保了应用界面在各种鸿蒙设备上的显示一致性。

Dimensions API的使用充分体现了RN框架对多设备适配的深度考量。通过动态获取屏幕宽度(width),组件能够实现真正的响应式布局。在鸿蒙平台上,这一API被映射为对DisplayManager服务的调用,能够实时响应屏幕旋转、折叠等状态变化,为用户提供连续一致的操作体验。

ProgressBar进度条组件的状态管理模式展现了React Hooks在鸿蒙环境下的优秀表现。useState钩子通过闭包机制维护着任务完成状态,每次状态更新都会触发React Reconciler的diff算法。在鸿蒙设备上,这种基于Fiber架构的增量更新机制能够最大限度地减少不必要的DOM操作,提升渲染性能。

TaskProgressSummary任务进度概览组件通过filter高阶函数实现了任务状态的实时统计,completed和pending状态的分离计算展现了函数式编程在跨平台开发中的优势。这种声明式编程风格不仅提高了代码可读性,也让鸿蒙JIT编译器更容易进行性能优化。

PriorityBadge优先级徽章组件通过配置对象映射实现了不同优先级的视觉区分,这种设计模式在鸿蒙分布式环境中具有良好的扩展性。当需要新增优先级类型时,只需扩展priorityConfig对象而无需修改组件核心逻辑,体现了开闭原则的最佳实践。

TodoItem任务项组件通过TouchableOpacity实现了触摸反馈效果,在鸿蒙平台上会被映射为具备ripple effect的原生组件,提供更加自然的交互体验。checkbox样式的动态切换通过条件渲染实现,completed状态的变化会触发文本划线效果,这种即时状态反馈在鸿蒙设备上具有毫秒级的响应速度。

Alert.alert()API在鸿蒙平台上的实现经过了特殊优化,能够根据设备类型自动选择合适的弹窗样式。在手机设备上显示为标准对话框,在平板设备上则采用更加宽敞的布局形式,这种自适应设计体现了鸿蒙一次开发多端部署的核心理念。

addTodo函数采用时间戳作为新任务的唯一ID,这种设计在鸿蒙分布式环境中具有良好的唯一性保证。Date.now()方法在鸿蒙JSC引擎中经过特殊优化,能够提供毫秒级的时间精度,确保生成ID的唯一性。新任务添加到列表开头的操作通过数组展开语法实现不可变数据更新,符合React的状态管理最佳实践。

viewMode状态管理通过useState Hook实现三种视图模式的切换,这种基于状态驱动的UI更新机制在鸿蒙设备上表现出色。React Reconciler能够精确计算出最小的DOM变更集合,减少不必要的重绘操作,确保在大量任务项场景下的流畅体验。

样式系统的动态绑定机制展现了CSS-in-JS方案的强大威力。通过数组形式的样式组合([styles.checkbox, todo.completed && styles.checkboxCompleted]),组件能够在单次渲染中完成多个样式规则的合并。这种即时样式合成避免了传统CSS解析带来的性能损耗,在频繁重渲染场景下尤为突出。

ScrollView组件在鸿蒙环境下的表现尤为出色,其内部实现了智能缓存机制,只渲染可视区域内的子组件。这种虚拟化列表技术大大降低了内存占用,即使面对数百个任务项也能保持流畅的滚动体验。contentContainerStyle属性的使用允许开发者精确控制滚动内容的布局行为。


类型化任务状态系统

任务清单应用展示了高效的任务状态类型设计:

type Todo = {
  id: number;
  title: string;
  completed: boolean;
  priority: 'low' | 'medium' | 'high';
};

const [todos, setTodos] = useState<Todo[]>([
  { id: 1, title: '完成React Native项目', completed: false, priority: 'high' },
  { id: 2, title: '学习TypeScript', completed: true, priority: 'medium' },
  // 更多任务...
]);

这种类型化设计在任务管理应用中具有重要的状态完整性保障作用。通过明确的任务属性定义(ID、标题、完成状态、优先级),确保了任务数据的一致性和操作安全性。在鸿蒙平台上,这种类型可以无缝转化为鸿蒙的分布式任务服务,实现跨设备的任务状态同步。

智能进度跟踪机制

应用实现了精确的进度计算与展示:

const ProgressBar = ({ completed, total }: { completed: number; total: number }) => {
  const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
  
  return (
    <View style={styles.progressBarContainer}>
      <View style={styles.progressBarBackground}>
        <View 
          style={[
            styles.progressBarFill, 
            { width: `${percentage}%` },
            percentage > 80 ? styles.progressHigh : 
            percentage > 50 ? styles.progressMedium : 
            styles.progressLow
          ]} 
        />
      </View>
      <Text style={styles.progressText}>{percentage}% 完成</Text>
    </View>
  );
};

这种进度跟踪在任务管理中展现了强大的数据可视化能力。通过精确的百分比计算、动态颜色反馈和实时更新,提供了直观的任务完成概览。在跨平台开发中,需要特别注意性能优化和动画流畅性。鸿蒙平台的原生动画引擎可以提供更流畅的进度条过渡和更精确的视觉反馈。

任务交互与视图管理

优先级标记系统

应用采用了专业的优先级标记组件:

const PriorityBadge = ({ priority }: { priority: string }) => {
  const priorityConfig = {
    high: { color: '#ef4444', label: '高' },
    medium: { color: '#f59e0b', label: '中' },
    low: { color: '#10b981', label: '低' },
  };
  
  const config = priorityConfig[priority as keyof typeof priorityConfig] || priorityConfig.medium;
  
  return (
    <View style={[styles.priorityBadge, { backgroundColor: config.color }]}>
      <Text style={styles.priorityText}>{config.label}</Text>
    </View>
  );
};

这种标记系统在任务管理中展现了重要的视觉优先级区分。通过颜色编码、简洁标签和一致的样式,提供了快速的任务优先级识别。在鸿蒙平台上,这种设计可以利用鸿蒙的主题服务实现更灵活的动态样式调整和更一致的系统级视觉体验。

多视图任务筛选

代码实现了灵活的任务视图切换:

const [viewMode, setViewMode] = useState<'all' | 'completed' | 'pending'>('all');

const filteredTodos = todos.filter(todo => {
  if (viewMode === 'completed') return todo.completed;
  if (viewMode === 'pending') return !todo.completed;
  return true;
});

这种视图管理在任务应用中展现了强大的数据筛选能力。通过状态过滤、实时视图切换和计数显示,提供了高效的任务浏览体验。在跨平台开发中,需要特别注意大数据量下的筛选性能。鸿蒙平台的分布式数据查询可以提供更高效的任务筛选和更快的视图切换。

鸿蒙跨端适配关键技术

分布式任务同步

鸿蒙的分布式特性为任务管理带来创新体验:

// 伪代码:分布式任务同步
const DistributedTasks = {
  syncTaskState: (taskData) => {
    if (Platform.OS === 'harmony') {
      harmonyNative.syncTodoItems(taskData);
    }
  },
  getCrossDeviceTasks: () => {
    if (Platform.OS === 'harmony') {
      return harmonyNative.getUnifiedTodoList();
    }
    return localTasks;
  }
};

原生提醒集成

利用鸿蒙的原生提醒能力提升体验:

// 伪代码:提醒集成
const ReminderIntegration = {
  scheduleTaskReminders: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.setSystemReminders();
    }
  },
  prioritizeCriticalTasks: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.flagImportantTasks();
    }
  }
};

智能任务建议

鸿蒙平台为任务应用提供智能规划能力:

// 伪代码:智能建议
const IntelligentPlanning = {
  suggestOptimalSchedule: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.recommendTaskOrder();
    }
  },
  predictTaskCompletion: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.estimateCompletionTime();
    }
  }
};

性能优化与用户体验

任务渲染优化

// 伪代码:渲染优化
const TaskPerformance = {
  optimizeListRendering: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.accelerateTaskRendering();
    }
  },
  minimizeUpdateLatency: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.reduceStateUpdateDelay();
    }
  }
};

智能化任务管理

// 伪代码:智能任务
const IntelligentTasks = {
  autoPrioritizeTasks: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.organizeByPriority();
    }
  },
  learnWorkPatterns: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.analyzeProductivity();
    }
  }
};

协作任务功能

// 伪代码:协作任务
const CollaborativeTasks = {
  enableTeamTasks: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.createSharedTaskLists();
    }
  },
  supportTaskDelegation: () => {
    if (Platform.OS === 'harmony') {
      harmonyNative.facilitateTaskAssignment();
    }
  }
};

真实演示案例代码:

// app.tsx
import React, { useState } from 'react';
import { SafeAreaView, View, Text, StyleSheet, TouchableOpacity, ScrollView, Dimensions, Alert } from 'react-native';

// 图标库
const ICONS = {
  home: '🏠',
  list: '📋',
  add: '➕',
  edit: '✏️',
  trash: '🗑️',
  check: '✅',
  progress: '📊',
  user: '👤',
};

const { width } = Dimensions.get('window');

const ProgressBar = ({ completed, total }: { completed: number; total: number }) => {
  const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
  
  return (
    <View style={styles.progressBarContainer}>
      <View style={styles.progressBarBackground}>
        <View 
          style={[
            styles.progressBarFill, 
            { width: `${percentage}%` },
            percentage > 80 ? styles.progressHigh : 
            percentage > 50 ? styles.progressMedium : 
            styles.progressLow
          ]} 
        />
      </View>
      <Text style={styles.progressText}>{percentage}% 完成</Text>
    </View>
  );
};

const TaskProgressSummary = ({ todos }: { todos: Array<{ id: number; title: string; completed: boolean; priority: string }> }) => {
  const total = todos.length;
  const completed = todos.filter(todo => todo.completed).length;
  const pending = total - completed;
  
  return (
    <View style={styles.progressSummaryContainer}>
      <Text style={styles.progressTitle}>任务进度概览</Text>
      <ProgressBar completed={completed} total={total} />
      <View style={styles.progressStats}>
        <View style={styles.progressStat}>
          <Text style={styles.progressStatNumber}>{total}</Text>
          <Text style={styles.progressStatLabel}>总计</Text>
        </View>
        <View style={styles.progressStat}>
          <Text style={styles.progressStatNumberCompleted}>{completed}</Text>
          <Text style={styles.progressStatLabel}>已完成</Text>
        </View>
        <View style={styles.progressStat}>
          <Text style={styles.progressStatNumberPending}>{pending}</Text>
          <Text style={styles.progressStatLabel}>待完成</Text>
        </View>
      </View>
    </View>
  );
};

const PriorityBadge = ({ priority }: { priority: string }) => {
  const priorityConfig = {
    high: { color: '#ef4444', label: '高' },
    medium: { color: '#f59e0b', label: '中' },
    low: { color: '#10b981', label: '低' },
  };
  
  const config = priorityConfig[priority as keyof typeof priorityConfig] || priorityConfig.medium;
  
  return (
    <View style={[styles.priorityBadge, { backgroundColor: config.color }]}>
      <Text style={styles.priorityText}>{config.label}</Text>
    </View>
  );
};

const TodoItem = ({ 
  todo, 
  onToggle, 
  onDelete 
}: { 
  todo: { id: number; title: string; completed: boolean; priority: string }; 
  onToggle: (id: number) => void; 
  onDelete: (id: number) => void; 
}) => {
  return (
    <View style={styles.todoItem}>
      <TouchableOpacity 
        style={styles.todoContent}
        onPress={() => onToggle(todo.id)}
      >
        <View style={[styles.checkbox, todo.completed && styles.checkboxCompleted]}>
          <Text style={styles.checkboxText}>
            {todo.completed ? ICONS.check : ''}
          </Text>
        </View>
        <Text style={[styles.todoTitle, todo.completed && styles.completedTodo]}>
          {todo.title}
        </Text>
        <PriorityBadge priority={todo.priority} />
      </TouchableOpacity>
      
      <TouchableOpacity 
        style={styles.deleteButton}
        onPress={() => onDelete(todo.id)}
      >
        <Text style={styles.deleteText}>{ICONS.trash}</Text>
      </TouchableOpacity>
    </View>
  );
};

const TodoListApp: React.FC = () => {
  const [todos, setTodos] = useState([
    { id: 1, title: '完成React Native项目', completed: false, priority: 'high' },
    { id: 2, title: '学习TypeScript', completed: true, priority: 'medium' },
    { id: 3, title: '购买生活用品', completed: false, priority: 'low' },
    { id: 4, title: '健身房锻炼', completed: false, priority: 'medium' },
    { id: 5, title: '整理工作文档', completed: false, priority: 'high' },
    { id: 6, title: '准备会议材料', completed: true, priority: 'medium' },
    { id: 7, title: '阅读技术文章', completed: false, priority: 'low' },
  ]);
  
  const [newTodo, setNewTodo] = useState('');
  const [priority, setPriority] = useState<'low' | 'medium' | 'high'>('medium');
  const [viewMode, setViewMode] = useState<'all' | 'completed' | 'pending'>('all');

  const addTodo = () => {
    if (newTodo.trim() === '') {
      Alert.alert('提示', '请输入任务内容');
      return;
    }
    
    const newTask = {
      id: Date.now(),
      title: newTodo.trim(),
      completed: false,
      priority
    };
    
    setTodos([newTask, ...todos]);
    setNewTodo('');
    setPriority('medium');
    Alert.alert('成功', '任务已添加');
  };

  const toggleTodo = (id: number) => {
    setTodos(todos.map(todo => 
      todo.id === id ? { ...todo, completed: !todo.completed } : todo
    ));
  };

  const deleteTodo = (id: number) => {
    setTodos(todos.filter(todo => todo.id !== id));
  };

  const filteredTodos = todos.filter(todo => {
    if (viewMode === 'completed') return todo.completed;
    if (viewMode === 'pending') return !todo.completed;
    return true;
  });

  return (
    <SafeAreaView style={styles.container}>
      {/* 头部 */}
      <View style={styles.header}>
        <Text style={styles.title}>任务清单</Text>
        <Text style={styles.subtitle}>高效管理您的日常任务</Text>
      </View>

      {/* 进度摘要 */}
      <TaskProgressSummary todos={todos} />

      {/* 视图模式选择 */}
      <View style={styles.viewModeContainer}>
        <TouchableOpacity 
          style={[styles.modeButton, viewMode === 'all' && styles.activeModeButton]}
          onPress={() => setViewMode('all')}
        >
          <Text style={[styles.modeButtonText, viewMode === 'all' && styles.activeModeButtonText]}>全部</Text>
        </TouchableOpacity>
        <TouchableOpacity 
          style={[styles.modeButton, viewMode === 'completed' && styles.activeModeButton]}
          onPress={() => setViewMode('completed')}
        >
          <Text style={[styles.modeButtonText, viewMode === 'completed' && styles.activeModeButtonText]}>已完成</Text>
        </TouchableOpacity>
        <TouchableOpacity 
          style={[styles.modeButton, viewMode === 'pending' && styles.activeModeButton]}
          onPress={() => setViewMode('pending')}
        >
          <Text style={[styles.modeButtonText, viewMode === 'pending' && styles.activeModeButtonText]}>待完成</Text>
        </TouchableOpacity>
      </View>

      {/* 任务列表 */}
      <ScrollView style={styles.content}>
        <Text style={styles.sectionTitle}>
          {viewMode === 'all' ? '所有任务' : 
           viewMode === 'completed' ? '已完成任务' : '待完成任务'} 
          ({filteredTodos.length})
        </Text>
        
        {filteredTodos.length === 0 ? (
          <View style={styles.emptyState}>
            <Text style={styles.emptyText}>
              {viewMode === 'all' ? '暂无任务' : 
               viewMode === 'completed' ? '暂无已完成任务' : '暂无待完成任务'}
            </Text>
            <Text style={styles.emptySubtext}>
              {viewMode === 'all' ? '点击下方按钮添加新任务' : 
               viewMode === 'completed' ? '完成一些任务看看' : '完成一些任务后再来看'}
            </Text>
          </View>
        ) : (
          filteredTodos.map(todo => (
            <TodoItem 
              key={todo.id} 
              todo={todo} 
              onToggle={toggleTodo} 
              onDelete={deleteTodo} 
            />
          ))
        )}
      </ScrollView>

      {/* 添加任务表单 */}
      <View style={styles.formContainer}>
        <View style={styles.inputGroup}>
          <Text style={styles.inputLabel}>任务标题</Text>
          <View style={styles.inputWrapper}>
            <Text style={styles.inputIcon}>{ICONS.list}</Text>
            <Text style={styles.inputPlaceholder}>输入任务名称</Text>
          </View>
          <TextInput
            style={styles.textInput}
            value={newTodo}
            onChangeText={setNewTodo}
            placeholder="输入任务名称"
          />
        </View>
        
        <View style={styles.prioritySelector}>
          <Text style={styles.inputLabel}>优先级</Text>
          <View style={styles.priorityOptions}>
            <TouchableOpacity 
              style={[styles.priorityOption, priority === 'low' && styles.activePriorityOption]}
              onPress={() => setPriority('low')}
            >
              <Text style={[styles.priorityText, priority === 'low' && styles.activePriorityText]}></Text>
            </TouchableOpacity>
            <TouchableOpacity 
              style={[styles.priorityOption, priority === 'medium' && styles.activePriorityOption]}
              onPress={() => setPriority('medium')}
            >
              <Text style={[styles.priorityText, priority === 'medium' && styles.activePriorityText]}></Text>
            </TouchableOpacity>
            <TouchableOpacity 
              style={[styles.priorityOption, priority === 'high' && styles.activePriorityOption]}
              onPress={() => setPriority('high')}
            >
              <Text style={[styles.priorityText, priority === 'high' && styles.activePriorityText]}></Text>
            </TouchableOpacity>
          </View>
        </View>
        
        <TouchableOpacity 
          style={styles.addButton}
          onPress={addTodo}
        >
          <Text style={styles.addButtonText}>{ICONS.add} 添加任务</Text>
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f8fafc',
  },
  header: {
    padding: 20,
    backgroundColor: '#ffffff',
    borderBottomWidth: 1,
    borderBottomColor: '#e2e8f0',
  },
  title: {
    fontSize: 24,
    fontWeight: 'bold',
    color: '#1e293b',
    marginBottom: 4,
  },
  subtitle: {
    fontSize: 14,
    color: '#64748b',
  },
  progressSummaryContainer: {
    padding: 20,
    backgroundColor: '#ffffff',
    margin: 16,
    borderRadius: 12,
    elevation: 3,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  progressTitle: {
    fontSize: 16,
    fontWeight: 'bold',
    color: '#1e293b',
    marginBottom: 12,
  },
  progressBarContainer: {
    flexDirection: 'row',
    alignItems: 'center',
    marginBottom: 12,
  },
  progressBarBackground: {
    flex: 1,
    height: 12,
    backgroundColor: '#e2e8f0',
    borderRadius: 6,
    overflow: 'hidden',
    marginRight: 12,
  },
  progressBarFill: {
    height: '100%',
    borderRadius: 6,
  },
  progressLow: {
    backgroundColor: '#f59e0b',
  },
  progressMedium: {
    backgroundColor: '#10b981',
  },
  progressHigh: {
    backgroundColor: '#3b82f6',
  },
  progressText: {
    fontSize: 12,
    color: '#64748b',
    fontWeight: '500',
  },
  progressStats: {
    flexDirection: 'row',
    justifyContent: 'space-between',
  },
  progressStat: {
    alignItems: 'center',
    flex: 1,
  },
  progressStatNumber: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#3b82f6',
  },
  progressStatNumberCompleted: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#10b981',
  },
  progressStatNumberPending: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#f59e0b',
  },
  progressStatLabel: {
    fontSize: 12,
    color: '#64748b',
    marginTop: 4,
  },
  viewModeContainer: {
    flexDirection: 'row',
    justifyContent: 'space-around',
    padding: 16,
    backgroundColor: '#ffffff',
    marginHorizontal: 16,
    borderRadius: 12,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 1 },
    shadowOpacity: 0.1,
    shadowRadius: 2,
  },
  modeButton: {
    paddingVertical: 8,
    paddingHorizontal: 16,
    borderRadius: 20,
    backgroundColor: '#f1f5f9',
  },
  activeModeButton: {
    backgroundColor: '#3b82f6',
  },
  modeButtonText: {
    fontSize: 14,
    color: '#64748b',
    fontWeight: '500',
  },
  activeModeButtonText: {
    color: '#ffffff',
  },
  content: {
    flex: 1,
    padding: 16,
  },
  sectionTitle: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#1e293b',
    marginBottom: 16,
  },
  todoItem: {
    flexDirection: 'row',
    alignItems: 'center',
    backgroundColor: '#ffffff',
    padding: 16,
    borderRadius: 12,
    marginBottom: 12,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 1 },
    shadowOpacity: 0.1,
    shadowRadius: 2,
  },
  todoContent: {
    flex: 1,
    flexDirection: 'row',
    alignItems: 'center',
  },
  checkbox: {
    width: 24,
    height: 24,
    borderRadius: 12,
    borderWidth: 2,
    borderColor: '#cbd5e1',
    alignItems: 'center',
    justifyContent: 'center',
    marginRight: 12,
  },
  checkboxCompleted: {
    backgroundColor: '#10b981',
    borderColor: '#10b981',
  },
  checkboxText: {
    fontSize: 14,
    color: '#ffffff',
    fontWeight: 'bold',
  },
  todoTitle: {
    flex: 1,
    fontSize: 16,
    color: '#1e293b',
  },
  completedTodo: {
    textDecorationLine: 'line-through',
    color: '#94a3b8',
  },
  priorityBadge: {
    paddingHorizontal: 8,
    paddingVertical: 4,
    borderRadius: 12,
  },
  priorityText: {
    fontSize: 12,
    color: '#ffffff',
    fontWeight: '500',
  },
  deleteButton: {
    padding: 8,
  },
  deleteText: {
    fontSize: 18,
    color: '#ef4444',
  },
  emptyState: {
    alignItems: 'center',
    justifyContent: 'center',
    paddingVertical: 60,
  },
  emptyText: {
    fontSize: 18,
    color: '#64748b',
    marginBottom: 8,
  },
  emptySubtext: {
    fontSize: 14,
    color: '#94a3b8',
    textAlign: 'center',
  },
  formContainer: {
    padding: 16,
    backgroundColor: '#ffffff',
    borderTopWidth: 1,
    borderTopColor: '#e2e8f0',
  },
  inputGroup: {
    marginBottom: 16,
  },
  inputLabel: {
    fontSize: 14,
    fontWeight: 'bold',
    color: '#1e293b',
    marginBottom: 8,
  },
  inputWrapper: {
    flexDirection: 'row',
    alignItems: 'center',
    backgroundColor: '#f1f5f9',
    borderRadius: 8,
    paddingHorizontal: 12,
    paddingVertical: 10,
    marginBottom: 8,
  },
  inputIcon: {
    fontSize: 18,
    color: '#64748b',
    marginRight: 8,
  },
  inputPlaceholder: {
    fontSize: 16,
    color: '#94a3b8',
    flex: 1,
  },
  textInput: {
    borderWidth: 1,
    borderColor: '#cbd5e1',
    borderRadius: 8,
    paddingHorizontal: 12,
    paddingVertical: 12,
    fontSize: 16,
    backgroundColor: '#ffffff',
  },
  prioritySelector: {
    marginBottom: 16,
  },
  priorityOptions: {
    flexDirection: 'row',
    justifyContent: 'space-between',
  },
  priorityOption: {
    flex: 1,
    paddingVertical: 10,
    paddingHorizontal: 16,
    borderRadius: 8,
    backgroundColor: '#f1f5f9',
    alignItems: 'center',
    marginHorizontal: 4,
  },
  activePriorityOption: {
    backgroundColor: '#3b82f6',
  },
  activePriorityText: {
    color: '#ffffff',
  },
  addButton: {
    backgroundColor: '#10b981',
    paddingVertical: 16,
    borderRadius: 12,
    alignItems: 'center',
  },
  addButtonText: {
    fontSize: 16,
    color: '#ffffff',
    fontWeight: '500',
  },
});

export default TodoListApp;

请添加图片描述


打包

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

在这里插入图片描述

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

在这里插入图片描述

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

请添加图片描述

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐