2017-08-29 103 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