React:Google Places API /地方详情

时间:2017-07-24 15:02:02

标签: reactjs components google-places-api setstate

我有以下代码,可根据Google Places API检索Google地方信息评论。我已将逻辑合并为React生命周期组件。目前,我无法setState并正确绑定对象。我可以帮助理解我的逻辑失败的地方。

export default class Reviews extends React.Component{
constructor(props){
    super(props);
    this.state = {
      places: []
    }
  }


componentDidMount(){


let map = new google.maps.Map(document.getElementById("map"), {
    center: {lat:40.7575285, lng: -73.9884469}
  });

  let service = new google.maps.places.PlacesService(map);

service.getDetails({
    placeId: 'ChIJAUKRDWz2wokRxngAavG2TD8'
  }, function(place, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
      console.log(place.reviews);
      // Intended behavior is to set this.setState({places.place.reviews})
    }
  })
}
render(){
const { places } = this.state;
return(
  <div>
    <p>
      {
        places.map((place) => {
          return <p>{place.author_name}{place.rating}{place.text}</p>
        })
      }
    </p>
  </div>
  )
 }
}

2 个答案:

答案 0 :(得分:1)

您无法在回调中使用this。当调用该函数时,this in,this.setState({places.place.reviews})并不指向您的对象。一种解决方案是使用=>函数表示法,它将在词汇上绑定this

service.getDetails({
    placeId: 'ChIJAUKRDWz2wokRxngAavG2TD8'
}, (place, status) => {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
      console.log(place.reviews);
      this.setState({places: place.reviews})
    }
  })
}

或者,您可以在函数中对this和我们进行新的引用。像

这样的东西
var that = this
...
that({places.place.reviews})

第一个选项更好,但需要一个可以使用ES6的环境。由于您使用let,您可能还可以。

答案 1 :(得分:1)

通过一些调整 - 我得到了代码!谢谢。

render(){
const { places } = this.state;
return(
  <div>
    <p>
      {
        places.map((place) => {
          if(place.rating >= 4){
            return <p key={place.author_name}>{place.author_name}{place.rating}{place.text}</p>
          }
        })
      }
    </p>
  </div>
 )
}