这个账户设置页面采用了清晰的组件化架构,通过状态管理实现了登录状态的切换和用户信息的展示。核心组件 LogoutPage 作为主容器,负责状态管理和界面渲染,提供了完整的账户管理功能。

状态管理

const [isLoggedIn, setIsLoggedIn] = useState(true);
const [userInfo, setUserInfo] = useState({
  name: '科技爱好者',
  email: 'techfan@example.com',
  avatar: 'https://picsum.photos/100/100?random=1',
  joinDate: '2023年5月',
  articlesRead: 128,
  bookmarks: 24,
});

使用 useState Hook 管理两个关键状态:

  1. isLoggedIn:登录状态,初始值为 true
  2. userInfo:用户信息,包含姓名、邮箱、头像、加入时间、阅读文章数和收藏数

这种状态管理方式简洁明了,适合处理用户登录状态的切换和用户信息的展示。

条件渲染

if (!isLoggedIn) {
  return (
    <SafeAreaView style={styles.container}>
      <View style={styles.loginPrompt}>
        <Text style={styles.promptTitle}>您尚未登录</Text>
        <Text style={styles.promptSubtitle}>登录后可享受更多个性化服务</Text>
        <TouchableOpacity style={styles.loginButton} onPress={() => setIsLoggedIn(true)}>
          <Text style={styles.loginButtonText}>立即登录</Text>
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
}

通过条件渲染实现了登录状态和未登录状态的界面切换,当 isLoggedInfalse 时,显示登录提示界面;当 isLoggedIntrue 时,显示账户设置界面。这种实现方式清晰直观,用户可以根据登录状态看到不同的界面。

退出登录

const handleLogout = () => {
  Alert.alert(
    '确认退出',
    '您确定要退出登录吗?',
    [
      { text: '取消', style: 'cancel' },
      {
        text: '退出',
        style: 'destructive',
        onPress: () => {
          setIsLoggedIn(false);
          Alert.alert('退出成功', '您已成功退出登录', [
            { text: '确定', onPress: () => {} }
          ]);
        }
      }
    ],
    { cancelable: false }
  );
};

退出登录功能通过 Alert.alert 显示确认对话框,用户确认后更新 isLoggedIn 状态为 false,并显示退出成功的提示。这种实现方式提供了清晰的用户反馈,确保用户不会误操作。

账户删除

const handleAccountDeletion = () => {
  Alert.alert(
    '账户删除警告',
    '删除账户将永久清除您的所有数据,包括收藏、阅读记录等,此操作无法撤销!',
    [
      { text: '取消', style: 'cancel' },
      {
        text: '删除账户',
        style: 'destructive',
        onPress: () => {
          Alert.alert('账户已删除', '您的账户和所有数据已被永久删除', [
            { text: '确定', onPress: () => {} }
          ]);
        }
      }
    ],
    { cancelable: false }
  );
};

账户删除功能通过 Alert.alert 显示警告对话框,明确告知用户删除账户的后果,用户确认后显示账户已删除的提示。这种实现方式提供了充分的风险提示,确保用户了解操作的后果。

功能实现

const handleClearCache = () => {
  Alert.alert('缓存清理', '应用缓存已清理完毕', [
    { text: '确定', onPress: () => {} }
  ]);
};

const handlePrivacyPolicy = () => {
  Alert.alert('隐私政策', '我们承诺保护您的个人隐私信息,详情请参阅隐私政策条款。', [
    { text: '我知道了', onPress: () => {} }
  ]);
};

实现了多个辅助功能,如清理缓存、查看隐私政策、帮助中心和意见反馈,这些功能通过 Alert.alert 显示相应的提示信息,提供了基本的用户交互和反馈。

页面布局

<SafeAreaView style={styles.container}>
  {/* 头部 */}
  <View style={styles.header}>
    <Text style={styles.title}>账户设置</Text>
  </View>

  {/* 用户信息卡片 */}
  <View style={styles.userInfoCard}>
    {/* 用户信息内容 */}
  </View>

  {/* 功能选项 */}
  <ScrollView style={styles.content}>
    {/* 功能选项内容 */}
  </ScrollView>

  {/* 底部导航 */}
  <View style={styles.bottomNav}>
    {/* 底部导航内容 */}
  </View>
</SafeAreaView>

页面布局采用了分层设计:

  • 头部:包含标题
  • 用户信息卡片:展示用户的基本信息和统计数据
  • 功能选项:包含账户安全和账户操作的功能
  • 底部导航:提供快速访问其他页面的入口

这种布局设计清晰明了,用户可以直观地理解和使用页面的功能。

用户信息

<View style={styles.userInfoCard}>
  <View style={styles.userInfoHeader}>
    <Image source={{ uri: userInfo.avatar }} style={styles.avatar} />
    <View style={styles.userInfo}>
      <Text style={styles.userName}>{userInfo.name}</Text>
      <Text style={styles.userEmail}>{userInfo.email}</Text>
      <Text style={styles.joinDate}>加入时间: {userInfo.joinDate}</Text>
    </View>
  </View>
  
  <View style={styles.statsRow}>
    <View style={styles.statItem}>
      <Text style={styles.statNumber}>{userInfo.articlesRead}</Text>
      <Text style={styles.statLabel}>文章阅读</Text>
    </View>
    <View style={styles.statItem}>
      <Text style={styles.statNumber}>{userInfo.bookmarks}</Text>
      <Text style={styles.statLabel}>收藏文章</Text>
    </View>
  </View>
</View>

用户信息卡片采用了左侧头像、右侧信息的布局结构,下方是统计数据。这种布局在用户信息展示中非常常见,能够清晰地展示用户的基本信息和活动数据。

这个账户设置页面展示了 React Native 跨端开发的核心技术要点,通过合理的组件设计、清晰的状态管理、直观的用户界面和完整的功能实现,为用户提供了一个功能齐全、体验良好的账户管理工具。在鸿蒙系统适配方面,通过组件映射、样式适配和功能重实现,可以快速实现跨端迁移,保持功能和视觉效果的一致性。


全程采用React Native原生组件与基础能力开发,遵循状态驱动视图组件化布局跨端通用样式的设计原则,所有API、组件、样式均为React Native与鸿蒙平台的通用能力,借助React Native for HarmonyOS桥接层可无缝编译为鸿蒙原生组件,Android、iOS、鸿蒙三端共用一套核心逻辑,实现原生级的交互与视觉体验。本文将从鸿蒙跨端友好的技术基底登录/登出的状态驱动视图设计账户操作的安全交互体系跨端兼容的布局与视觉规范鸿蒙跨端落地与生产级拓展等维度,深度解读该实现的技术细节,为各类跨端应用的账户中心、个人设置页开发提供可直接复用的工程化方案。

本项目的技术选型围绕账户设置页的产品特性鸿蒙跨端兼容性两大核心原则,全程使用React Native原生核心组件与API完成开发,未引入任何第三方依赖或平台专属特性,所有实现均遵循“跨端通用、原生渲染、轻量高效”的设计思路,为鸿蒙跨端落地奠定极简工程基础,同时贴合账户设置页“操作安全、交互清晰、布局规整”的产品诉求,核心技术基底设计如下:

1. 原生组件:

选用SafeAreaViewViewTextTouchableOpacityScrollViewImageAlert等React Native核心原生组件,这类组件均完成React Native for HarmonyOS的深度桥接,底层会被编译为对应平台的原生组件(鸿蒙Component、Android View、iOS UIView),基于原生渲染引擎执行,彻底规避WebView渲染的性能损耗。其中:

  • SafeAreaView自动桥接鸿蒙的安全区域适配能力,兼容鸿蒙设备的刘海屏、折叠屏、底部导航栏,无需手动计算设备间距,保证页面内容不被系统控件遮挡;
  • Image的远程URI加载、圆角裁剪(头像圆形展示)在鸿蒙平台原生支持,图片渲染无拉伸、无加载异常,且支持鸿蒙的图片缓存策略;
  • TouchableOpacity的触摸反馈桥接为鸿蒙原生的按压效果(淡入淡出),点击体验与鸿蒙原生应用完全一致,无交互延迟;
  • ScrollView的惯性滚动、滚动条样式在鸿蒙平台自动适配,当功能选项过多时,滚动体验流畅无卡顿;
  • Alert的弹窗提示桥接为鸿蒙AlertDialog原生弹窗,支持多按钮、按钮样式定制(取消/破坏性),弹窗的层级、动画均为鸿蒙原生效果;
  • 所有组件的使用方式均为React Native标准用法,无任何鸿蒙平台专属配置,前端开发者基于现有React Native技术积累即可开发,跨端学习成本为零。

2. 核心能力:

依托React Native原生能力实现所有业务功能,核心能力均为JavaScript/React通用特性,在鸿蒙平台的JS引擎中可直接执行,无需任何适配修改,核心能力包括:

  • 状态管理:采用useState轻量管理登录状态与用户信息,遵循React状态不可变原则,状态更新驱动视图的局部重渲染,与鸿蒙ArkUI的@State状态管理理念高度同源;
  • 条件渲染:基于登录状态isLoggedIn实现「已登录账户设置页」与「未登录提示页」的动态切换,条件渲染为React通用语法,鸿蒙平台可直接解析执行;
  • 事件处理:基于TouchableOpacityonPress事件实现所有操作交互(退出登录、删除账户、清理缓存等),事件的传递、绑定为React通用逻辑,鸿蒙平台原生支持;
  • 样式渲染:基于StyleSheet.create()实现模块化样式管理,支持Flex弹性布局、圆角、阴影、边框、背景色渐变等所有通用样式属性,在鸿蒙平台桥接为ArkUI的原生样式;
  • 数据管理:采用纯JavaScript对象模拟用户信息数据,数据结构贴合账户设置页的实际诉求,后续对接后端接口时,仅需替换数据来源,无需修改视图渲染逻辑。

3. 样式:

采用React Native原生StyleSheet进行样式模块化管理,全程基于Flex弹性布局实现所有模块的布局设计,结合justifyContentalignItemsflexDirectionspace-around等通用属性完成页面的规整排列,核心特点:

  • StyleSheet会对样式进行预编译优化,在鸿蒙平台编译时会直接转换为ArkUI的样式对象,样式渲染无性能损耗;
  • Flex弹性布局是鸿蒙ArkUI的核心布局能力,所有布局属性(如flex:1justifyContent: space-between)在鸿蒙平台原生支持,无任何兼容问题,三端布局效果完全一致;
  • 所有视觉样式(圆角、阴影、边框、文字大小、颜色)均为CSS标准属性,采用十六进制颜色值、逻辑像素单位,在鸿蒙、Android、iOS三端的渲染无偏色、无样式错乱;
  • 采用基于屏幕宽度的自适应设计const { width } = Dimensions.get('window')),保证在鸿蒙手机、平板、折叠屏等不同尺寸设备中,页面布局能自适应调整,无内容挤压或留白过多。

