[解決済み] 非同期のcomponentDidMount()を使うのは良いことですか?
質問
を使用していますか?
componentDidMount()
を非同期関数として使用することは、React Native では良い習慣ですか、それとも避けた方が良いですか?
から情報を取得する必要があります。
AsyncStorage
コンポーネントがマウントされるとき、私が知っている唯一の方法は、コンポーネントがマウントされるときに
componentDidMount()
関数を非同期で実行します。
async componentDidMount() {
let auth = await this.getAuth();
if (auth)
this.checkAuth(auth);
}
それについて何か問題があるのか、また他に解決策はあるのか。
どのように解決するのですか?
まずは、その違いを指摘し、どのようなトラブルが起こりうるかを判断することから始めましょう。
以下は、asyncと"sync"のコードです。
componentDidMount()
ライフサイクルメソッド
// This is typescript code
componentDidMount(): void { /* do something */ }
async componentDidMount(): Promise<void> {
/* do something */
/* You can use "await" here */
}
コードを見ると、次のような違いが指摘できる。
-
は
async
のキーワードを使用します。タイプスクリプトでは、これは単なるコードマーカーに過ぎない。これは2つのことをする。-
戻り値の型を強制的に
Promise<void>
ではなくvoid
. 戻り値の型を明示的にpromise以外(ex: void)に指定すると、typescriptはエラーを吐き出します。 -
を使用できるようにします。
await
キーワードをメソッド内で使用します。
-
戻り値の型を強制的に
-
戻り値の型が
void
からPromise<void>
-
できるようになったということです。
async someMethod(): Promise<void> { await componentDidMount(); }
-
できるようになったということです。
-
を使用できるようになりました。
await
キーワードをメソッド内で使用し、一時的にその実行を停止します。このようにasync componentDidMount(): Promise<void> { const users = await axios.get<string>("http://localhost:9001/users"); const questions = await axios.get<string>("http://localhost:9001/questions"); // Sleep for 10 seconds await new Promise(resolve => { setTimeout(resolve, 10000); }); // This line of code will be executed after 10+ seconds this.setState({users, questions}); return Promise.resolve(); }
さて、どうしてトラブルが起きるのでしょうか?
-
は
async
キーワードは全く無害です。 -
を呼び出す必要があるような状況は想像もつきません。
componentDidMount()
メソッドを使用するため、戻り値の型はPromise<void>
も無害です。の戻り値の型を持つメソッドを呼び出すと
Promise<void>
がなくawait
のキーワードで呼び出したとしても、戻り値の型がvoid
. -
の後のライフサイクルメソッドは存在しないので。
componentDidMount()
の実行を遅らせることは、かなり安全だと思われます。しかし、困ったことがあります。例えば、上記の
this.setState({users, questions});
は10秒後に実行されます。遅延時間の途中で、別の...this.setState({users: newerUsers, questions: newerQuestions});
... は正常に実行され、DOM が更新されました。その結果は、ユーザーにも見えるようになった。時計は動き続け、10秒が経過した。遅れていた
this.setState(...)
が実行され、DOMは再び更新され、今度は古いユーザーと古い質問で更新されます。結果はユーザーにも表示されます。
=>かなり安全(100%とは言い切れませんが)なのは
async
と
componentDidMount()
メソッドを使用します。私はこのメソッドの大ファンであり、今のところ頭を悩ませるような問題には遭遇していません。
関連
-
[解決済み] reactでonloadを使うには?
-
[解決済み] ReactのuseEffectでローディング関数を1回だけ呼び出す方法
-
[解決済み] react jsでウィンドウを開くイベントを処理するにはどうすればよいですか?
-
[解決済み] React Hooksの「exhaustive-deps」lintルールを理解する
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み】ReactのPropTypes。1つのプロップに対して異なるタイプのPropTypesを許可する
-
[解決済み] インターフェース実装の非同期化
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Apolloクライアントでログアウトした後、ストアをリセットする
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避するにはどうすればよいですか?
-
[解決済み] useStateプロパティのフックにmap関数を使用する方法
-
[解決済み] ReactJS: Warning: setState(...): 既存の状態遷移の間に更新することはできません
-
[解決済み] リアクトです。<tr>は<td>の子として表示できません。コメント > td > tr を参照してください。
-
[解決済み] formcontrollabel - material-ui | Reactのデフォルトのtypography classを変更するには?
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] React - 予想外のトークン、予想外の;
-
[解決済み] React Router - バージョン更新後のwithRouterでTypescriptエラーが発生する。
-
[解決済み] React」は定義される前に使用されていた