AxiosをReactで使って簡単なAJAX呼び出しをしようとしていますが、どこが間違っているのか分かりません。Axios AJAXの呼び出し元の状態だけを返す
ComponentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/users')
.then(res => {
const users = res
this.setState({ users });
});
}
render() {
console.log(this.state.users) // returns the **initialised EMPTY array**
return (
<div>
{this.state.users.map(user => <p>{user.name}</p>)} // returns nothing
</div>
)
}
私は.get()
法で指定されたURLに単純な配列にアクセスしています(必要であれば、それは構造だ見るためにそれをチェックアウト):ここで
は、私がこれまでのところ(私のコンポーネント内で)持っているものです。私は次に.then()
の約束を連鎖させ、res
引数を矢印の関数に渡します。
次に、users
変数を結果に代入し、このように状態を設定しようとします。 この時点で私はthis.state.usersが結果の配列と等しくなることを期待しています。
しかし...
A)私ははconsole.log(this.state.usersを)しようとすると、私はのマップをレンダリングしようとすると、それが初期化空の配列
B)を返します。各オブジェクトのname
プロパティを繰り返し処理します。
どこが間違っていますか?
これはうまくいった - ありがとう。私はちょっと混乱します。結果を 'console.log'すると、2つの値が返されます:' [] 'とAPIからの期待される配列。おそらく、状態値が初期化時に1回戻され、その後componentDidMountによって戻されるということで説明できます。しかし、配列中の一つのオブジェクト 'this.state.users [0]'にアクセスしようとすると、空の配列にアクセスしようとします。私は配列にマッピングするだけでそれを得ることができます。毎回、更新された 'this.state.users'値をターゲットにし、初期状態値を取得しないようにする方法はありますか? – Paulos3000
this.setStateを呼び出すたびに、renderメソッドが再度呼び出され、コンポーネントの新しい状態が反映されます。次の図を参照してください:http://imgh.us/react-lifecycle.svg初期レンダリングがあるので(ユーザーが初期化されていない場合)、componentDidMountの後に2番目のレンダリングがあり、setStateを呼び出した後に3番目のレンダリングがあります。この時点であなたはユーザーのリストを持っています)。コンポーネントコンストラクタでリストを初期化できます。 renderメソッドでは、 '' 'this.state.users'''が空であるかどうかをチェックし、ローダなどを表示できます。 –