为什么我在 google 地图上看不到任何标记有反应?
Why can't I see any markers on google maps react?
我一直在构建启用了 google 地图 API 的应用程序的前端。我想让用户点击地图添加标记,并将其存储到一个数组中;然而,在我为 google 地图标签的 onClick 实现添加标记功能后......标记不会呈现。
我在react中实现添加标记功能遇到了很多困难,看了好几个教程都没有找到解决办法。任何帮助将不胜感激!
const options = {
styles: mapStyles,
disableDefaultUI: true,
zoomControl: true,
}
var markersArray = [];
function addMarker(event){
let marker = new window.google.maps.Marker({
position: event.latLng,
time: new Date(),
draggable: true
});
markersArray.push(marker);
}
const Map = withScriptjs(withGoogleMap(props =>
<GoogleMap
defaultZoom={8}
defaultCenter={{ lat: this.state.mapPosition.lat, lng: this.state.mapPosition.lng }}
options={options}
onClick={(event) => {
console.log(event);
console.log(markersArray);
addMarker(event);
}}
>
{markersArray.map((marker) =>(
<Marker
key={marker.time.toISOString()}
position={{lat: marker.lat, lng: marker.lng }}
/>
))}
<AutoComplete
style={{width: "100%", height:'40px'}}
types={['(regions)']}
onPlaceSelected={this.onPlaceSelected}
/>
</GoogleMap>
));
我认为问题在于此,但我不确定如何让它工作。
{markersArray.map((marker) =>(
<Marker
key={marker.time.toISOString()}
position={{lat: marker.lat, lng: marker.lng }}
/>
))}
markersArray
是一个普通数组。当您执行 addMarker(event);
时,您并没有更新组件的状态,它只是一个普通数组。所以 React 可能没有意识到这种变化。如果你使用钩子,你可以像这样用你的标记创建一个状态
const [markers, setMarkers] = useState([])
使用 markers
数组渲染 <Marker />
,然后在您的事件中添加标记
onClick={(event) => {
setMarker(previousMarkers => previousMarkers.concat([event]))
}
这将导致 re-render 的新值为 markers
,您应该能够看到它们。
如果它不是一个功能组件并且它是 classes,它是一样的,但是你会在你的 class' state
中定义标记
constructor(props) {
super(props)
this.state = { markers: [] }
this.addMarker = this.addMarker.bind(this)
}
// function class below
addMarker(marker) {
this.setState(previousState => previousState.concat([marker])
}
在你的活动中,你会打电话给 this.addMarker(marker)
我一直在构建启用了 google 地图 API 的应用程序的前端。我想让用户点击地图添加标记,并将其存储到一个数组中;然而,在我为 google 地图标签的 onClick 实现添加标记功能后......标记不会呈现。
我在react中实现添加标记功能遇到了很多困难,看了好几个教程都没有找到解决办法。任何帮助将不胜感激!
const options = {
styles: mapStyles,
disableDefaultUI: true,
zoomControl: true,
}
var markersArray = [];
function addMarker(event){
let marker = new window.google.maps.Marker({
position: event.latLng,
time: new Date(),
draggable: true
});
markersArray.push(marker);
}
const Map = withScriptjs(withGoogleMap(props =>
<GoogleMap
defaultZoom={8}
defaultCenter={{ lat: this.state.mapPosition.lat, lng: this.state.mapPosition.lng }}
options={options}
onClick={(event) => {
console.log(event);
console.log(markersArray);
addMarker(event);
}}
>
{markersArray.map((marker) =>(
<Marker
key={marker.time.toISOString()}
position={{lat: marker.lat, lng: marker.lng }}
/>
))}
<AutoComplete
style={{width: "100%", height:'40px'}}
types={['(regions)']}
onPlaceSelected={this.onPlaceSelected}
/>
</GoogleMap>
));
我认为问题在于此,但我不确定如何让它工作。
{markersArray.map((marker) =>(
<Marker
key={marker.time.toISOString()}
position={{lat: marker.lat, lng: marker.lng }}
/>
))}
markersArray
是一个普通数组。当您执行 addMarker(event);
时,您并没有更新组件的状态,它只是一个普通数组。所以 React 可能没有意识到这种变化。如果你使用钩子,你可以像这样用你的标记创建一个状态
const [markers, setMarkers] = useState([])
使用 markers
数组渲染 <Marker />
,然后在您的事件中添加标记
onClick={(event) => {
setMarker(previousMarkers => previousMarkers.concat([event]))
}
这将导致 re-render 的新值为 markers
,您应该能够看到它们。
如果它不是一个功能组件并且它是 classes,它是一样的,但是你会在你的 class' state
中定义标记constructor(props) {
super(props)
this.state = { markers: [] }
this.addMarker = this.addMarker.bind(this)
}
// function class below
addMarker(marker) {
this.setState(previousState => previousState.concat([marker])
}
在你的活动中,你会打电话给 this.addMarker(marker)