首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法将从APISAUCE接收到的响应作为缓存存储到异步存储中,并在React本机中的平面列表中显示它

有没有办法将从APISAUCE接收到的响应作为缓存存储到异步存储中,并在React本机中的平面列表中显示它
EN

Stack Overflow用户
提问于 2021-11-06 06:21:10
回答 1查看 362关注 0票数 0

我正在使用APISAUCE从Node获得响应,然后在FlatList中显示数据。我实际上想要做的是将此响应存储在AsyncStorage中作为缓存,因此当应用程序处于脱机状态时,要在FlatList中显示的数据必须从AsyncStorage中检索,而不是从服务器中获取。

这是我的代码实现:

代码语言:javascript
复制
 import { create } from "apisauce";

const apiClient = create({
    baseURL : "http://192.168.10.9:9000/api"

    });



    export default apiClient;
代码语言:javascript
复制
import apiClient from "./client";

    
const endpoint = "/listings";

const getListings =() =>{

    return apiClient.get(endpoint);
}

export default {getListings};
代码语言:javascript
复制
import React , { useState } from "react";

export default useAPI=(API)=> 
{
 const[data,setData]=useState([]);
 const [error , setError]=useState(false);
 const [isLoading ,setLoading]=useState();


 
const request = async()=> {
    setLoading(true);
    const response = await API();
    setLoading(false);
    if(!response.ok) return setError(true);
 
 
     setError(false);
     setData(response.data);
     
    
 }

 return {error , data ,isLoading ,request  }

}
代码语言:javascript
复制
function ListingScreen({navigation}) {

  const loadListing= useAPI(getListings.getListings);
 

useEffect(()=>{

loadListing.request();

}, []);


    return (
        <View style={styles.container} >
{loadListing.error && (
    <View style={{marginTop:60}}>
        <Text style={{textAlign:"center"}}>
            Cannot Retrieve Data From Server
        </Text>

        <AppButton title="retry" 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>
    );

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-06 07:28:45

当用户打开应用程序时:

如果存在数据,

  • 首先检查本地存储
  • ,然后解析数据,然后将数据呈现到平面列表中;如果没有找到
  • ,则将其请求到url,然后将数据转换为字符串并存储在存储中。最后更新您的数据.

代码语言:javascript
复制
import React , { useState } from "react";

export default useAPI=(URL)=> 
{
 const[data,setData]=useState([]);
 const [error , setError]=useState(false);
 const [isLoading ,setLoading]=useState();

const _getDataFromStorage = async () => {
  /*
  - Getting data from async storage
  - If data wasn't null, Parse data for covering string to object 
  and update your states and return true
  - If data was null return false*/
}
 
const request = async ()=> {
   try {
    if (await _getDataFromStorage()) {
      return;
    }

    setLoading(true);
    const response = await fetch(
      URL,
      //your request options
    );
    setLoading(false);
    if(!response.ok) 
      return setError(true);
    
    const responseJson = await response.json();
    setError(false);
    setData(responseJson.data);
   } catch (error) {
     console.error(error);
     setError(true);
   }
    
 }

 return {error , data ,isLoading}
}

然后做你的其他实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69861890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档