4. 数据层:

采用纯JavaScript对象与模拟数据初始化用户信息与登录状态,用户信息包含头像、昵称、邮箱、加入时间、阅读量、收藏量等账户中心核心字段,登录状态通过布尔值isLoggedIn标识,数据结构贴合实际生产场景:

const [userInfo, setUserInfo] = useState({
  name: '科技爱好者',
  email: 'techfan@example.com',
  avatar: 'https://picsum.photos/100/100?random=1',
  joinDate: '2023年5月',
  articlesRead: 128,
  bookmarks: 24,
});

静态数据的设计方式让数据层与业务逻辑层、视图层完全解耦,在生产环境中,仅需将模拟数据替换为接口请求的动态数据(如鸿蒙平台的网络请求API、React Native的fetch/axios),即可快速对接后端用户系统,无需修改任何视图渲染与交互逻辑,工程拓展性极强。


账户设置页的核心特性是基于用户登录状态展示不同的页面内容,本项目采用useState实现「登录状态(isLoggedIn)」与「用户信息(userInfo)」的轻量状态管理,严格遵循React状态驱动视图单向数据流原则,通过状态的更新实现「已登录账户设置页」与「未登录提示页」的无缝切换,所有状态逻辑均为通用JavaScript/React代码,在鸿蒙平台的JS引擎中可直接执行,与鸿蒙ArkUI的数据驱动视图理念高度契合,核心设计要点如下:

