2016-10-08 10 views
1

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プロパティを繰り返し処理します。

どこが間違っていますか?

答えて

2

ミス(ファイグエンに述べたように)、修正するためにいくつかの他のものから部分:

1)Axiosは、応答オブジェクトとの約束を解決します。だから、あなたがする必要がある結果を得るために:

axios.get('https://jsonplaceholder.typicode.com/users') 
    .then(res => { 
     const users = res.data; // Assuming the response body contains the array 
     this.setState({ users }); 
    }); 

は、ここではレスポンスオブジェクトについてのドキュメントをチェックアウト:https://github.com/mzabriskie/axios#response-schema

2)例外がある場合(あなたの要求が失敗した)あなたは、おそらく代わりに、それを処理したいですそれを飲み込む従って:

axios.get('https://jsonplaceholder.typicode.com/users') 
    .then(res => { 
    const users = res.data; // Assuming the response body contains the array 
    this.setState({ users }); 
    }) 
    .catch(err => { 
     // Handle the error here. E.g. use this.setState() to display an error msg. 
    }) 
+0

これはうまくいった - ありがとう。私はちょっと混乱します。結果を 'console.log'すると、2つの値が返されます:' [] 'とAPIからの期待される配列。おそらく、状態値が初期化時に1回戻され、その後componentDidMountによって戻されるということで説明できます。しかし、配列中の一つのオブジェクト 'this.state.users [0]'にアクセスしようとすると、空の配列にアクセスしようとします。私は配列にマッピングするだけでそれを得ることができます。毎回、更新された 'this.state.users'値をターゲットにし、初期状態値を取得しないようにする方法はありますか? – Paulos3000

+0

this.setStateを呼び出すたびに、renderメソッドが再度呼び出され、コンポーネントの新しい状態が反映されます。次の図を参照してください:http://imgh.us/react-lifecycle.svg初期レンダリングがあるので(ユーザーが初期化されていない場合)、componentDidMountの後に2番目のレンダリングがあり、setStateを呼び出した後に3番目のレンダリングがあります。この時点であなたはユーザーのリストを持っています)。コンポーネントコンストラクタでリストを初期化できます。 renderメソッドでは、 '' 'this.state.users'''が空であるかどうかをチェックし、ローダなどを表示できます。 –

2

typo。 ComponentDidMountの代わりにcomponentDidMountにする必要があります。

関連する問題