Я вижу несколько потенциальных проблем - производительность функции checkVisibleMarkers
, и использование uuid()
для создания уникальных (и различных) значений key
накаждая повторная передача <Marker />
.
checkVisibleMarkers
Относительно функции checkVisibleMarkers
.Там есть несколько вызовов и шаблонов, которые можно оптимизировать.Вот что сейчас происходит:
- Создание массива ключей маркеров
- Циклическое переключение клавиш, обращение к соответствующему маркеру и фильтрация по местоположению с использованием
L.latLngBounds().contains()
- Прокручивайте отфильтрованные ключи, чтобы создать массив объектов как
{key: marker}
- . Используйте
Object.assign()
, чтобы создать объект из массива объектов
. В конце концов, мы имеемобъект с каждым значением, являющимся маркером.
Я не уверен в внутренностях L.latLngBounds
, но это может быть частично причиной узкого места.Игнорируя это, я сконцентрируюсь на рефакторинге шаблона Object.assign({}, ...Object.keys().filter().map())
с использованием оператора for...in
.
checkVisibleMarkers = () => {
const visibleMarkers = {};
const { markers, mapBoundaries } = this.state;
for (let key in markers) {
const marker = markers[key];
const { latitude, longitude } = marker.coordinates;
const isVisible = mapBoundaries.contains([latitude, longitude]);
if (isVisible) {
visibleMarkers[key] = marker;
}
}
this.setState({ visibleMarkers });
}
Быстрая проверка jsPerf показывает, что описанный выше метод на ~ 50% быстрее, чем метод, который вы используете.используя, но он не содержит вызов L.latLngBounds().contains()
, поэтому это не точное сравнение.
Я также попробовал метод, использующий Object.entries(markers).forEach()
, который был немного медленнее, чем метод for...in
выше.
key
опора <Marker />
В компоненте <Marker />
вы используете uuid()
для генерации уникальных ключей.Несмотря на свою уникальность, каждое повторное генерирование генерирует новый ключ, и каждый раз, когда изменяется ключ компонента, React создает новый экземпляр компонента.Это означает, что каждый <Marker />
воссоздается при каждом повторном запуске.
Решение состоит в том, чтобы использовать уникальный и постоянный ключ для каждого <Marker />
.К счастью, похоже, у вас уже есть значение, которое будет работать для этого, key
из visibleMarkers
.Так что используйте это вместо:
<Marker
key={key}
position={ [latitude, longitude] }
icon={icon}
>
<Tooltip>{visibleMarkers[key].category}</Tooltip>
</Marker>