React:Google 地点 API/ 地点详情

React: Google Places API/ Places Details

我有以下代码可以根据 Google 个地点 API 检索 Google 个地点评论。我已经合并了作为 React 生命周期组件工作的逻辑。目前,我无法设置状态并正确绑定对象。我可以使用一些帮助来理解我的逻辑在哪里失败。

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>
  )
 }
}

您不能在回调中以这种方式使用 this。当函数在this中被调用时,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 你可能没问题。

经过一些调整 -- 我得到了可以工作的代码!谢谢。

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>
 )
}