Я бы не использовал setTimeout в этом сценарии.
Я бы просто не рендерил карту, пока у меня не будут все ожидаемые данные для карты. Я бы добавил это выше к моему заявлению о возвращении.
if (!props.bandLocation.length || !props.bandLocation[0] || !props.bandLocation[1]) {
return <MyCustomLoadingComp />
}
И в вашем конкретном случае c я не уверен, какой именно объект карты или структуры данных необходим, но вы можете понять концепцию. Например, если props.bandLocation [0] является пустым объектом, он все равно будет помечен как true, поэтому вы должны изменить оператор if, чтобы он соответствовал полученным данным.
Обновление: вы хотите использовать что-то вроде вспомогательной функции 'usePrevious'. Подобно componentWillReceiveProps, вам нужно что-то обновлять в вашем пользовательском интерфейсе только тогда, когда вы получаете определенный элемент. Таким образом, в этом случае вы можете проверить, получили ли вы правильный lat / long, а затем установить его с помощью useState. Мне нужно было повторить этот метод жизненного цикла с крючками, и я адаптировался из этого https://usehooks.com/usePrevious/. Тем не менее, по-прежнему рекомендуется просто использовать реквизит напрямую. Вы можете передать имя вашего реквизита в useEffect, и когда оно изменится, комп будет визуализироваться.
То есть
const [loaded, setLoaded] = useState(lat);
useEffect(() => {
setLoaded(false);
if (isAValidLocation(props.lat)) {
setLoaded(true);
}
}, [props.lat, props.long]);
Однако, чтобы быть тупым, вы не должны просто делать это. до тех пор, пока в ней не появятся все соответствующие данные, вам не нужно использовать какие-либо ловушки жизненного цикла, если вы не манипулируете содержимым реквизита каким-либо образом.