2017-10-07 16 views
1

我在做反應組件。我有funtion裏面常見的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) 

但它好好嘗試的工作。我有很多不同類型的帖子。現在我用開關做了這個:

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

這裏我沒有使用我的函數的第二個參數。但是也有太多的代碼。有沒有辦法做到這一點是這樣的:

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

      } 

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

UPD:我只是試圖用this.state.something作爲this.setState方法中的一個關鍵:

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

好,它什麼也沒做。 this.state.data仍然是一個空數組。

UPD2:我已經做了我的Ajax調用如下:

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

,並調用這樣的功能的getPost(postName,存儲):

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

,它工作正常。我沒有找到一種方法來設置setState方法中的數據。但至少有更少的代碼。

+0

如果有什麼錯誤,你會得到什麼? – topher

+0

我沒有任何錯誤,也沒有在我的服務器中或在反應組件中。但是我的組件不提供任何數據。 –

+0

創建一個componentDidUpdate(prevState){}和console.log都prevState.standartPosts和this.state.standartPosts來檢查問題是否是你的setState(){}不改變狀態 –

回答

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); 
}