无法在componentDidMount中设置setState

时间:2018-03-19 23:14:47

标签: reactjs geolocation

我正在尝试在componentDidMount中设置位置。我猜测this没有被传递到内部函数。

参见我的例子:



import React, { Component } from 'react';
import GoogleMapReact from 'google-map-react';

const map = {
  width: '100%',
  height: '100vh'
};

const AnyReactComponent = ({ text }) => <div>{ text }</div>;

export default class Map extends Component {
  constructor(props) {
    super(props)
    this.state = {
      center: { lat: 40.7446790, lng: -73.9485420 },
      zoom: 11
    }
  };

  componentDidMount(){
    
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(
        function(position) {
          console.log(position);

          this.setState({
            center: { lat: position.coords.latitude, lng: position.coords.longitude },
          })              
        }
      )
    }
  }

  render() {
    return (
      <div className='map' style={ map }>
        <GoogleMapReact
          bootstrapURLKeys={{ key: 'AIzaSyD3Gu9y1qJChfayVFglovKEY2xjgKBiCJA' }}
          defaultCenter={ this.state.center }
          defaultZoom={ this.state.zoom }>
          <AnyReactComponent
            lat={ 40.7473310 }
            lng={ -73.8517440 }
            text={ "Where's Waldo?" }
          />
        </GoogleMapReact>
      </div>
    )
  };
};
&#13;
&#13;
&#13;

这种情况一直在发生,我不明白为什么。

你能帮忙吗?

4 个答案:

答案 0 :(得分:1)

首先,建议不要在componentDidMount中使用setState。考虑使用componentWillMount。

其次,您在函数中使用thisthis不再引用该组件。你可能需要做臭名昭着的 - >转换。

componentWillMount(){

const that = this;

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(
    function(position) {
      console.log(position);

      that.setState({
        center: { lat: position.coords.latitude, lng: position.coords.longitude },
      })              
    }
  )
}

}

答案 1 :(得分:0)

function (position) {}更改为ES6箭头函数(position) => {}以在闭包中保留this

componentDidMount(){

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(
    (position) => {
      console.log(position);

      this.setState({
        center: { lat: position.coords.latitude, lng: position.coords.longitude },
      })              
    }
  )
}

答案 2 :(得分:0)

这个composentDidMount应该更好。箭头功能没有&#34;这个&#34;。所以&#34;这个&#34;将引用该组件。

componentDidMount(){

if (navigator.geolocation) {
  navigator.geolocation.getCurrentPosition(
    (position) => {
      console.log(position);

      this.setState({
        center: { lat: position.coords.latitude, lng: position.coords.longitude },
      })              
    }
  )
}
}

答案 3 :(得分:-1)

通常不应该更改componentDidMount()中的状态。

阅读docs了解更多信息