AsyncStorage
をComponentWillMount
に保存すると、accessToken
にローカルに格納されますが、render()
機能が実行された後に約束を返します。約束が完了するまで、どうすればrender()
を待つことができますか?ありがとうございました。ReactネイティブAsyncStorageはレンダリング後にデータを取得します
答えて
から情報を取得として、ロード画面は、あなたとしてそれを再レンダリングしてもらいます。私が取り組んでいるアプリケーションで行ったことは、AsyncStorageからの約束が解決されるまで、読み込み画面を追加することです。以下の例を参照してください:
import React, {
AsyncStorage,
View,
Text
} from 'react-native';
class Screen extends React.Component {
state = {
isLoading: true
};
componentDidMount() {
AsyncStorage.getItem('accessToken').then((token) => {
this.setState({
isLoading: false
});
});
},
render() {
if (this.state.isLoading) {
return <View><Text>Loading...</Text></View>;
}
// this is the content you want to show after the promise has resolved
return <View/>;
}
}
を状態オブジェクトにisLoading
プロパティを設定すると、再描画が発生しますと、あなたはaccessTokenに依存しているコンテンツを表示することができます。
私は、AsyncStorageのデータ管理を簡略化するreact-native-simple-storeという小さなライブラリを作成しました。あなたはそれが有用であることを願っています。反応ネイティブdocに基づいて
最新のReact Nativeバージョンではまだ動作していますか?私はこのコードを正確に実装しましたが、「読み込み中...」という言葉は永遠に続きます。コンソールのログをレンダリングしてisLoading(ifメソッドなし)を表示すると、返り値はfalse、それからtrueであるため、理論的には動作するはずです。しかし、ifメソッドを有効にして 'Loading'を永久に止めれば、ログはfalseを返します。 – Hasen
私は上記のHasenと同じ問題を抱えています。私のrender()関数は、状態が更新された後、二度目に呼び出されることはありません。だから私の読み込み画面は無期限に表示されます.... – Dygerati
私は同じ問題を抱えていました。誰かがこれを解決する方法を手に入れましたか? – DsEsteban
リアクションネイティブは、ブロッキング関数をサポートしていないJavascriptに基づいています。これは、UIが固まったり、反応しないようにしたくないため意味があります。 あなたができることは、レンダー機能でこれを処理することです。すなわちあなたはrender
は、私の知る限り待つことはできませんあなたがAsyncStorage
状態変数を更新すると「再レンダリング」されます。つまり、レンダリング機能が再び呼び出されます。 –
は、あなたがこのような何かを行うことができます。
正確にあなたがデータをどうしようとしている何import React, { Component } from 'react';
import {
View,
} from 'react-native';
let STORAGE_KEY = '@AsyncStorageExample:key';
export default class MyApp extends Component {
constructor(props) {
super(props);
this.state = {
loaded: 'false',
};
}
_setValue = async() => {
try {
await AsyncStorage.setItem(STORAGE_KEY, 'true');
} catch (error) { // log the error
}
};
_loadInitialState = async() => {
try {
let value = await AsyncStorage.getItem(STORAGE_KEY);
if (value === 'true'){
this.setState({loaded: 'true'});
} else {
this.setState({loaded: 'false'});
this._setValue();
}
} catch (error) {
this.setState({loaded: 'false'});
this._setValue();
}
};
componentWillMount() {
this._loadInitialState().done();
}
render() {
if (this.state.loaded === 'false') {
return (
<View><Text>Loading...</Text></View>
);
}
return (
<View><Text>Main Page</Text></View>
);
}
}
?これを回避する方法の1つは、空の変数をgetInitalState関数に格納し、AsyncStorageが値を返すときに新しい値で状態を設定することです。 –
質問をいただきありがとうございます。AsyncStorageからローカルに格納されたaccessTokenを取得して状態を設定しています。しかし、それが約束を返すので、render()関数は最初に実行され、その後すぐに状態が設定されます。だから私はrender()が状態をチェックしてログインページやメインアプリを返すので、私がアプリを訪れるたびに簡単にログインページを見る(〜0.1秒)。 – skleest
ああ、大丈夫です。ローダー/ローディング・メッセージを表示してから、ログイン・ビューまたはログイン・ビューのいずれかに置き換える以外に、それを修正する方法がわかりません。 –