为什么我的react组件没有更新状态更新?

dee*_*eek 9 javascript reactjs

我有一个我构建的地图应用程序,需要一些地图图标在按下按钮后显示/消失,但我无法弄清楚当我从它的父项组件传入一个新的体育属性时如何设置它来重新渲染组件:

父加载组件:

<SimpleMap sports=[default value and future values go here] />
Run Code Online (Sandbox Code Playgroud)

简单的地图组件(简化):

constructor(props) {
  (props);
  this.state = {
    events: [{venue: {lat: 2, lon: 1}}],
    sports: ["baseball", "football",  "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"]
  };
};

componentWillReceiveProps (nextProps) {
  this.setState({events: [{venue: {lat: 2, lon: 1}}],
                  sports: nextProps.sports});
  console.log(nextProps.sports);
}

static defaultProps = {
  center: {lat: 36.160338, lng: -86.778780},
  zoom: 12,
  sports: ["baseball", "football",  "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"],
};

makeMapEvents (insertProps) {
  fetch("./json/meetup.json").then((response) => {
    return response.json()
  }).then((response) => {
    /* eventually returns new events object based on insertProps */
    this.setState({events: response});
  }
};

componentDidMount () {
  this.makeMapEvents(this.state.sports);
  console.log("mounted", this.state.sports);
}
Run Code Online (Sandbox Code Playgroud)

最终到这里来映射来自州的事件:

<GoogleMap>
  {this.state.events.map((result) => {
     return (<Marker key={counter++} lat={result.venue.lat} lng={result.venue.lon} 
                sport={this.props.sport} data={result}/>);
  })}
</GoogleMap>
Run Code Online (Sandbox Code Playgroud)

Dav*_* Xu 6

this默认情况下,React ES6类不会自动绑定到非反应基本成员方法。因此,this函数中的上下文makeMapEvents未正确绑定。有两种方法可以解决此问题:

通过ES7属性初始化程序:

makeMapEvents = (insertProps) => {
  fetch("./json/meetup.json").then((response) => {
    return response.json()
  }).then((response) => {
    /* eventually returns new events object based on insertProps */
    this.setState({events: response});
  })
};
Run Code Online (Sandbox Code Playgroud)

通过绑定构造函数:

constructor(props) {
  (props);
  this.state = {
    events: [{venue: {lat: 2, lon: 1}}],
    sports: ["baseball", "football",  "paddle", "soccer", "boxing", "dart", "biking", "golf", "hockey", "inline-skating", "tennis", "volleyball", "skateboard", "kickball", "bowling", "pool", "ride", "hike", "ice-skating"]
  };

  this.makeMapEvents = this.makeMapEvents.bind(this) // << important line


}
Run Code Online (Sandbox Code Playgroud)