В приведенном выше фрагменте я вижу, что каждый раз, когда componentDidMount снова создает новый тег сценария, чтобы избежать этого, вы можете изменить методы loadScript следующим образом:
const loadScript = (url) => {
const googleScript = window.document.getElementByClassName('google-script');
if (googleScript.length === 0) {
const script = window.document.createElement('script');
script.src=url;
script.class="google-script"
document.body.appendChild(script)
}
}
Если вы хотите удалитьGoogle скрипт, вы можете справиться с этим внутри componentWillUnmount.
Использование этого не покажет вам исключение для многократного использования тега script.
Также, если вы хотите знать, что тег script загруженили нет, вы можете найти его, добавив другой метод, похожий на метод loadScript, следующим образом:
const loadScript = (url) => {
const googleScript = window.document.getElementByClassName('google-script');
if (googleScript.length === 0) {
const script = window.document.createElement('script');
script.src=url;
script.class="google-script"
document.body.appendChild(script)
script.onload = () => {
// Place code here to do further action.
};
}
}
<---------------------------- Обновление --------------------------->
Чтобы устранить ошибку "Google is undefined", выможете попробовать следовать подходу, в котором вы создаете обещание для API Карт Google, и разрешить это обещание в (глобальной) функции обратного вызова, которую может запустить API Карт Google.В коде компонента вы должны дождаться разрешения обещания, прежде чем продолжить.
const loadScript = () => {
if (!this.googleMapsPromise) {
this.googleMapsPromise = new Promise((resolve) => {
// Add a global handler for when the API finishes loading
window.resolveGoogleMapsPromise = () => {
// Resolve the promise
resolve(google);
// Tidy up
delete window.resolveGoogleMapsPromise;
};
// Load the Google Maps API
const script = document.createElement("script");
const API = //your api key;
script.src = `https://maps.googleapis.com/maps/api/js?key=${API}&callback=resolveGoogleMapsPromise`;
script.async = true;
document.body.appendChild(script);
});
}
// Return a promise for the Google Maps API
return this.googleMapsPromise;
}
componentWillMount() {
// Start Google Maps API loading since we know we'll soon need it
this.loadScript();
}
componentDidMount() {
// Once the Google Maps API has finished loading, initialize the map
this.getGoogleMaps().then((google) => {
const uluru = { lat: -25.366, lng: 131.044 };
const map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: uluru
});
const marker = new google.maps.Marker({
position: uluru,
map: map
});
});
}
render() {
return (
<div>
<div id="map" style={{width: 600, height: 300}}></div>
</div>
)
}