React to setStateでfetch()APIを使用する方法

アルバート

私は、fetch()APIを使用してWebサイトからデータを取得し、setStateを使用してデータと等しい状態を設定し、最後にデータをレンダリングするコンポーネントをReactで作成しようとしています。私のコードは次のようになります:

import React from 'react';

export default class Test extends React.Component {
    constructor(props){
        super(props);
        this.state = {apiInfo: 'default'};
    }

    componentDidMount(){
        fetch('https://fcctop100.herokuapp.com/api/fccusers/top/recent').then(
            function(response){
                return response.json();
            }
            ).then(function(jsonData){
                return JSON.stringify(jsonData);
            }
            ).then(function(jsonStr){
                this.setState({apiInfo: jsonStr});
                console.log(jsonStr);
            });
    }

    render(){
        return(
                <tr>
                    <td>{this.state.apiInfo}</td>
                </tr>
        );
    }
}

ただし、これにより、未定義の状態を設定できないというエラーが発生します。HTMLで「デフォルト」をレンダリングすることになります。私はここで何を間違っているのですか?

チリーペンギン

エラーメッセージは、問題が何であるかを正確に示しています。

未定義の状態を設定できません

そのsetStateため、その時点では存在しないオブジェクトのメソッドとして呼び出し試みています。どのオブジェクトのプロパティsetStateとして、メソッドとして呼び出そうとしていますか?

this.setState({apiInfo:jsonStr});

はい、それthisが問題です。あなたがそれを呼び出そうとしている時点で-すなわち.then()fetch呼び出しの内部-thisは実際には未定義です。これはChromeDevtoolsで確認できます。

ChromeDevtoolsはthis = undefinedを示しています私はそれthisがJavaScriptの滑りやすい顧客だと思います。その値は、アプリの現在のコンテキストに応じて変化する可能性があります(実際に変化します)。

これを回避する方法はいくつかあります。少し不格好な(しかしそれは機能します!)方法の1つはthis、.fetch()呼び出しを入力する前に値をキャプチャし、それを別の変数に割り当てることです。あなたは、多くの場合、表示されますthatまたはself変数は、この目的のために使用されるが、彼らはただの慣習です。変数は好きなように呼び出すことができます。

これが、componentDidMount()メソッドをにキャプチャthisthatthatで呼び出すように作り直した方法です.then()

componentDidMount() {
    const that = this;
    fetch("https://fcctop100.herokuapp.com/api/fccusers/top/recent")
        .then(function(response) {
            return response.json();
        })
        .then(function(jsonData) {
            return JSON.stringify(jsonData);
        })
        .then(function(jsonStr) {
            that.setState({ apiInfo: jsonStr });
            console.log(jsonStr);
        });
}

矢印関数の使用に慣れている場合、別の方法は、次のように「通常の」関数呼び出しを1つに置き換えることです。

.then(jsonStr => {
    this.setState({ apiInfo: jsonStr });
    console.log(jsonStr);
});

矢印関数thisは常にthisその親が定義したものです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Django RESTful APIおよびReactでcsrf_tokenを使用する方法

React NativeのFetchで認証ヘッダーを使用する

ReactでsetStateを使用してオブジェクトを更新する

react-native-fbsdkでグラフAPIを使用する方法

react-native-fbsdkでグラフAPIを使用する方法

ReactでsetState()を使用して配列の値を空白/クリアする方法

React同期プロセスでsetStateを作成する方法

react-nativeでfetchを使用してmultipart / formdataを投稿する方法は?

ReactでクラスオブジェクトをsetStateする方法は?

ReactでsetStateの使用が終了するのを待っています

react-nativeのComponentDidUpdateでprops値をsetStateする方法は?

React:AddListener()でsetStateを使用する方法は?

react-native:setStateでasync / awaitを使用する

react-native:react-nativeで動的状態をsetState()する方法は?

ReactでPaperJを使用する方法は?

TypescriptをReactする方法setState

ReactでTypescriptでPropTypesを使用する方法

ReactでAPIとsetStateからJSONデータをフィルタリングする方法

useEffect内でsetStateを使用するときにReactコードで無限ループを防ぐ方法

React / ReduxでAPIを使用する正しい方法

ReactでsetStateへの非同期呼び出しを処理する方法は?

状態とthis.setStateをreactで定義する方法がわかりません

Reactでfor / inステートメントとfetch()を操作する方法

API呼び出しでReact.Suspenseを使用する方法は?

ReactアプリでFetchを使用してFlaskAPIにPOSTリクエストを送信する方法

ReactフックでuseEffectでsetStateを回避する方法は?

ReactでAPIを使用する

機能コンポーネントReactでsetStateを使用する方法は?

React setState Delayを回避する方法は?

TOP 一覧

  1. 1

    PictureBoxで画像のブレンドを無効にする

  2. 2

    レスポンシブウェブサイトの一番下にスティッキーなナビゲーションバーを作成するのに問題がある

  3. 3

    Rパッケージ「AppliedPredictiveModeling」のインストール中にエラーが発生しました

  4. 4

    Chromeウェブアプリのウェブビューの高さの問題

  5. 5

    HTTPヘッダー 'SOAPAction'の値はサーバーによって認識されませんでした

  6. 6

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  7. 7

    C ++でのcURLとマルチスレッドの使用

  8. 8

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  9. 9

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  10. 10

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  11. 11

    Spring @ModelAttributeモデルフィールドマッピング

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    Ansibleで複数行のシェルスクリプトを実行する方法

  14. 14

    テキストフィールドの値に基づいて UIslider を移動します

  15. 15

    tf.nn_conv2dとtf.nn.depthwise_conv2dの違い

  16. 16

    ZScalerと証明書の問題により、Dockerを使用できません

  17. 17

    MLでのデータ前処理の背後にある直感

  18. 18

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  19. 19

    java.lang.NoClassDefFoundError:com / sun / istack / tools / DefaultAuthenticator $ Receiver

  20. 20

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  21. 21

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

ホットタグ

アーカイブ