本文在Expo环境下编写,但内容适用于所有React Native环境。
假设项目已经完成基础配置。
应用通常具有底部标签菜单,便于页面切换。但用户在其他标签修改数据后返回,页面可能仍显示首次加载的数据,不会重新反映修改。这时就需要实现刷新功能。
首先创建需要实现刷新的页面。我们要使用的refreshControl位于ScrollView组件中,下面先用模拟数据创建列表界面。
/app/index.tsximport React, { useState } from 'react';
import { Text, ScrollView } from 'react-native';
const List = () => {
const [refreshTime, setRefreshTime] = useState(0);
return (
<ScrollView style={{ flex: 1, backgroundColor: 'white', padding: 20 }}>
{Array.from({ length: 100 }).map((_, index) => (
<Text key={index} style={{ textAlign: 'center', justifyContent: 'center', fontSize: 30 }}>
{`새로고침 ${refreshTime}회`}
</Text>
))}
</ScrollView>
);
};
export default List;

ScrollView组件示例
使用ScrollView的refreshControl属性添加刷新功能。
RefreshControl用于在滚动视图或列表视图中添加下拉刷新。当视图处于scrollY: 0时向下滑动,就会触发onRefresh。refreshing表示刷新状态,onRefresh负责执行刷新逻辑。为了直观看到效果,这里增加了1秒延迟。
/app/index.tsximport React, { useState } from 'react';
import { Text, ScrollView, RefreshControl } from 'react-native';
const List = () => {
const [refreshing, setRefreshing] = useState(false); // 새로고침 상태를 나타내는 상태 변수
const [refreshTime, setRefreshTime] = useState(0);
const handleRefresh = () => { // 새로고침 기능을 구현하는 함수
setRefreshing(true);
setTimeout(() => { // 1초의 딜레이
setRefreshTime(refreshTime + 1); // 새로고침시 실행되는 함수
setRefreshing(false);
}, 1000);
};
return (
<ScrollView
style={{ flex: 1, backgroundColor: 'white', padding: 20 }}
refreshControl={<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} />}
>
{Array.from({ length: 100 }).map((_, index) => (
<Text key={index} style={{ textAlign: 'center', justifyContent: 'center', fontSize: 30 }}>
{`새로고침 ${refreshTime}회`}
</Text>
))}
</ScrollView>
);
};
export default List;

测试刷新功能
RefreshControl默认继承View的属性,此外还支持以下选项。
3.1. colors / tintColor 🔗
colors只用于Android,tintColor只用于iOS,二者用于设置刷新图标颜色。colors是列表,指示器显示期间会依次切换颜色。
colors属性示例↗
/app/index.tsx// ...
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} colors={['blue', 'red', 'green']} /> // Android
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} tintColor="blue" /> // iOS
// ...
启用或禁用刷新功能,默认值为true。
/app/index.tsx// ...
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} enabled={false} />
// 새로고침 기능 비활성화 (Android)
// ...
3.3. progressBackgroundColor(Android) 🔗
设置刷新图标背景色。与colors不同,只能设置一个颜色。
/app/index.tsx// ...
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} progressBackgroundColor="blue" />
// 새로고침 아이콘의 배경색 설정 (Android)
// ...
设置刷新图标大小。默认值是'default',设为'large'会显示更大的图标。
/app/index.tsx// ...
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} size="large" />
// 새로고침 아이콘의 사이즈 설정 (Android)
// ...
3.5. title、titleColor(iOS) 🔗
在刷新图标下方显示标题,titleColor用于设置标题颜色。
/app/index.tsx// ...
<RefreshControl refreshing={refreshing} onRefresh={handleRefresh} title="새로고침" titleColor="blue" />
// 새로고침 아이콘 아래에 제목 표시 (Ios)
// ...
如果自动获取服务器数据存在限制,就应该让用户可以手动刷新。尤其在应用中,把这一能力放在适当的位置,可以改善用户体验。