ネイティブとその概念にかなり新しい。私は私が実装するAsyncStorageのドキュメントに探してきたAsyncStorage React Nativeを使用してAPIデータをキャッシュする方法
http://jsonplaceholder.typicode.com/photos
からのAPIデータをフェッチするアプリケーションを作成するために、しばらくの間、RNで遊んでてきましたどのようにAPIデータをキャッシュすることができるので、アプリケーション終了時に何度もWebからデータを取得する必要はありませんが、実装に成功できませんでした。
それに基づいて助けてくれると助かります。私のアプリケーションに2つの重要なファイルのソースコードを、Test.jsファイルと一緒に、私が達成しようとしていたものと一緒に含めました。 GalleryList-
import React, {Component} from 'react';
import { Text, View, Image } from 'react-native';
import Card from './Card';
import CardSection from './CardSection';
const GalleryDetail = (props)=> {
return (
<Card>
<CardSection style = {styles.headerContentStyle}>
<Image
style={styles.thumbnailStyle}
source = {{ uri: props.photo.thumbnailUrl}}/>
<Text style= {styles.textStyle}>{props.photo.title} </Text>
</CardSection>
</Card>
);
};
const styles = {
headerContentStyle: {
flexDirection: 'column',
justifyContent: 'space-around'
},
thumbnailStyle: {
height: 60,
width: 60
},
textStyle: {
fontSize: 12,
//textAlign: 'right',
flexDirection: 'row',
justifyContent: 'flex-end',
flex: 1,
flexWrap: 'wrap',
marginLeft: 5,
marginRight: 5,
}
}
export default GalleryDetail;
にしようとする私の方法をリンクさ
import React, {Component} from 'react';
import { FlatList, View, Text, AsyncStorage, ActivityIndicator } from 'react-native';
import axios from 'axios';
import GalleryDetail from './GalleryDetail';
class GalleryList extends Component {
state = { photos: []};
componentDidMount() {
axios.get('http://jsonplaceholder.typicode.com/photos')
.then(response => this.setState({ photos: response.data }))
.catch((error)=> console.warn("fetch Error: ", error));
}
getPhotos = async()=> {
try {
photos = await AsyncStorage.getItem('GalleryPhotos');
}
catch (error) {
console.error(error);
}
}
savePhotos(){
AsyncStorage.setItem('GalleryPhotos', this.state.photos);
console.log('works !');
}
renderPhoto = ({item})=> {
return <GalleryDetail photo={item}/>
}
keyExtractor = (photo, index) => photo.id;
render() {
if(!this.state.photos){
return <ActivityIndicator/>;
}
return (
<FlatList
data = {this.state.photos}
keyExtractor={this.keyExtractor}
renderItem={this.renderPhoto}
/>
);
}
}
export default GalleryList;
とGalleryDetailそれが非同期からフェッチデータ - を見つけた場合は、アプリケーションを起動すると、それは最初に、asyncStorageになりますthat- ましたさもなければウェブに行き、後で使用するために再び取り出して保管してください。 私はすでに実行中のアプリケーションを細かくしたいので、別のファイルにこのように実装しようとしました。奇妙な壊れた構文は
State = {
photos: []
}
componentDidMount() {
// just a variable acting to fetch data from the stored keyvalue pair
check = AsyncStorage.getItem("PhotosKey").then((response) => {
this.setState({"PhotosKey": response});
}).done();
if(check) {
console.log('Data was fetched!!!!!');
check();
}
else {
console.log("Data was not fetched!");
var Data = axios.get('http://jsonplaceholder.typicode.com/photos').
then(response => this.setState({ photos: response.data })).
catch((error)=> console.warn("fetch Error: ", error));
}
}
ありがとうございます!
ありがとう@Subramanyaあなたの助けになりました。それは私のコードがどのように見えるかの本当に良い認識を私に与えました。私は分かち合う心配がほとんどありません。 Reactネイティブの中にasyncstorageを追加しようとする私の動機は、アプリケーションの起動時に、見つけられなかった場合はGalleryPhotosからデータをフェッチする必要があります。データをフェッチし、次に使用するために保存します。あなたが書いたコードは、毎回同じようにデータを取り出して保存することです。データは毎回同じなので、毎回フェッチする必要はありません。私が何かを見逃している場合は、私を修正してください:) –
@ Rex-ありがとうございました。私は、Reduxを実装した後にアプリケーションを更新する際に、このコードを完全に調べます。しかし、お時間をいただければ幸いです。 –
私はあなたのコメントに基づいて答えを更新しました、私は条件付きでチェックを追加しました.GalleryPhotosが存在するかどうかにかかわらず、API呼び出しを行います、それが助けてくれることを願っています。 –