2017-10-07 9 views
1

私は反応コンポーネントをやっています。私は目的球の内側に共通AJAX呼び出しを持っている:関数内の状態を変更する方法

getPost = (postName, storage) => { 
    this.setState({fetchInProgress: true}) 
    $.ajax({ 
     url: "/api/getitems", 
     type: "GET", 
     dataType: 'json', 
     ContentType: 'application/json', 
     data: {modelName: postName}, 
     success: (data) => { 
     this.setState({ 
       storage: data, 
       fetchInProgress: false 
      }) 

     }, 
     error: (jqXHR) => { 
     this.setState({fetchInProgress: false}) 
     console.log('ERRORR') 
     } 
    }) 
    } 

は、私はこのようにそれを呼び出す:

this.getPost('StandartPost', this.state.standartPosts) 

が、それは仕事をdoens't。私は多くの異なるタイプの投稿を持っています。今の私はスイッチを使用してこれをしなかった:

success: (data) => { 
     switch(postName){ 
      case: 'StandartPost' 
      this.setState({ 
       standartPosts: data, 
       fetchInProgress: false 
      }) 
      ...and so on 
     } 
     } 

をここに私は私の関数の2番目のパラメータを使用していませんよ。しかし、あまりにも多くのコードがあります。私はちょうどthis.setStateメソッド内のキーとしてthis.state.something使用しようとしました::

success: (data) => { 
      this.setState({ 
        storage: data, 
        fetchInProgress: false 
       }) 

      } 

this.getPost('StandartPost', this.state.standartPosts) 

UPD:このようにそれを行うための方法があるだけでなく

    this.setState({ 
        this.state.data: data, 
        fetchInProgress: false 
       }) 

、それを何もしません。 this.state.dataはまだ空の配列です。

UPD2

success: (data) => { 
     this.state[storage] = data 
     this.setState({ 
      fetchInProgress: false 
     }) 

と、このようでgetPost(postName、ストレージ)関数を呼び出します:

this.getPost('StandartPost', 'standartPosts') 

そして、それが正常に動作します私は私のAJAX呼び出しに次のように行われまし。私はsetStateメソッドの中でデータを設定する方法を見つけることはできません。しかし、少なくともコードは少なくなります。

+0

もしあれば何がありますか? – topher

+0

私は自分のサーバーにも、反応コンポーネントによってもエラーはありません。しかし、私のコンポーネントはデータをレンダリングしません。 –

+0

問題がsetState(){}で状態を変更していないかどうかを確認するために、componentDidUpdate(prevState){}とconsole.logを作成します。 –

答えて

2

Do not modify state directly。コンストラクタで直接状態を割り当てる必要があります。 、あなたは次のように角括弧で変数をラップすることにより、オブジェクトのキーとして変数を使用して設定することができES6を使用

:、

this.setState({ 
    [storage]: data, 
    fetchInProgress: false 
}); 

ない場合は、新しいオブジェクトを作成している可能性がnewState言うと、渡されましたそれでsetState

success: (data) => { 
    let newState = { 
    fetchInProgress: false 
    }; 
    newState[storage] = data; 
    this.setState(newState); 
} 
関連する問題