2016-05-08 6 views
2

コンポーネントの状態を変更しようとするとエラーが発生します。スーパーエージェントとリアクトを使用したAPIレスポンスからsetState

Uncaught TypeError: Cannot read property 'setState' of undefined

constructor(props){ 
    super(props); 

    this.state={ 
     r:'', 
     message:'' 
    }; 
    this.setStateMessage = this.setStateMessage.bind(this); 
} 
setStateMessage (e){ 
    e.preventDefault(); 
    var test = this.state.message; 

    request 
     .post('http://127.0.0.1:5000/api/db') 
     .send({message: this.state.message}) 
     .accept('application/json') 
     .withCredentials() 
     .end(function(err, res){ 
     if(err) 
      throw err; 
     this.setState({ r: res.body.message }); 
     }); 
} 

render() { 
    return (
     <div> 
      <div className='response'> 
       {this.state.r} 
      </div> 
      //form with input 
     </div> 
    )} 

答えて

6

あなたがそうthis関数内からthis.setStateを呼び出しているので、これはある実際にあなたがしている関数への参照です。あなたは正しいthisへの参照を保存したり、その矢印を使用するか必要があります独自のコンテキストを持たず、親コンテキストから継承します。だから、:

setStateMessage (e){ 
    e.preventDefault(); 
    var test = this.state.message; 
    var self = this; 

    request 
    .post('http://127.0.0.1:5000/api/db') 
    .send({message: this.state.message}) 
    .accept('application/json') 
    .withCredentials() 
    .end(function(err, res){ 
     if(err) throw err; 
     self.setState({ r: res.body.message }); 
    }); 
} 

または:

setStateMessage (e){ 
    e.preventDefault(); 
    var test = this.state.message; 

    request 
    .post('http://127.0.0.1:5000/api/db') 
    .send({message: this.state.message}) 
    .accept('application/json') 
    .withCredentials() 
    .end((err, res) => { 
     if(err) throw err; 
     this.setState({ r: res.body.message }); 
    }); 
} 
+0

私は今日目を覚まし、実際にコールバック関数に関連しているという考えを持っていました問題のrit。私の最高の推測は、 'var res = request.post( '......);'のようなものを書いてコールバック関数の外でsetStateで 'res'を使うことでしたか?それは3番目の選択肢でしょうか? – Ando

+0

最後にもう1つの質問...私がReduxを使用していたら、私は 'ディスパッチ 'を使うことができました。それはReduxの機能が世界的に欠けているからですか? – Ando

+0

'dispatch'はグローバルに定義されていません。 reduxを使用している場合は、 'redux-thunk'を使用して非同期アクション内からAPIを呼び出す必要があります。例を使って質問に答えるのは少し難しいです。しかし、このコールバックから 'this.setState'を呼び出さないので、この問題は発生しません。それはあなたがJSの 'this'の読書をするべきだと言った。さもなければあなたはどこか他の場所で混乱するだろう。 – aray12

2

@のaray12の答えに追加するには、あまりにもコールバックをバインドすることができます。この私の最終的なコードの上にあまりにも多くの時間を過ごした後

setStateMessage (e){ 
    e.preventDefault(); 
    var test = this.state.message; 

    request 
    .post('http://127.0.0.1:5000/api/db') 
    .send({message: this.state.message}) 
    .accept('application/json') 
    .withCredentials() 
    .end((function(err, res) { 
     if(err) throw err; 
     this.setState({ r: res.body.message }); 
    }).bind(this)); 
} 
0

はここにある

class Data extends React.Component{ 

    constructor(){ 
     super() 
     this.state={ 
      name:'' 
     } 
    } 

    componentDidMount(){ 
     console.log('componentDidMount'); 

     var url = "http:\//localhost:3000/order/test"; 
     Request 
     .get(url) 
     .query(null) 
     .set('Accept', 'application/json') 
     .end ((error, response)=>{ 
      const title=response.text 
      console.log(JSON.stringify(title)); 

      this.setState({ 
       name:title 
      }); 
     }); 

    } 

    render(){ 
     return <div>World {this.state.name}</div>; 
    } 

} 

注:応答は、あなたが、私は私の場合に使用してresponse.textを使用する必要がテキストがある場合

詳細を知りたい場合click here

関連する問題