Основные принципы
Модульный подход
Эта библиотека активно использует систему модулей API Яндекс.Карт, чтобы свести к минимуму объем загружаемого и исполняемого кода из Яндекс.Карт. У этой системы есть свои плюсы и минусы, а также есть способ полностью отказаться от нее.
По умолчанию эта библиотека загружает только те модули, которые фактически
отображаются на странице. Если <Placemark />
или <ObjectManager />
не
смонтирован на странице, соответствующий не будет загружен.
Это означает, что объем кода, который ваши клиенты будут загружать и выполнять, будет минимальным. С другой стороны, это означает, что вместо того, чтобы получать множество привычных API-модулей Яндекс.Карт по умолчанию, теперь вам нужно серьезно подумать о том, что вы используете на странице.
В приведенном ниже примере мы монтируем карту с меткой на странице:
Вы можете заметить, что здесь отсутствуют все элементы управления картой,
которые обычно предоставляются на карте по умолчанию. Это происходит потому, что
они не входят в состав «основного» модуля Яндекс.Карт, не входят в состав модуля
Map
или Placemark
.
Загрузка модулей с modules
проп
Давайте исправим это, указав, какие именно элементы управления нам нужны на
карте state
, а затем воспользуемся modules
пропом для загрузки нужных нам
элементов:
Отлично! Теперь у нас есть элементы управления на карте, а также мы избежали загрузки полного пакета API Яндекс.Карт.
Все компоненты в этой библиотеке поддерживаю modules
prop, что позволит вам
загружать дополнительные модули, когда они понадобятся.
Давайте добавим еще один к приведенному выше примеру. На этот раз мы добавим
балун к метке. Модуль всплывающей подсказки не загружается с базовым минимальным
пакетом API Яндекс.Карт, поэтому, чтобы действительно увидеть баллон, нам нужно
указать надстройку балуна как модуль в компоненте Placemark
.
Загрузка модулей с YMaps Provider query
проп
Ручное указание необходимых модулей — не единственный способ их загрузки. Вы
также можете воспользоваться load
опцией при указании query
компонента
Provider.
Эта опция является частью запроса API Яндекс.Карт и может использоваться для определения того, какие модули вы хотите сразу загрузить с помощью API Яндекс.Карт.
Давайте посмотрим, как можно изменить предыдущий пример, чтобы использовать эту опцию:
Обратите внимание, как мы удалили все modules
пропы из всех компонент и
заменили их на список модулей в query.load
.
Значение по умолчанию API Яндекс.Карт для этой опции — package.full
. При
установке query.load
в 'package.full'
этой библиотеки будет установлен
режим, полностью соответствующий стандартному поведению API Яндекс.Карт.
Вы можете прочитать подробнее про Yandex.Maps API on-demand module system и API loading parameters в документации на Яндекс.Карты.
Контролируемы и Неконтролируемые компоненты
Важный шаблон React, о котором следует помнить при использовании этой библиотеки, — это контролируемые и неуправляемые компоненты. Этот шаблон полностью посвящен тому, кто отвечает за обработку обновлений и сохранение состояния компонентов.
Применительно к этой библиотеке это означает, что в зависимости от того, какие пропсы вы используете, либо API Яндекс.Карт, либо ваше приложение будет отвечать за то, чтобы быть источником правды для ваших объектов карты.
В приведенном ниже примере состояние карты (точнее, масштаб и координаты)
управляется приложением в первом компоненте карты, но не контролируется
приложением во втором компоненте карты. При нажатии кнопки масштаб и координаты
первой карты будут обновлены, а вторая карта сохранит свое состояние. Это
происходит потому, что вместо state
prop мы используем defaultState
prop.
import React from 'react';
export default function App() {
const [zoom, setZoom] = React.useState(9);
const mapState = React.useMemo(
() => ({ center: [55.75, 37.57], zoom }),
[zoom]
);
return (
<YMaps>
<>
<table>
<tbody>
<tr>
<th>Controlled Map</th>
<th>Uncontrolled Map</th>
</tr>
<tr>
<td>
<Map state={mapState} />
</td>
<td>
<Map defaultState={mapState} />
</td>
</tr>
</tbody>
</table>
<p>
<button onClick={() => setZoom((zoom) => (zoom === 9 ? 12 : 9))}>
Toggle map zoom
</button>
</p>
</>
</YMaps>
);
}
Каждая поддержка каждого объекта карты — это библиотека, поддерживающая
default
версию (например: state
и defaultState
, options
и
defaultOptions
, properties
и defaultProperties
, geometry
и
defaultGeometry
). Выбирая использование default
версии, вы отказываетесь от
обновления объектов карты этой библиотекой при изменении реквизита.
Как упоминалось в разделе «Что поддерживается», невозможно запретить Яндекс.Картам полностью обновлять состояние объектов карты, поэтому очень легко выйти из синхронизации, если вы используете эти компоненты контролируемым образом и не синхронизируете состояние обратно в состояние вашего приложения.
Исходя из личного опыта, вы хотели бы использовать default
проп для
большинства случаев в вашем приложении.
Если вы хотите узнать больше об управляемых и неуправляемых компонентах, вот несколько полезных ссылок из документации React:
Provider и Consumer компоненты
Эта библиотека использует React Context API для предоставления API Яндекс.Карт каждому компоненту, который в этом нуждается.
Так как библиотека использует React Context API, поэтому родительские объекты Яндекс.Карт (например, Map, Clusterer, ObjectManager) могут предоставлять дочерним объектам Яндекс.Карт родительский экземпляр.
Если вы хотите узнать больше о компонентах React Context и Provider/Consumer, вы можете ознакомиться с разделом документации React по этой теме.
Убедитесь, что вы использовали компонент провайдера YMaps
и все объекты
Яндекс.Карт находятся внутри этого дерева компонентов. Эта библиотека выдаст
ошибку, если отсутствует контекст Яндекс.Карт.