定义两个核心useState钩子,分别管理登录状态与用户信息,实现状态的精细化管理,职责边界清晰,避免单一状态过于臃肿:

  • 登录状态const [isLoggedIn, setIsLoggedIn] = useState(true),通过布尔值标识用户是否登录,作为页面条件渲染的核心依据,初始值设为true,默认展示已登录的账户设置页;
  • 用户信息const [userInfo, setUserInfo] = useState({...}),通过对象存储用户的核心信息,作为已登录状态下的视图渲染数据来源,对象的每个字段均贴合账户设置页的信息展示诉求。

双状态的设计方式让状态的更新与维护更精准:登录状态的更新仅触发页面的整体条件渲染,用户信息的更新仅触发相关信息展示区域的局部重渲染,遵循React的最小重渲染原则,提升页面性能,且这种状态设计在鸿蒙平台无任何兼容问题,setIsLoggedInsetUserInfo的状态更新逻辑会被桥接为ArkUI的状态更新,触发视图的高效重渲染。

2. 条件渲染:

基于登录状态isLoggedIn的布尔值,采用React条件渲染语法实现两个页面的动态切换,核心逻辑为:当isLoggedIntrue时,展示包含用户信息、功能选项、账户操作的完整账户设置页;当isLoggedInfalse时,展示包含登录提示与登录按钮的未登录兜底页,核心代码结构:

