2017-10-26 12 views
0

私は、入力フィールドの変更に応じて起動するハンドラを持っています。しかし、コンソールに状態を記録するとresDataは 'undefined'になりますか? console.log(body)は結果を返すので不可能です。setStateの後の状態は未定義ですか?

handlePersonNameChange(event) { 
var resData 
request('https://swapi.co/api/people/?search='+event.target.value, function (error,response,body) { 
    console.log(body) 
    resData = body 
}) 
this.setState({personData: resData}); 
console.log(this.state) 
} 
+0

リクエストコールバック内で状態を設定する必要があります。また、Reactの設定状態は非同期であるため、次の行で 'setState()'と 'console.log(this.state)'を実行できず、状態が更新されることが期待されます。 – Jayce444

+0

この場合、TypeErrorが返されます:this.setStateは関数ではありません – elvezet13

答えて

1

次の例のように、要求コールバック内setStateする必要があります。

request('https://swapi.co/api/people/?search='+event.target.value, function (error,response,body) { 
    console.log(body) 
    resData = body 
    this.setState({personData: resData}); 
}) 

あなたはあなたの例ではsetStateを行うときに、あなたの要求はresovledていないため。

+0

この場合、TypeErrorが返されます:this.setStateは関数ではありません。 – elvezet13

+1

これは、コールバックがバインドされていないためです。矢印関数(ES6をサポートしている場合)(error、response、body)=> {this.setState({personData:body})} –

1

リクエストコールはasynchroneです。this.setStateをレスポンスボディに入れる必要があります。

また、this.setStateはasynchroneです。結果を見るには、コールバック関数を使用する必要があります。このファンクションは、新しい状態が設定された後に呼び出されます。

handlePersonNameChange(event) { 
    var resData 
    request('https://swapi.co/api/people/?search='+event.target.value, 
    function (error,response,body) { 
    console.log(body) 
    resData = body 
    this.setState({personData: resData}, function() { 
     console.log(this.state) 
    }) 
    }) 
} 

詳細情報を、約this.setState()here

0
this.setState({ state : "new1" }) 

この方法は、同期ではありません見つけることができますので、状態をログに記録されている場合、それはまだ更新されていません。

あなたはcomponentWillUpdateライフサイクルメソッドでログインする必要があります。

関連する問題