Обновление центра Google Map React с использованием результатов UseState в NaN

У меня есть компонент Map в моем проекте React, который получает информацию о текущем отеле и должен получить и представить местоположение отеля на карте Google Map React.

Это код моего компонента MapView.jsx:

import React, { useState, useEffect } from 'react';
import GoogleMapReact from 'google-map-react';
import MapMarker from "../../../public/svg/MapMarker.svg";

const AnyReactComponent = ({ text }) => (
    <div className='map-marker'>
        <div className='chat-box'>
            <p>{text}</p>
            <div className = "chat-arrow"></div>
        </div>
        <img src = {MapMarker} alt = "Map Marker" />
    </div>
);

export function MapView({ stay }) {
    const [defaultProps, setDefaultProps] = useState({
        center: { lat: 32.5, lng: 34.9 },
        zoom: 15
    });

    const handleApiLoaded = (map, maps) => {
        // use map and maps objects
    };

    useEffect(() => {
        if (stay && stay.loc && stay.loc.lat && stay.loc.lng) {
            setDefaultProps({
                center: { lat: stay.loc.lat, lng: stay.loc.lng },
                zoom: 15
            });
        }
    }, [stay]);

    return (
        <div className = "map-container">
            <h2>Where you'll be</h2>
            <p>{stay.loc.address}</p>
            <div style = {{ height: '400px', width: '100%' }}>
                <GoogleMapReact
                    bootstrapURLKeys = {{ key: "AIzaSyDMl5nCzylGqvy3ogV2cL1CIxCl7X1b0vQ" }}
                    center = {defaultProps.center}
                    defaultZoom = {defaultProps.zoom}
                    yesIWantToUseGoogleMapApiInternals
                    onGoogleApiLoaded = {({ map, maps }) => handleApiLoaded(map, maps)}
                >
                    <AnyReactComponent
                        lat = {defaultProps.center.lat}
                        lng = {defaultProps.center.lng}
                        text = "Exact location provided after booking."
                    />
                </GoogleMapReact>
            </div>

            <a href = "#" className = "show-more">Show more</a>
        </div>
    );
}

При загрузке проживания я хочу, чтобы местоположение изменилось на местоположение отеля, но код приводит к тому, что карта не отображается, и возникает эта ошибка:

Почему отображается эта ошибка? регистрация местоположения пребывания перед использованием setDefaultProps ясно показывает, что они определены, поэтому я не понимаю, почему существует NaN.

Есть ли функция ChangeCenter или updateCenter, которой мне не хватает? Я застрял на этом несколько дней и не могу найти ответ в документации...

ОБНОВЛЯТЬ: это данные о проживании.

Тип Stay.loc.lat и lng — это номер.

Можете ли вы поделиться значениями объекта stay?

Onur Doğan 09.06.2024 12:13

Конечно, обновил его в вопросе :)

KarinP 09.06.2024 12:20

Похоже, проблема возникает, когда значение lat выходит за пределы допустимого диапазона. Его значение должно быть между [-90, 90], как показано в документации: Developers.google.com/maps/documentation/javascript/referenc‌​e/…. При попытке установить значение больше 90 или меньше -90 выдается эта ошибка. Итак, вы можете добавить туда оператор if, чтобы проверить, находится ли значение в диапазоне или нет.

Onur Doğan 09.06.2024 12:47

Как описано здесь: Developers.google.com/maps/documentation/javascript/referenc‌​e/…, вы можете автоматически установить значение 90 или -90, если оно выходит за пределы диапазона.

Onur Doğan 09.06.2024 12:56

@OnurDoğan УДИВИТЕЛЬНО! Они дали его для использования в демо-данных, поэтому я подумал, что значения там действительны... большое спасибо, теперь все работает :)))))

KarinP 09.06.2024 13:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Благодаря подсказке @Onur Doğan я изменил значения широт на менее 90 или больше -90, и это устранило проблему :)

Ответ принят как подходящий

Проблема связана со значением lat, поскольку оно выходит за пределы допустимого диапазона. Значение lat должно находиться в диапазоне [-90, 90], как показано в Документации Google Map. Поэтому при попытке установить значение, выходящее за пределы диапазона([-90,90]), выдается эта ошибка.

Чтобы устранить эту проблему, проверьте, выходит ли значение lat за пределы диапазона, и если оно выходит за пределы диапазона, автоматически установите для него максимальное (90) или минимальное (-90) значение, как показано в документации

Надеюсь, понятно и полезно

Другие вопросы по теме