if (!isLoggedIn) {
  return (/* 未登录提示页 */);
}
return (/* 已登录账户设置页 */);

这种条件渲染方式为React通用语法,在鸿蒙平台可直接解析执行,且页面切换无任何白屏或卡顿:因为两个页面均由React Native原生组件构成,底层会被鸿蒙渲染引擎高效处理,切换时仅需更新组件的挂载/卸载状态,无需重新加载页面。同时未登录兜底页的设计,保证了用户在未登录状态下的页面体验,避免出现内容空白,符合产品设计的完整性要求。

3. 状态联动:

退出登录操作是状态联动的核心场景,在handleLogout方法中,当用户确认退出后,调用setIsLoggedIn(false)将登录状态更新为false,React会自动检测到状态变化,触发页面的条件渲染,从已登录账户设置页切换为未登录提示页,核心逻辑:

onPress: () => {
  setIsLoggedIn(false);
  Alert.alert('退出成功', '您已成功退出登录', [{ text: '确定' }]);
}

同时未登录提示页提供“立即登录”按钮,点击后调用setIsLoggedIn(true)将登录状态更新为true,页面又会切换回已登录账户设置页,实现登录/登出状态的双向联动。整个状态更新过程遵循React状态不可变原则,仅通过setState方法更新状态,不直接修改原状态值,保证了状态的可追踪性与稳定性,这种状态联动逻辑在鸿蒙平台无任何适配成本,可直接执行。

4. 状态兜底:

未登录提示页并非简单的静态展示,而是实现了完整的功能闭环:包含登录引导文案、“立即登录”操作按钮,点击按钮后可快速切换回已登录状态,核心设计:

  • 文案引导:通过“您尚未登录”“登录后可享受更多个性化服务”明确告知用户未登录的状态与登录后的权益,提升用户的登录意愿;
  • 操作按钮:采用主题色背景、圆角设计的“立即登录”按钮,视觉上突出显示,便于用户操作;
  • 状态联动:按钮点击事件直接关联登录状态的更新,实现操作与状态的无缝衔接。

