import React, { useState, useCallback, useMemo } from 'react';
import {
View,
Text,
StyleSheet,
FlatList,
Platform,
ListRenderItem,
} from 'react-native';
import { PullToRefreshNative } from '@xrnjs/ui';
// 将数据生成移到组件外部,避免重复创建
const generateData = (count = 50) => {
return Array.from({ length: count }, (_, i) => ({
id: `data-${i}`, // 使用 id 而不是 key,更符合 FlatList 的 keyExtractor
text: `number: ${i}`,
on: false,
}));
};
const INITIAL_DATA = generateData();
// 定义数据项类型
interface DataItem {
id: string;
text: string;
on: boolean;
}
// 优化 Item 组件
const Item = React.memo(({ title }: { title: string }) => (
console.log('Item pressed:', title)}
accessible={true}
accessibilityRole="button"
accessibilityLabel={`Item ${title} on ${Platform.OS}`}
>
{title} {Platform.OS}
));
const styles = StyleSheet.create({
container: {
flex: 1,
},
item: {
backgroundColor: '#f9c2ff',
padding: 20,
marginVertical: 8,
marginHorizontal: 16,
borderRadius: 8,
},
title: {
fontSize: 16,
color: '#333',
},
platform: {
fontSize: 14,
color: '#666',
fontStyle: 'italic',
},
flatList: {
flex: 1,
},
});
const PullToRefreshScreen = () => {
const [loading, setLoading] = useState(false);
const [data, setData] = useState(INITIAL_DATA);
// 使用 useCallback 优化性能
const onRefresh = useCallback(async () => {
setLoading(true);
try {
// 模拟网络请求
await new Promise((resolve) => {
setTimeout(resolve, 2000); // 减少等待时间到 2 秒
});
// 模拟数据更新
setData(generateData(Math.floor(Math.random() * 20) + 30));
} catch (error) {
console.error('Refresh failed:', error);
// 这里可以添加错误提示
} finally {
setLoading(false);
}
}, []);
// 使用 useCallback 优化 renderItem
const renderItem: ListRenderItem = useCallback(
({ item }) => ,
[]
);
// 使用 useCallback 优化 keyExtractor
const keyExtractor = useCallback((item: DataItem) => item.id, []);
// 使用 useMemo 优化 FlatList 的 props
const flatListProps = useMemo(
() => ({
data,
renderItem,
keyExtractor,
bounces: false,
style: styles.flatList,
nestedScrollEnabled: true, // Android 需要
showsVerticalScrollIndicator: true,
removeClippedSubviews: true, // 性能优化
maxToRenderPerBatch: 10, // 性能优化
windowSize: 10, // 性能优化
}),
[data, renderItem, keyExtractor]
);
return (
);
};
export default PullToRefreshScreen;