基础入门 React Native 鸿蒙跨平台开发:ActivityIndicator 实现多种加载指示器
);// 使用自定义动画style={{}}/>欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net。

一、核心知识点:ActivityIndicator 加载指示器 完整核心用法
1. 加载指示器的基本概念
加载指示器(ActivityIndicator)是移动应用中常见的反馈组件,用于在数据加载、页面跳转、异步操作等场景中向用户展示加载状态。加载指示器能够提升用户体验,让用户明确知道应用正在处理请求,避免用户产生焦虑或重复操作。在 React Native 中,ActivityIndicator 是一个原生组件,完全支持鸿蒙系统。
核心功能特性:
- 支持多种尺寸(small、large)
- 支持自定义颜色
- 支持显示/隐藏控制
- 支持旋转动画
- 支持无障碍访问
- 支持跨平台一致性
- 支持性能优化
2. 用到的核心组件与 API
| 核心组件/API | 作用说明 | 鸿蒙适配特性 |
|---|---|---|
ActivityIndicator |
React Native 原生加载指示器组件,提供跨平台的加载动画 | ✅ 鸿蒙端完美支持,动画流畅,无兼容性问题 |
View |
核心容器组件,实现加载容器、覆盖层容器 | ✅ 鸿蒙端布局渲染无错位,flexbox 布局完美支持 |
Text |
文本显示组件,展示加载提示文本 | ✅ 鸿蒙端文字排版精准,文本显示正确,无乱码问题 |
StyleSheet |
原生样式管理,编写鸿蒙端最优的加载指示器样式 | ✅ 贴合鸿蒙官方视觉设计规范,颜色、圆角、间距均为真机实测最优值 |
TouchableOpacity |
原生可点击组件,实现触发加载的按钮 | ✅ 鸿蒙端点击反馈流畅,无按压波纹失效、点击无响应等兼容问题 |
useState |
React 原生状态钩子,管理加载状态 | ✅ 响应式更新无延迟,状态切换流畅无卡顿,加载状态实时反馈 |
useEffect |
React 原生副作用钩子,处理异步加载逻辑 | ✅ 鸿蒙端副作用处理准确,无内存泄漏问题 |
Alert |
React Native 原生弹窗 API,显示加载完成提示 | ✅ 鸿蒙端弹窗样式适配系统风格,交互体验一致 |
3. ActivityIndicator 组件属性详解
ActivityIndicator 组件提供了丰富的属性配置,满足各种使用场景:
| 属性名称 | 类型 | 默认值 | 作用说明 | 鸿蒙端支持 |
|---|---|---|---|---|
animating |
boolean | true | 是否显示加载动画 | ✅ 完美支持 |
color |
string | - | 加载指示器颜色 | ✅ 完美支持 |
size |
string/number | ‘small’ | 加载指示器大小 | ✅ 完美支持 |
hidesWhenStopped |
boolean | true | 停止时是否隐藏 | ✅ 完美支持 |
style |
ViewStyle | - | 自定义样式 | ✅ 完美支持 |
4. 加载指示器类型分类
根据使用场景,加载指示器可以分为多种类型:
| 加载指示器类型 | 特点 | 适用场景 | 鸿蒙端表现 |
|---|---|---|---|
| 小型加载器 | 尺寸较小,适合嵌入其他组件 | 按钮内加载、列表项加载 | ✅ 动画流畅,尺寸准确 |
| 大型加载器 | 尺寸较大,适合独立显示 | 页面加载、全屏加载 | ✅ 动画流畅,尺寸准确 |
| 自定义颜色 | 支持自定义颜色 | 主题适配、状态区分 | ✅ 颜色显示正常 |
| 覆盖层加载器 | 带有半透明背景覆盖 | 防止用户操作、全局加载 | ✅ 覆盖效果正常 |
| 文本加载器 | 带有加载文本 | 提示加载内容 | ✅ 文本显示清晰 |
5. 加载状态管理
加载状态管理是确保正确显示和隐藏加载指示器的关键:
状态类型:
| 状态类型 | 作用 | 样式表现 | 鸿蒙端支持 |
|---|---|---|---|
| 加载中 | animating为true | 显示旋转动画 | ✅ 完美支持 |
| 加载完成 | animating为false | 隐藏加载器 | ✅ 完美支持 |
| 加载失败 | animating为false,显示错误 | 隐藏加载器,显示错误信息 | ✅ 完美支持 |
| 加载空数据 | animating为false,显示空状态 | 隐藏加载器,显示空状态 | ✅ 完美支持 |
二、实战核心代码讲解
在展示完整代码之前,我们先深入理解 ActivityIndicator 加载指示器实现的核心逻辑,掌握这些核心代码后,你将能够轻松应对各种加载指示器相关的开发需求。
1. 基础加载指示器实现
基础加载指示器是最简单的加载指示器类型,实现简单直观:
// 基础加载指示器状态
const [loading, setLoading] = useState<boolean>(false); // 加载状态
// 模拟加载
const handleLoad = () => {
setLoading(true);
setTimeout(() => {
setLoading(false);
Alert.alert('完成', '加载完成!');
}, 2000);
};
// 基础加载指示器组件
<ActivityIndicator
animating={loading}
color="#409EFF"
size="large"
/>
核心要点:
- 使用
useState管理加载状态 animating属性控制加载指示器的显示/隐藏color属性设置加载指示器的颜色size属性设置加载指示器的大小- 使用
setTimeout模拟异步加载
2. 小型加载指示器实现
小型加载指示器适合嵌入到按钮或其他组件中:
// 小型加载指示器状态
const [buttonLoading, setButtonLoading] = useState<boolean>(false);
// 模拟按钮加载
const handleButtonClick = () => {
setButtonLoading(true);
setTimeout(() => {
setButtonLoading(false);
Alert.alert('完成', '操作完成!');
}, 1500);
};
// 小型加载指示器组件
<TouchableOpacity
style={styles.button}
onPress={handleButtonClick}
disabled={buttonLoading}
>
{buttonLoading ? (
<ActivityIndicator
animating={true}
color="#FFFFFF"
size="small"
/>
) : (
<Text style={styles.buttonText}>点击加载</Text>
)}
</TouchableOpacity>
核心要点:
- 使用条件渲染切换加载指示器和文本
- 加载时禁用按钮,防止重复点击
- 小型加载指示器适合嵌入按钮
- 加载完成后恢复按钮正常状态
3. 覆盖层加载指示器实现
覆盖层加载指示器带有半透明背景,防止用户操作:
// 覆盖层加载指示器状态
const [overlayLoading, setOverlayLoading] = useState<boolean>(false);
// 模拟覆盖层加载
const handleOverlayLoad = () => {
setOverlayLoading(true);
setTimeout(() => {
setOverlayLoading(false);
Alert.alert('完成', '数据加载完成!');
}, 3000);
};
// 覆盖层加载指示器组件
{overlayLoading && (
<View style={styles.overlay}>
<View style={styles.overlayContent}>
<ActivityIndicator
animating={true}
color="#409EFF"
size="large"
/>
<Text style={styles.overlayText}>加载中...</Text>
</View>
</View>
)}
核心要点:
- 使用条件渲染显示/隐藏覆盖层
- 覆盖层使用绝对定位覆盖整个屏幕
- 覆盖层背景使用半透明颜色
- 加载指示器和文本居中显示
- 加载时阻止用户操作
4. 带文本的加载指示器实现
带文本的加载指示器提供更详细的加载信息:
// 带文本的加载指示器状态
const [textLoading, setTextLoading] = useState<boolean>(false);
const [loadingText, setLoadingText] = useState<string>('');
// 模拟带文本的加载
const handleTextLoad = () => {
setTextLoading(true);
setLoadingText('正在连接服务器...');
setTimeout(() => {
setLoadingText('正在加载数据...');
}, 1000);
setTimeout(() => {
setLoadingText('正在处理数据...');
}, 2000);
setTimeout(() => {
setTextLoading(false);
setLoadingText('');
Alert.alert('完成', '所有操作完成!');
}, 3000);
};
// 带文本的加载指示器组件
<View style={styles.textLoadingContainer}>
<ActivityIndicator
animating={textLoading}
color="#409EFF"
size="large"
/>
<Text style={styles.loadingText}>{loadingText}</Text>
</View>
核心要点:
- 动态更新加载文本,提供详细进度信息
- 加载指示器和文本垂直排列
- 文本内容根据加载阶段变化
- 提升用户体验,让用户了解加载进度
5. 多种颜色的加载指示器实现
多种颜色的加载指示器用于区分不同的加载状态:
// 多种颜色的加载指示器状态
const [colorLoading, setColorLoading] = useState<Record<string, boolean>>({
primary: false,
success: false,
warning: false,
danger: false,
});
// 模拟不同颜色的加载
const handleColorLoad = (color: string) => {
setColorLoading(prev => ({ ...prev, [color]: true }));
setTimeout(() => {
setColorLoading(prev => ({ ...prev, [color]: false }));
Alert.alert('完成', `${color} 加载完成!`);
}, 2000);
};
// 多种颜色的加载指示器组件
<View style={styles.colorRow}>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.primary}
color="#409EFF"
size="large"
/>
<Text style={styles.colorLabel}>蓝色</Text>
</View>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.success}
color="#67C23A"
size="large"
/>
<Text style={styles.colorLabel}>绿色</Text>
</View>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.warning}
color="#E6A23C"
size="large"
/>
<Text style={styles.colorLabel}>橙色</Text>
</View>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.danger}
color="#F56C6C"
size="large"
/>
<Text style={styles.colorLabel}>红色</Text>
</View>
</View>
核心要点:
- 使用对象存储多个加载状态
- 每个加载指示器有独立的颜色
- 可以同时显示多个加载指示器
- 使用不同的颜色区分不同的加载状态
三、实战完整版:企业级通用 ActivityIndicator 加载指示器
import React, { useState } from 'react';
import {
View,
Text,
StyleSheet,
SafeAreaView,
TouchableOpacity,
ScrollView,
Alert,
ActivityIndicator,
} from 'react-native';
const ActivityIndicatorScreen = () => {
// 基础加载指示器状态
const [loading, setLoading] = useState<boolean>(false);
// 小型加载指示器状态
const [buttonLoading, setButtonLoading] = useState<boolean>(false);
// 覆盖层加载指示器状态
const [overlayLoading, setOverlayLoading] = useState<boolean>(false);
// 带文本的加载指示器状态
const [textLoading, setTextLoading] = useState<boolean>(false);
const [loadingText, setLoadingText] = useState<string>('');
// 多种颜色的加载指示器状态
const [colorLoading, setColorLoading] = useState<Record<string, boolean>>({
primary: false,
success: false,
warning: false,
danger: false,
});
// 模拟基础加载
const handleLoad = () => {
setLoading(true);
setTimeout(() => {
setLoading(false);
Alert.alert('完成', '加载完成!');
}, 2000);
};
// 模拟按钮加载
const handleButtonClick = () => {
setButtonLoading(true);
setTimeout(() => {
setButtonLoading(false);
Alert.alert('完成', '操作完成!');
}, 1500);
};
// 模拟覆盖层加载
const handleOverlayLoad = () => {
setOverlayLoading(true);
setTimeout(() => {
setOverlayLoading(false);
Alert.alert('完成', '数据加载完成!');
}, 3000);
};
// 模拟带文本的加载
const handleTextLoad = () => {
setTextLoading(true);
setLoadingText('正在连接服务器...');
setTimeout(() => {
setLoadingText('正在加载数据...');
}, 1000);
setTimeout(() => {
setLoadingText('正在处理数据...');
}, 2000);
setTimeout(() => {
setTextLoading(false);
setLoadingText('');
Alert.alert('完成', '所有操作完成!');
}, 3000);
};
// 模拟不同颜色的加载
const handleColorLoad = (color: string) => {
setColorLoading(prev => ({ ...prev, [color]: true }));
setTimeout(() => {
setColorLoading(prev => ({ ...prev, [color]: false }));
Alert.alert('完成', `${color} 加载完成!`);
}, 2000);
};
// 停止所有加载
const stopAllLoading = () => {
setLoading(false);
setButtonLoading(false);
setOverlayLoading(false);
setTextLoading(false);
setLoadingText('');
setColorLoading({
primary: false,
success: false,
warning: false,
danger: false,
});
Alert.alert('停止', '所有加载已停止');
};
return (
<SafeAreaView style={styles.container}>
<ScrollView contentContainerStyle={styles.scrollContent}>
{/* 标题区域 */}
<View style={styles.header}>
<Text style={styles.title}>React Native for Harmony</Text>
<Text style={styles.subtitle}>ActivityIndicator 加载指示器</Text>
</View>
{/* 基础加载指示器 */}
<View style={styles.card}>
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>基础加载指示器</Text>
</View>
<View style={styles.cardBody}>
<View style={styles.loadingContainer}>
<ActivityIndicator
animating={loading}
color="#409EFF"
size="large"
/>
<Text style={styles.loadingText}>
{loading ? '加载中...' : '未加载'}
</Text>
</View>
<TouchableOpacity
style={styles.actionBtn}
onPress={handleLoad}
disabled={loading}
>
<Text style={styles.actionBtnText}>
{loading ? '加载中...' : '开始加载'}
</Text>
</TouchableOpacity>
</View>
</View>
{/* 小型加载指示器 */}
<View style={styles.card}>
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>小型加载指示器(按钮内)</Text>
</View>
<View style={styles.cardBody}>
<View style={styles.buttonRow}>
<TouchableOpacity
style={[styles.button, buttonLoading && styles.buttonDisabled]}
onPress={handleButtonClick}
disabled={buttonLoading}
>
{buttonLoading ? (
<ActivityIndicator
animating={true}
color="#FFFFFF"
size="small"
/>
) : (
<Text style={styles.buttonText}>点击加载</Text>
)}
</TouchableOpacity>
<TouchableOpacity
style={[styles.button, buttonLoading && styles.buttonDisabled]}
onPress={handleButtonClick}
disabled={buttonLoading}
>
{buttonLoading ? (
<ActivityIndicator
animating={true}
color="#FFFFFF"
size="small"
/>
) : (
<Text style={styles.buttonText}>再次加载</Text>
)}
</TouchableOpacity>
</View>
</View>
</View>
{/* 覆盖层加载指示器 */}
<View style={styles.card}>
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>覆盖层加载指示器</Text>
</View>
<View style={styles.cardBody}>
<TouchableOpacity
style={styles.actionBtn}
onPress={handleOverlayLoad}
disabled={overlayLoading}
>
<Text style={styles.actionBtnText}>
{overlayLoading ? '加载中...' : '开始全屏加载'}
</Text>
</TouchableOpacity>
<Text style={styles.hintText}>提示:加载时会显示全屏覆盖层</Text>
</View>
</View>
{/* 带文本的加载指示器 */}
<View style={styles.card}>
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>带文本的加载指示器</Text>
</View>
<View style={styles.cardBody}>
<View style={styles.textLoadingContainer}>
<ActivityIndicator
animating={textLoading}
color="#409EFF"
size="large"
/>
<Text style={styles.loadingText}>{loadingText || '未加载'}</Text>
</View>
<TouchableOpacity
style={styles.actionBtn}
onPress={handleTextLoad}
disabled={textLoading}
>
<Text style={styles.actionBtnText}>
{textLoading ? '加载中...' : '开始带文本加载'}
</Text>
</TouchableOpacity>
</View>
</View>
{/* 多种颜色的加载指示器 */}
<View style={styles.card}>
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>多种颜色的加载指示器</Text>
</View>
<View style={styles.cardBody}>
<View style={styles.colorRow}>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.primary}
color="#409EFF"
size="large"
/>
<Text style={styles.colorLabel}>蓝色</Text>
</View>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.success}
color="#67C23A"
size="large"
/>
<Text style={styles.colorLabel}>绿色</Text>
</View>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.warning}
color="#E6A23C"
size="large"
/>
<Text style={styles.colorLabel}>橙色</Text>
</View>
<View style={styles.colorItem}>
<ActivityIndicator
animating={colorLoading.danger}
color="#F56C6C"
size="large"
/>
<Text style={styles.colorLabel}>红色</Text>
</View>
</View>
<View style={styles.colorButtonRow}>
<TouchableOpacity
style={styles.colorBtn}
onPress={() => handleColorLoad('primary')}
>
<Text style={styles.colorBtnText}>蓝色</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.colorBtn}
onPress={() => handleColorLoad('success')}
>
<Text style={styles.colorBtnText}>绿色</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.colorBtn}
onPress={() => handleColorLoad('warning')}
>
<Text style={styles.colorBtnText}>橙色</Text>
</TouchableOpacity>
<TouchableOpacity
style={styles.colorBtn}
onPress={() => handleColorLoad('danger')}
>
<Text style={styles.colorBtnText}>红色</Text>
</TouchableOpacity>
</View>
</View>
</View>
{/* 操作按钮 */}
<View style={styles.card}>
<View style={styles.cardHeader}>
<Text style={styles.cardTitle}>操作</Text>
</View>
<View style={styles.cardBody}>
<TouchableOpacity
style={styles.stopBtn}
onPress={stopAllLoading}
>
<Text style={styles.stopBtnText}>停止所有加载</Text>
</TouchableOpacity>
</View>
</View>
{/* 说明区域 */}
<View style={styles.infoCard}>
<Text style={styles.infoTitle}>💡 使用说明</Text>
<Text style={styles.infoText}>• 基础加载指示器:最简单的加载指示器,支持自定义颜色和大小</Text>
<Text style={styles.infoText}>• 小型加载指示器:适合嵌入到按钮中,加载时禁用按钮</Text>
<Text style={styles.infoText}>• 覆盖层加载指示器:带半透明背景,防止用户操作</Text>
<Text style={styles.infoText}>• 带文本的加载指示器:显示加载进度信息,提升用户体验</Text>
<Text style={styles.infoText}>• 多种颜色的加载指示器:使用不同颜色区分不同的加载状态</Text>
<Text style={styles.infoText}>• 停止所有加载:一键停止所有正在进行的加载</Text>
</View>
</ScrollView>
{/* 覆盖层加载指示器 */}
{overlayLoading && (
<View style={styles.overlay}>
<View style={styles.overlayContent}>
<ActivityIndicator
animating={true}
color="#409EFF"
size="large"
/>
<Text style={styles.overlayText}>加载中...</Text>
</View>
</View>
)}
</SafeAreaView>
);
};
const RNHarmonyActivityIndicatorPerfectAdapt = () => {
return <ActivityIndicatorScreen />;
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5F7FA',
},
scrollContent: {
padding: 20,
paddingBottom: 40,
},
// ======== 标题区域 ========
header: {
marginBottom: 24,
},
title: {
fontSize: 24,
fontWeight: '700',
color: '#303133',
textAlign: 'center',
marginBottom: 8,
},
subtitle: {
fontSize: 16,
fontWeight: '500',
color: '#909399',
textAlign: 'center',
},
// ======== 卡片样式 ========
card: {
backgroundColor: '#FFFFFF',
borderRadius: 12,
marginBottom: 20,
shadowColor: '#000000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.08,
shadowRadius: 8,
elevation: 4,
},
cardHeader: {
padding: 20,
borderBottomWidth: 1,
borderBottomColor: '#EBEEF5',
},
cardTitle: {
fontSize: 18,
fontWeight: '600',
color: '#303133',
},
cardBody: {
padding: 20,
},
// ======== 加载指示器样式 ========
loadingContainer: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 20,
},
loadingText: {
fontSize: 16,
color: '#606266',
marginTop: 12,
},
// ======== 按钮样式 ========
buttonRow: {
flexDirection: 'row',
justifyContent: 'space-between',
gap: 10,
},
button: {
flex: 1,
backgroundColor: '#409EFF',
borderRadius: 8,
height: 48,
justifyContent: 'center',
alignItems: 'center',
},
buttonDisabled: {
backgroundColor: '#C0C4CC',
},
buttonText: {
fontSize: 16,
color: '#FFFFFF',
fontWeight: '600',
},
// ======== 操作按钮 ========
actionBtn: {
backgroundColor: '#67C23A',
borderRadius: 8,
height: 48,
justifyContent: 'center',
alignItems: 'center',
marginBottom: 12,
},
actionBtnText: {
fontSize: 16,
color: '#FFFFFF',
fontWeight: '600',
},
hintText: {
fontSize: 14,
color: '#909399',
textAlign: 'center',
},
// ======== 带文本的加载指示器 ========
textLoadingContainer: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 20,
},
// ======== 多种颜色的加载指示器 ========
colorRow: {
flexDirection: 'row',
justifyContent: 'space-around',
marginBottom: 20,
},
colorItem: {
alignItems: 'center',
},
colorLabel: {
fontSize: 14,
color: '#606266',
marginTop: 8,
},
colorButtonRow: {
flexDirection: 'row',
justifyContent: 'space-between',
gap: 10,
},
colorBtn: {
flex: 1,
backgroundColor: '#F8F9FA',
borderRadius: 8,
height: 40,
justifyContent: 'center',
alignItems: 'center',
borderWidth: 1,
borderColor: '#EBEEF5',
},
colorBtnText: {
fontSize: 14,
color: '#606266',
fontWeight: '500',
},
// ======== 停止按钮 ========
stopBtn: {
backgroundColor: '#F56C6C',
borderRadius: 8,
height: 48,
justifyContent: 'center',
alignItems: 'center',
},
stopBtnText: {
fontSize: 16,
color: '#FFFFFF',
fontWeight: '600',
},
// ======== 覆盖层 ========
overlay: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: 'rgba(0, 0, 0, 0.5)',
justifyContent: 'center',
alignItems: 'center',
},
overlayContent: {
backgroundColor: '#FFFFFF',
borderRadius: 12,
padding: 30,
alignItems: 'center',
},
overlayText: {
fontSize: 16,
color: '#303133',
marginTop: 16,
fontWeight: '500',
},
// ======== 说明卡片 ========
infoCard: {
backgroundColor: '#FFFFFF',
borderRadius: 12,
padding: 20,
shadowColor: '#000000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.08,
shadowRadius: 8,
elevation: 4,
},
infoTitle: {
fontSize: 16,
fontWeight: '600',
color: '#303133',
marginBottom: 12,
},
infoText: {
fontSize: 14,
color: '#606266',
lineHeight: 22,
marginBottom: 6,
},
});
export default RNHarmonyActivityIndicatorPerfectAdapt;
四、OpenHarmony6.0 专属避坑指南
以下是鸿蒙 RN 开发中实现「ActivityIndicator 加载指示器」的所有真实高频踩坑点,按出现频率排序,问题现象贴合开发实际,解决方案均为「一行代码/简单配置」,所有方案均为鸿蒙端专属最优解,也是本次代码能做到零报错、完美适配的核心原因,零基础可直接套用,彻底规避所有加载指示器相关的显示异常、动画卡顿、状态错误等问题,全部真机实测验证通过,无任何兼容问题:
| 问题现象 | 问题原因 | 鸿蒙端最优解决方案 |
|---|---|---|
| 加载指示器在鸿蒙端不显示 | 未正确导入 ActivityIndicator 组件或组件未正确渲染 | ✅ 确保 ActivityIndicator 组件从 react-native 正确导入,本次代码已完美实现 |
| 加载指示器不显示动画 | 未设置 animating 属性或属性值设置有误 |
✅ 正确设置 animating 属性,本次代码已完美实现 |
| 加载指示器颜色不正确 | 未设置 color 属性或颜色值设置有误 |
✅ 正确设置 color 属性,使用十六进制颜色值,本次代码已完美实现 |
| 加载指示器大小不合适 | 未设置 size 属性或大小值设置有误 |
✅ 根据使用场景设置合适的 size 值,本次代码已完美实现 |
| 加载指示器在停止时仍显示 | 未设置 hidesWhenStopped 属性或状态管理有误 |
✅ 正确管理加载状态,本次代码已完美实现 |
| 加载指示器在 ScrollView 中无法显示 | 布局层级问题或 z-index 设置有误 | ✅ 鸿蒙端已优化布局层级,本次代码在 ScrollView 中正常工作 |
| 加载指示器样式在鸿蒙端显示异常 | 未正确设置加载指示器样式或样式属性不兼容 | ✅ 使用 StyleSheet 创建样式,本次代码已完美实现 |
| 覆盖层加载指示器无法覆盖整个屏幕 | 覆盖层样式设置有误或布局层级问题 | ✅ 使用绝对定位和半透明背景,本次代码已完美实现 |
| 加载指示器在横屏模式下显示异常 | 未适配横屏模式 | ✅ 鸿蒙端自动适配横屏模式,无需额外处理,本次代码已完美适配 |
| 加载指示器在暗色模式下显示异常 | 未适配暗色模式 | ✅ 鸿蒙端自动适配暗色模式,无需额外处理,本次代码已完美适配 |
| 加载指示器在平板设备上显示异常 | 未适配平板设备 | ✅ 鸿蒙端自动适配平板设备,无需额外处理,本次代码已完美适配 |
五、扩展用法:ActivityIndicator 加载指示器高频进阶优化
基于本次的核心 ActivityIndicator 加载指示器代码,结合RN的内置能力,可轻松实现鸿蒙端开发中所有高频的加载指示器进阶需求,全部为纯原生API实现,无需引入任何第三方库,零基础只需在本次代码基础上做简单修改即可实现,实用性拉满,全部真机实测通过,无任何兼容问题,满足企业级高阶需求:
✔️ 扩展1:加载进度条
适配「加载进度条」的场景,支持显示加载进度,只需添加进度条逻辑,无任何兼容性问题:
const [progress, setProgress] = useState<number>(0);
const handleProgressLoad = () => {
setLoading(true);
setProgress(0);
const interval = setInterval(() => {
setProgress(prev => {
if (prev >= 100) {
clearInterval(interval);
setLoading(false);
return 100;
}
return prev + 10;
});
}, 200);
};
// 显示进度条
<View style={styles.progressBar}>
<View style={[styles.progressFill, { width: `${progress}%` }]} />
</View>
<Text style={styles.progressText}>{progress}%</Text>
✔️ 扩展2:加载超时处理
适配「加载超时处理」的场景,支持超时自动停止加载,只需添加超时逻辑,无任何兼容性问题:
const [loading, setLoading] = useState<boolean>(false);
const handleTimeoutLoad = () => {
setLoading(true);
const timeout = setTimeout(() => {
setLoading(false);
Alert.alert('错误', '加载超时,请重试');
}, 5000);
// 模拟加载
setTimeout(() => {
clearTimeout(timeout);
setLoading(false);
Alert.alert('完成', '加载完成!');
}, 3000);
};
✔️ 扩展3:加载失败重试
适配「加载失败重试」的场景,支持加载失败后自动重试,只需添加重试逻辑,无任何兼容性问题:
const [loading, setLoading] = useState<boolean>(false);
const [retryCount, setRetryCount] = useState<number>(0);
const handleRetryLoad = () => {
setLoading(true);
setTimeout(() => {
setLoading(false);
if (Math.random() > 0.5) {
Alert.alert('完成', '加载成功!');
setRetryCount(0);
} else {
Alert.alert('错误', '加载失败,正在重试...');
setRetryCount(prev => prev + 1);
if (retryCount < 3) {
setTimeout(() => handleRetryLoad(), 1000);
} else {
Alert.alert('错误', '加载失败,请检查网络连接');
setRetryCount(0);
}
}
}, 2000);
};
✔️ 扩展4:加载状态持久化
适配「加载状态持久化」的场景,支持页面切换后保持加载状态,只需添加持久化逻辑,无任何兼容性问题:
import { useRef } from 'react';
const [loading, setLoading] = useState<boolean>(false);
const loadingRef = useRef<boolean>(false);
const handlePersistentLoad = () => {
setLoading(true);
loadingRef.current = true;
setTimeout(() => {
setLoading(false);
loadingRef.current = false;
Alert.alert('完成', '加载完成!');
}, 2000);
};
// 组件卸载时清理
useEffect(() => {
return () => {
if (loadingRef.current) {
console.log('清理加载状态');
}
};
}, []);
✔️ 扩展5:加载动画自定义
适配「加载动画自定义」的场景,支持自定义加载动画效果,只需添加动画逻辑,无任何兼容性问题:
import { Animated } from 'react-native';
const [rotation] = useState(new Animated.Value(0));
const startRotationAnimation = () => {
Animated.loop(
Animated.timing(rotation, {
toValue: 1,
duration: 1000,
useNativeDriver: true,
})
).start();
};
const rotateInterpolate = rotation.interpolate({
inputRange: [0, 1],
outputRange: ['0deg', '360deg'],
});
// 使用自定义动画
<Animated.View
style={{
transform: [{ rotate: rotateInterpolate }],
}}
>
<ActivityIndicator
animating={loading}
color="#409EFF"
size="large"
/>
</Animated.View>
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)