这种未登录状态的兜底设计,保证了账户设置页在任何状态下都有完整的内容展示与操作入口,避免了用户在未登录状态下的操作迷茫,同时为生产环境的实际登录功能预留了拓展入口:在生产环境中,仅需将“立即登录”按钮的点击事件替换为实际的登录页面跳转(如集成React Native路由库react-navigation),即可快速对接登录功能,无需修改状态管理与条件渲染的核心逻辑。


真实演示案例代码:



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

// 图标库
const ICONS = {
  home: '🏠',
  user: '👤',
  logout: '🚪',
  setting: '⚙️',
  privacy: '🔒',
  help: '❓',
  feedback: '💬',
  security: '🛡️',
};

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

const LogoutPage: React.FC = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(true);
  const [userInfo, setUserInfo] = useState({
    name: '科技爱好者',
    email: 'techfan@example.com',
    avatar: 'https://picsum.photos/100/100?random=1',
    joinDate: '2023年5月',
    articlesRead: 128,
    bookmarks: 24,
  });

  const handleLogout = () => {
    Alert.alert(
      '确认退出',
      '您确定要退出登录吗?',
      [
        { text: '取消', style: 'cancel' },
        { 
          text: '退出', 
          style: 'destructive',
          onPress: () => {
            setIsLoggedIn(false);
            Alert.alert('退出成功', '您已成功退出登录', [
              { text: '确定', onPress: () => {} }
            ]);
          }
        }
      ],
      { cancelable: false }
    );
  };

  const handleAccountDeletion = () => {
    Alert.alert(
      '账户删除警告',
      '删除账户将永久清除您的所有数据,包括收藏、阅读记录等,此操作无法撤销!',
      [
        { text: '取消', style: 'cancel' },
        { 
          text: '删除账户', 
          style: 'destructive',
          onPress: () => {
            Alert.alert('账户已删除', '您的账户和所有数据已被永久删除', [
              { text: '确定', onPress: () => {} }
            ]);
          }
        }
      ],
      { cancelable: false }
    );
  };

  const handleClearCache = () => {
    Alert.alert('缓存清理', '应用缓存已清理完毕', [
      { text: '确定', onPress: () => {} }
    ]);
  };

  const handlePrivacyPolicy = () => {
    Alert.alert('隐私政策', '我们承诺保护您的个人隐私信息,详情请参阅隐私政策条款。', [
      { text: '我知道了', onPress: () => {} }
    ]);
  };

  const handleHelpCenter = () => {
    Alert.alert('帮助中心', '如需帮助,请联系客服:support@technews.com', [
      { text: '确定', onPress: () => {} }
    ]);
  };

  const handleFeedback = () => {
    Alert.alert('意见反馈', '感谢您的宝贵意见,我们会持续改进产品体验。', [
      { text: '确定', onPress: () => {} }
    ]);
  };

  if (!isLoggedIn) {
    return (
      <SafeAreaView style={styles.container}>
        <View style={styles.loginPrompt}>
          <Text style={styles.promptTitle}>您尚未登录</Text>
          <Text style={styles.promptSubtitle}>登录后可享受更多个性化服务</Text>
          <TouchableOpacity style={styles.loginButton} onPress={() => setIsLoggedIn(true)}>
            <Text style={styles.loginButtonText}>立即登录</Text>
          </TouchableOpacity>
        </View>
      </SafeAreaView>
    );
  }

  return (
    <SafeAreaView style={styles.container}>
      {/* 头部 */}
      <View style={styles.header}>
        <Text style={styles.title}>账户设置</Text>
      </View>

      {/* 用户信息卡片 */}
      <View style={styles.userInfoCard}>
        <View style={styles.userInfoHeader}>
          <Image source={{ uri: userInfo.avatar }} style={styles.avatar} />
          <View style={styles.userInfo}>
            <Text style={styles.userName}>{userInfo.name}</Text>
            <Text style={styles.userEmail}>{userInfo.email}</Text>
            <Text style={styles.joinDate}>加入时间: {userInfo.joinDate}</Text>
          </View>
        </View>
        
        <View style={styles.statsRow}>
          <View style={styles.statItem}>
            <Text style={styles.statNumber}>{userInfo.articlesRead}</Text>
            <Text style={styles.statLabel}>文章阅读</Text>
          </View>
          <View style={styles.statItem}>
            <Text style={styles.statNumber}>{userInfo.bookmarks}</Text>
            <Text style={styles.statLabel}>收藏文章</Text>
          </View>
        </View>
      </View>

      {/* 功能选项 */}
      <ScrollView style={styles.content}>
        <Text style={styles.sectionTitle}>账户安全</Text>
        <View style={styles.optionCard}>
          <TouchableOpacity style={styles.optionItem} onPress={handlePrivacyPolicy}>
            <Text style={styles.optionIcon}>{ICONS.privacy}</Text>
            <Text style={styles.optionText}>隐私政策</Text>
            <Text style={styles.arrow}></Text>
          </TouchableOpacity>
          
          <TouchableOpacity style={styles.optionItem} onPress={handleClearCache}>
            <Text style={styles.optionIcon}>{ICONS.security}</Text>
            <Text style={styles.optionText}>清理缓存</Text>
            <Text style={styles.arrow}></Text>
          </TouchableOpacity>
          
          <TouchableOpacity style={styles.optionItem} onPress={handleHelpCenter}>
            <Text style={styles.optionIcon}>{ICONS.help}</Text>
            <Text style={styles.optionText}>帮助中心</Text>
            <Text style={styles.arrow}></Text>
          </TouchableOpacity>
          
          <TouchableOpacity style={styles.optionItem} onPress={handleFeedback}>
            <Text style={styles.optionIcon}>{ICONS.feedback}</Text>
            <Text style={styles.optionText}>意见反馈</Text>
            <Text style={styles.arrow}></Text>
          </TouchableOpacity>
        </View>

        <Text style={styles.sectionTitle}>账户操作</Text>
        <View style={styles.optionCard}>
          <TouchableOpacity style={styles.logoutButton} onPress={handleLogout}>
            <Text style={styles.logoutButtonText}>{ICONS.logout} 退出登录</Text>
          </TouchableOpacity>
          
          <TouchableOpacity style={styles.dangerButton} onPress={handleAccountDeletion}>
            <Text style={styles.dangerButtonText}>删除账户</Text>
          </TouchableOpacity>
        </View>
      </ScrollView>

      {/* 底部导航 */}
      <View style={styles.bottomNav}>
        <TouchableOpacity style={styles.navItem}>
          <Text style={[styles.navIcon, styles.activeNavIcon]}>{ICONS.home}</Text>
          <Text style={[styles.navText, styles.activeNavText]}>首页</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.navItem}>
          <Text style={styles.navIcon}>{ICONS.setting}</Text>
          <Text style={styles.navText}>设置</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.navItem}>
          <Text style={styles.navIcon}>{ICONS.privacy}</Text>
          <Text style={styles.navText}>收藏</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.navItem}>
          <Text style={styles.navIcon}>{ICONS.user}</Text>
          <Text style={styles.navText}>我的</Text>
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f8fafc',
  },
  header: {
    padding: 20,
    backgroundColor: '#ffffff',
    borderBottomWidth: 1,
    borderBottomColor: '#e2e8f0',
  },
  title: {
    fontSize: 20,
    fontWeight: 'bold',
    color: '#1e293b',
  },
  loginPrompt: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    padding: 40,
  },
  promptTitle: {
    fontSize: 24,
    fontWeight: 'bold',
    color: '#1e293b',
    marginBottom: 8,
  },
  promptSubtitle: {
    fontSize: 16,
    color: '#64748b',
    textAlign: 'center',
    marginBottom: 32,
  },
  loginButton: {
    backgroundColor: '#3b82f6',
    paddingHorizontal: 32,
    paddingVertical: 12,
    borderRadius: 8,
  },
  loginButtonText: {
    fontSize: 16,
    color: '#ffffff',
    fontWeight: '500',
  },
  userInfoCard: {
    backgroundColor: '#ffffff',
    margin: 16,
    borderRadius: 12,
    padding: 16,
    elevation: 3,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  userInfoHeader: {
    flexDirection: 'row',
    alignItems: 'center',
    marginBottom: 16,
  },
  avatar: {
    width: 60,
    height: 60,
    borderRadius: 30,
    marginRight: 16,
  },
  userInfo: {
    flex: 1,
  },
  userName: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#1e293b',
    marginBottom: 4,
  },
  userEmail: {
    fontSize: 14,
    color: '#64748b',
    marginBottom: 4,
  },
  joinDate: {
    fontSize: 12,
    color: '#94a3b8',
  },
  statsRow: {
    flexDirection: 'row',
    justifyContent: 'space-around',
    borderTopWidth: 1,
    borderTopColor: '#e2e8f0',
    paddingTop: 16,
  },
  statItem: {
    alignItems: 'center',
  },
  statNumber: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#3b82f6',
  },
  statLabel: {
    fontSize: 12,
    color: '#64748b',
    marginTop: 4,
  },
  content: {
    flex: 1,
    padding: 16,
  },
  sectionTitle: {
    fontSize: 16,
    fontWeight: 'bold',
    color: '#1e293b',
    marginVertical: 12,
  },
  optionCard: {
    backgroundColor: '#ffffff',
    borderRadius: 12,
    overflow: 'hidden',
    elevation: 3,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  optionItem: {
    flexDirection: 'row',
    alignItems: 'center',
    paddingVertical: 16,
    paddingHorizontal: 20,
    borderBottomWidth: 1,
    borderBottomColor: '#e2e8f0',
  },
  optionItemLast: {
    borderBottomWidth: 0,
  },
  optionIcon: {
    fontSize: 20,
    marginRight: 12,
    color: '#64748b',
  },
  optionText: {
    flex: 1,
    fontSize: 16,
    color: '#1e293b',
  },
  arrow: {
    fontSize: 18,
    color: '#cbd5e1',
  },
  logoutButton: {
    backgroundColor: '#f1f5f9',
    paddingVertical: 16,
    paddingHorizontal: 20,
    alignItems: 'center',
  },
  logoutButtonText: {
    fontSize: 16,
    color: '#ef4444',
    fontWeight: '500',
  },
  dangerButton: {
    backgroundColor: '#fee2e2',
    paddingVertical: 16,
    paddingHorizontal: 20,
    alignItems: 'center',
    marginTop: 1,
  },
  dangerButtonText: {
    fontSize: 16,
    color: '#dc2626',
    fontWeight: '500',
  },
  bottomNav: {
    flexDirection: 'row',
    justifyContent: 'space-around',
    backgroundColor: '#ffffff',
    borderTopWidth: 1,
    borderTopColor: '#e2e8f0',
    paddingVertical: 12,
  },
  navItem: {
    alignItems: 'center',
  },
  navIcon: {
    fontSize: 20,
    color: '#94a3b8',
    marginBottom: 4,
  },
  activeNavIcon: {
    color: '#3b82f6',
  },
  navText: {
    fontSize: 12,
    color: '#94a3b8',
  },
  activeNavText: {
    color: '#3b82f6',
  },
});

export default LogoutPage;

请添加图片描述


打包

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

在这里插入图片描述

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

在这里插入图片描述

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

请添加图片描述

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

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