私は、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で確認できます。
私はそれthis
がJavaScriptの滑りやすい顧客だと思います。その値は、アプリの現在のコンテキストに応じて変化する可能性があります(実際に変化します)。
これを回避する方法はいくつかあります。少し不格好な(しかしそれは機能します!)方法の1つはthis
、.fetch()呼び出しを入力する前に値をキャプチャし、それを別の変数に割り当てることです。あなたは、多くの場合、表示されますthat
またはself
変数は、この目的のために使用されるが、彼らはただの慣習です。変数は好きなように呼び出すことができます。
これが、componentDidMount()メソッドをにキャプチャthis
しthat
、:that
内で呼び出すように作り直した方法です.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]
コメントを追加