我有以下代码,可根据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>
)
}
}
答案 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>
)
}