私はReactで手を汚しています。 ReactJSを使用してwikipedia viewerプロジェクトを書くことに決めました。しかし、Reactコンポーネントを使ってwikipediaのAPIからデータを取得した後、私は昨日レンガの壁に当たった。そして、私はそれが非同期呼び出しと関係があると思います。非同期呼び出しに反応する際にAPIを使用するにはどうすればよいですか?
私は、クエリを取り込み、APIのURLにそれを注入定数定義された:その後、私はComponentDidMount状態で非同期APIをフェッチするクラスを定義し javascript const apiUrl = query => `https://crossorigin.me/https://en.wikipedia.org/w/api.php?action=opensearch&format=json&search=${query}`
を:
class Wiki extends React.Component {
constructor(props){
super(props);
console.log('Inside Constructor')
}
componentWillMount(){
this.setState = {
wikiData: undefined
}
console.log('Before fetch')
fetch(apiUrl(this.props.query))
.then(console.log('fetch successful'))
.then(response => {
if(!response.ok){
throw Error("Response not ok")
}
return response
})
.then(data => data.json())
.then(data => {
this.setState ={
wikiData: data
}
console.log(data)
})
}
render(){
if(!this.state.wikiData == null) return <p>No answer</p>
else{
return (
<div>
<h1>Something happened</h1>
<h2>{this.state.wikiData[0]}</h2>
</div>
)
}
}
}
私はこれをアプリケーションコンポーネントで呼び出すと、データがコールから返され、nullではなくなったが、レンダリングが中断する原因となるTypeErrorが「ヌルのプロパティ 'wikiData'を読み取れません」というメッセージが表示されます。 Console messaqges 代わりにcomponentDidMountを使用しようとしましたが、どちらも動作しません。 私は何をすべきか分かりません。私はこのプロセスを理解したいと思います。 は、ここに私のcodepenです: https://codepen.io/Banhawy/pen/eEmQBW?editors=1010
私はレンダリングする前にそれにアクセスして処理できるように、APIの呼び出しがデータで返された後にのみコンポーネントをレンダリングする方法を知りたいです。
「api」が解決されるまでに別のルートに移動したため、このコンポーネントがアンマウントされた場合はどうなりますか? 'this.setState'は、アンマウントされたcomponent__に対して状態を設定することを__tryingすることを失敗します。これらのシナリオをどのように扱うのですか? – guleria