2016-08-18 38 views
0

我讀過很多關於這個問題的文章,關於this.setState的東西是一個異步調用,所以它不會每次都重新渲染。怎樣運用給出下面的背景下,這個問題:setState在函數調用中沒有更新

getInitialState:() -> 
    return { 
     page: "" 
    } 

choose: (event) -> 
    console.log(@props.id) # This is the correct id that I want to pass into state 
    @setState({ 
     page: @props.id # @state.page isn't being set to @props.id 
    }) 

render:() -> 
    return (
     <button onClick={@choose}>Click me</button> 
    ) 

我試圖bind中的onClick調用諸如onClick={@choose.bind(@)}但似乎已經做出反應自動執行此操作。點擊按鈕後,如何正確設置choose()中的狀態?

解決方案:這是調用父組件的子組件,因此state在那裏丟失了某處。我所要做的就是調用父組件的id作爲道具,並通過它訪問它。

+1

你沒有使用你的榜樣this.state.page任何地方,所以這是一個有點很難知道什麼是不工作的。 – tobiasandersen

+0

這應該可以正常工作,什麼不工作?在你的渲染,如果你'console.log(this.state.page)'它不顯示你想要的ID? – John

回答

2

您的代碼似乎正確。不保證它是同步的,其執行可能會延遲。這意味着,如果你試圖在你的代碼@setState後立即訪問@state.name,你會得到舊值

choose: (event) -> 
    console.log(@props.id) # This is the correct id that I want to pass into state 
    @setState({ 
    page: @props.id # @state.page isn't being set to @props.id 
    }) 
    console.log(@state.name) # here's old value 

所以,你應該使用@setState的第二個參數,這是回調函數,將更新狀態後馬上被稱爲,所以

choose: (event) -> 
    console.log(@props.id) # This is the correct id that I want to pass into state 
    @setState({ 
    page: @props.id # @state.page isn't being set to @props.id 
    },() => 
     console.log(@state.name) # <-- updated value here! 
) 
    console.log(@state.name) # here's old value