2017-08-29 123 views
0

我想從if語句中設置狀態,但它不會這樣做。 結果我需要更新if語句中的狀態,我可以接收經度和緯度座標,但它不會保存狀態。如果我在控制檯的if語句之外回顯,我將只讀取第一個setState值形式componentWillMount。那裏有什麼問題?我在這裏做錯了什麼? 因此,這裏的結構:反應setState不會更新

componentWillMount() { 
    this.setState({ 
     location: { 
      name: 'Riga' 
     } 
    }); 
} 

componentDidMount() { 
    if (!!navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition((position) => { 

      this.setState({ 
       location: { 
        name: 'Sigulda' 
       } 
      }); 
     }); 
    } else { 
     alert('ERROR on GEOLOCATION'); 
    } 

    console.log(this.state.location); 
} 
+0

https://stackoverflow.com/questions/41278385/this-setstate-doesnt-mutate-state-immediately/41278440#41278440 –

回答

4

setState行動是異步的。

setState()不會立即改變this.state,但會創建一個 掛起狀態轉換。調用 方法後訪問this.state可能會返回現有值。沒有 保證同步操作對setState的調用,並且調用可能爲 進行批處理以提高性能。

您應該使用setState回調函數:

this.setState({ 
    location: { 
    name: 'Sigulda' 
    } 
},() => console.log(this.state.location)); 
+0

謝謝你的解釋,這解決了我的問題! – Sangsom

3

setState是異步的:

this.setState({ 
       location: { 
        name: 'Sigulda' 
       } 
      },() => console.log(this.state.location)); 

使用的setState回調來確定改變

+1

的可能的複製完美的答案.. setState是異步的,你可以在這裏傳遞一個回調,如上面演示的一樣,因爲你想使用更新的狀態 –

+0

謝謝你的解釋,這解決了我的問題! – Sangsom

+1

儘管您可能會遇到其他問題,如@MayankShukla已經說過。我不熟悉'geolocation',但你的'setState'問題已修復 – Nocebo