2017-08-27 89 views
0

我希望狀態依賴於服務器數據。我想用componentWillMount的:this.setState不能在componentWillMount()上工作?

componentWillMount() { 
    this.setState(async ({getPublicTodosLength}, props) => { 
     const result = await this.getPublicTodosLengthForPagination(); 
     console.log("result = ", result) // returns the length but not assigned on this.state.getPublicTodosLength 
     return { getPublicTodosLength: result+getPublicTodosLength } 
    }); 
    } 

    getPublicTodosLengthForPagination = async() => { // get publicTodos length since we cannot get it declared on createPaginationContainer 
     const getPublicTodosLengthQueryText = ` 
      query TodoListHomeQuery {# filename+Query 
      viewer { 
       publicTodos { 
       edges { 
        node { 
        id 
        } 
       } 
       } 
      } 
      }` 
    const getPublicTodosLengthQuery = { text: getPublicTodosLengthQueryText } 
    const result = await this.props.relay.environment._network.fetch(getPublicTodosLengthQuery, {}) 
    return await result.data.viewer.publicTodos.edges.length; 
    } 

沒有價值,但它沒有分配我getPublicTodosLength狀態?我覺得我沒有,因爲結果返回,我想對getPublicTodosLength狀態分配數據在這裏綁定

+0

的價值是存在的,我希望它在getPublicTodosLength轉讓,但我失敗了,無法弄清楚,爲什麼@ 82Tuskers –

+0

如果刪除'會發生什麼async'嵌套在' .setState(...'?(不是具有'async'和'await'結構的專家..:/) – 82Tuskers

回答

0

可能是你可以使用:

代碼片段:

(async ({getPublicTodosLength}, props) => { 
     const result = await this.getPublicTodosLengthForPagination(); 
     console.log("result = ", result); 
     return { getPublicTodosLength: result + getPublicTodosLength } 
})).then((v)=> this.setState(v)); 

請讓我知道如果有效的話。

0

爲什麼不寧願做這樣的事情?

... 
async componentWillMount() { 
    const getPublicTodosLength = this.state.getPublicTodosLength; 
    const result = await this.getPublicTodosLengthForPagination(); 
    this.setState({ 
    getPublicTodosLength: result+getPublicTodosLength, 
    }); 
} 
... 

它更簡單,更容易閱讀。我認爲原始代碼的問題是在setState()內部使用異步函數。在傳輸代碼中,創建了另一個包裝函數,然後它可能會鬆散上下文。

0

如果你想要你的狀態依賴於服務器數據,你應該使用componentDidMount()

componentWillMount()在安裝發生之前立即被調用。它在調用之前調用(),因此在此方法中同步設置狀態不會觸發重新渲染。避免在此方法中引入任何副作用或訂閱。 這是在服務器渲染上調用的唯一生命週期鉤子。通常,我們建議使用構造函數()。

在安裝組件後立即調用componentDidMount()。需要DOM節點的初始化應該放在這裏。 如果您需要從遠程端點加載數據,那麼這是一個很好的地方來實例化網絡請求。在此方法中設置狀態將觸發重新渲染。

From React Doc

0

我決定componentWillMount異步,效果不錯。

這是代碼:

componentWillMount = async() => { 
    let result = await this.getPublicTodosLengthForPagination(); 
    this.setState((prevState, props) => { 
     return { 
     getPublicTodosLength: result 
     } 
    }); 
    } 
相關問題