You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native如何将APISAUCE接口响应存入AsyncStorage缓存并在FlatList展示

实现步骤

1. 安装依赖

需要用到两个库:AsyncStorage 做本地缓存存储,NetInfo 做网络状态判断,执行以下命令安装:

npm install @react-native-async-storage/async-storage @react-native-community/netinfo
# iOS 环境需要额外执行
cd ios && pod install && cd ..

安卓端需要在 android/app/src/main/AndroidManifest.xml 中添加网络状态权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2. 修改自定义useAPI Hook,加入缓存逻辑

替换原有的useAPI代码如下:

import React, { useState } from "react";
import AsyncStorage from '@react-native-async-storage/async-storage';
import NetInfo from '@react-native-community/netinfo';

// 缓存key统一管理
const CACHE_KEY = 'cache_listings';

export default useAPI=(API)=> 
{
 const[data,setData]=useState([]);
 const [error , setError]=useState(false);
 const [isLoading ,setLoading]=useState(false);
 // 可选:标记当前是否使用缓存数据
 const [isOfflineCache, setIsOfflineCache] = useState(false);

 // 读取本地缓存的方法
 const loadCache = async () => {
   try {
     const cacheStr = await AsyncStorage.getItem(CACHE_KEY);
     if (cacheStr) {
       const cacheData = JSON.parse(cacheStr);
       setData(cacheData);
       return true;
     }
     return false;
   } catch (e) {
     console.log('读取缓存失败', e);
     return false;
   }
 }

 const request = async()=> {
    setLoading(true);
    setIsOfflineCache(false);
    // 先加载缓存,优先渲染内容
    const hasCache = await loadCache();
    // 获取网络状态
    const netState = await NetInfo.fetch();
    // 离线状态直接返回缓存,不发请求
    if (!netState.isConnected) {
      setLoading(false);
      setIsOfflineCache(true);
      // 没有缓存才显示错误
      setError(!hasCache);
      return;
    }
    // 在线状态发起请求
    const response = await API();
    setLoading(false);
    if(!response.ok) {
      // 请求失败 fallback 到缓存
      setIsOfflineCache(true);
      setError(!hasCache);
      return;
    }
    // 请求成功,更新缓存和页面数据
    setError(false);
    setData(response.data);
    try {
      await AsyncStorage.setItem(CACHE_KEY, JSON.stringify(response.data));
    } catch (e) {
      console.log('缓存写入失败', e);
    }
 }

 return {error , data ,isLoading ,request, isOfflineCache }
}

3. 页面可选优化

可以在ListingScreen中加入离线缓存提示,提升用户感知:

function ListingScreen({navigation}) {
  const loadListing= useAPI(getListings.getListings);
 
  useEffect(()=>{
    loadListing.request();
  }, []);

  return (
    <View style={styles.container} >
      {/* 离线提示 */}
      {loadListing.isOfflineCache && (
        <Text style={{textAlign: 'center', padding: 8, color: '#666', backgroundColor: '#fff3cd'}}>
          当前网络不佳,显示的是缓存内容
        </Text>
      )}
      {loadListing.error && (
        <View style={{marginTop:60}}>
          <Text style={{textAlign:"center"}}>
            无法加载数据,请检查网络连接后重试
          </Text>
          <AppButton title="重试" onPress={loadListing.request} />
        </View>
      )}
      {loadListing.isLoading ? 
        <View>
          <ActivityIndicator animating={true} size={80} color="grey" />
        </View> : 
        <FlatList 
          data={loadListing.data} 
          keyExtractor={list=>list.id.toString()}
          renderItem ={({item}) => 
            <Card 
              title={item.title} 
              subtitle={"$" +item.price} 
              image={item.images[0].url} 
              onPress={()=>navigation.navigate("ListingDetails" ,item )} 
            />
          } 
        />
      }
    </View>
  );
}

以上修改完成后,应用在线时会自动拉取最新数据并更新缓存,离线或请求失败时会自动读取缓存渲染,没有缓存的情况下才会显示错误提示。


内容的提问来源于stack exchange,提问作者huzaifac137

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:36:10