У меня просто возникают проблемы с отображением моих карт Google, когда происходит поиск (с почтовым индексом). Похоже, что карта отображает нулевой центр карты, а затем не выполняет повторную визуализацию после setState в componentDidMount (), поскольку карта отображается пустой / серой, но при жестком обновлении карта загрузится с почтовым индексом. Я безуспешно пробовал использовать componentWillMount (), у кого-нибудь есть предложения?
Это код моей страницы поиска:
class SearchContainer extends Component {
constructor(props) {
super(props);
this.state = {
map_centre: null
};
}
componentDidMount() {
const values = queryString.parse(this.props.location.search);
axios
.get("api/v1/search?postcode = " + values.postcode)
.then(response => {
var mapCentre = response.data.map_centre;
this.setState({
map_centre: mapCentre
});
})
.catch(error => console.info(error));
}
render() {
return (
<div id = "map" className = "padding-left">
<GoogleMapComponent
townCenters = {this.state.townCenters}
schools = {this.state.schools}
supermarkets = {this.state.supermarkets}
hotels = {this.state.hotels}
airports = {this.state.airports}
trainStations = {this.state.trainStations}
map_centre = {this.state.map_centre}
onMapMounted = {this.handleMapMounted}
onDragEnd = {this.handleMapChange}
onZoomChanged = {this.handleMapChange}
onMarkerClick = {this.handleAdspaceShow}
googleMapURL = {url}
loadingElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
containerElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
mapElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
/>
<img
src = {mapSearch}
id = "map-search-button"
onClick = {this.toggleSearchInput}
/>
<input
id = "map-search-input"
className = "form-control d-none"
type = "search"
placeholder = "Enter new location"
aria-label = "Search"
onChange = {this.handlePostcodeChange}
onKeyPress = {this.handleNewSearch}
/>
</div>
);
}
}
Это код моего компонента Google Maps:
const GoogleMapComponent = withScriptjs(
withGoogleMap(props => (
<GoogleMap
defaultZoom = {13}
defaultCenter = {props.map_centre}
onDragEnd = {props.onDragEnd}
onZoomChanged = {props.onZoomChanged}
ref = {props.onMapMounted}
/>
))
);
@Tholle, не могли бы вы объяснить, что имеете в виду?
Я сам не использовал эту библиотеку, но глядя на документацию компонент GoogleMap, похоже, не имеет опоры map_centre, а опоры center.
Я думаю, что это немного другое, так как я не жестко программирую defaultCenter. Я получаю defaultCenter в моей функции componentDidMount
Да, но вы передаете карте значение, полученное из запроса axios, как map_centre. Карта не знает, что делать с map_centre, только center.
Но map_centre - это просто имя состояния, и вы можете видеть, что оно отслеживается до фактического компонента GoogleMap в defaultCenter, с которым карта действительно что-то делает?
Да, вы правы, но defaultCenter - это только начальный центр. После первоначального рендеринга он больше не будет использоваться картой. Если вместо этого вы используете center на GoogleMap, он, скорее всего, обновится должным образом.
А я так понял, думал будет после каждого рендера. Большое спасибо!
Большой! Пожалуйста.
Подумайте о принимая мой ответ, если вы считаете, что он ответил на ваш вопрос.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


defaultCenter будет использоваться картой только для первоначального рендеринга, поэтому он не будет иметь никакого эффекта, если вы измените это значение позже.
Если вместо этого вы используете опору center, она будет работать должным образом.
const GoogleMapComponent = withScriptjs(
withGoogleMap(props => (
<GoogleMap
defaultZoom = {13}
center = {props.map_centre}
onDragEnd = {props.onDragEnd}
onZoomChanged = {props.onZoomChanged}
ref = {props.onMapMounted}
/>
))
);
Будьте более конкретными с библиотекой, которую вы используете ... вы добавили теги "google-maps-react" и "response-google-map", и оба являются разными библиотеками ...
google-maps-react = https://github.com/fullstackreact/google-maps-react
реагировать-google-map = https://tomchentw.github.io/react-google-maps/
Во всяком случае, я вижу 2 варианта:
решение 1:
Добавьте условие, которое отображает GoogleMapComponent, только если map_centre не равно нулю.
render() {
if (this.state.map_centre){
return (
<div id = "map" className = "padding-left">
<GoogleMapComponent
townCenters = {this.state.townCenters}
schools = {this.state.schools}
supermarkets = {this.state.supermarkets}
hotels = {this.state.hotels}
airports = {this.state.airports}
trainStations = {this.state.trainStations}
map_centre = {this.state.map_centre}
onMapMounted = {this.handleMapMounted}
onDragEnd = {this.handleMapChange}
onZoomChanged = {this.handleMapChange}
onMarkerClick = {this.handleAdspaceShow}
googleMapURL = {url}
loadingElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
containerElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
mapElement = {<div style = {{ height: `100vh`, width: `100%` }} />}
/>
<img
src = {mapSearch}
id = "map-search-button"
onClick = {this.toggleSearchInput}
/>
<input
id = "map-search-input"
className = "form-control d-none"
type = "search"
placeholder = "Enter new location"
aria-label = "Search"
onChange = {this.handlePostcodeChange}
onKeyPress = {this.handleNewSearch}
/>
</div>);
}
return <div> Loading.. </div>;
}
решение 2:
Перед получением ответа установите широту / долготу по умолчанию (не ноль).
constructor(props) {
super(props);
this.state = {
map_centre: { lat: -34.397, lng: 150.644 }
};
}
Вы пробовали использовать опору
centerвместоmap_centreв компонентеGoogleMapComponent?