残念ながら、時にはサーバ要求は失敗し、我々は、ユーザーに有用なエラーメッセージを表示する必要があります。このレッスンでは、我々はそのエラー情報を収集することができるように、私たちは約束の拒絶反応を処理します、そして我々はまた、我々は、我々は常にユーザーを示し確実にするために、決定論renderメソッドを持っているので、我々は最高のディスプレイは私たちの要求の状態を管理する方法を学びます私たちの現在の状態に基づいて適切な情報がコンポーネント反応します。
人々が作るよくある間違いは、と呼ばれる状態変数を作成することである isLoading
とすることを設定し true
たりします false
。代わりに、我々は、使用しているでしょう status
に設定できる変数を idle
、 pending
、 resolved
、または rejected
。あなたは、これはより重要である理由について詳しく学ぶことができ isLoadingブール値を使用して停止します。
< 身体> < div要素のid = "ルート" > </ divの> < スクリプトSRC = "https://unpkg.com/[email protected]/umd/react.development.js" > </ スクリプト> < スクリプトSRC = "https://unpkg.com/[email protected]/umd/react-dom.development.js" > </ スクリプト> < スクリプトSRC = "https://unpkg.com/@babel/standalone 7.8.3 / babel.js @」> </ スクリプト> < スクリプトタイプ= "テキスト/バベル" > 機能 = PokemonInfo({pokemonName}){ CONST [ステータス、のsetStatus] React.useState(' 遊休' ) CONST [ポケモン、setPokemon] = React.useState(ヌル) CONST [エラー、SETERROR] = React.useState(ヌル) React.useEffect(()=> { もし(!pokemonName){ リターン } のsetStatus(' ペンディング' ) fetchPokemon(pokemonName).then( pokemonData => { のsetStatusは(' 解決します ' ) setPokemon(pokemonData) }、 errorData => { のsetStatus(' 拒否' ) SETERROR(errorData) } ) }、[pokemonName]) 場合(ステータス=== ' アイドル' ){ リターン ' モンスターを提出' } もし(ステータス=== 「拒否」){ リターン 「ああ、いや... 」 } 場合(ステータス=== ' ペンディング' ){ リターン ' ... ' } 場合(ステータス=== ' 解決が' ){ リターン < 事前> {JSON.stringify(ポケモン、NULL 、2 )} < / PRE> } } 関数アプリ(){ CONST [pokemonName、setPokemonName] = React.useState('' ) 関数handleSubmit(イベント){ event.preventDefault() setPokemonName(event.target.elements.pokemonName.value) } リターン( < DIV > < 形成をonSubmit = {handleSubmit} > < ラベルhtmlFor = " pokemonName " > ポケモン名< / label>は < DIV > < 入力ID = " pokemonName " / > < ボタンタイプ= " 提出" > 送信< / button>の </ div> < / フォーム> < hrで/ > < PokemonInfo pokemonName = {pokemonName} / > < / div> ) } 関数fetchPokemon(名){ CONST pokemonQuery = ' クエリ($名:文字列){ ポケモン(名称:$名){ ID 番号 名前 攻撃{ 特殊{ 名前の 型 損傷 } } } } ` リターンウィンドウ .fetch(' https://graphql-pokemon.now.sh ' 、{ // より、ここでこのAPIを学ぶ:https://graphql-pokemon.now.sh/ 方法:' POST ' 、 ヘッダー:{ ' コンテンツタイプ' :' アプリケーション/ JSON;のcharset = UTF-8 ' 、 }、 本体:JSON.stringify({ クエリ:pokemonQuery、 変数:{名前} }) }) .then(R=> r.json()) .then(応答=>response.data.pokemon) } ReactDOM.render(< アプリケーション/ >、のdocument.getElementById( 'ルート')) </ スクリプト> </ ボディ>