Комментарии 6
А зачем передавать карту вот так наружу? Полагаю, правильнее было бы инкапсулировать всю работу с картой внутри того компонента, где она создается. Ведь карта - это кусок слоя представления. А если какие-то штуки в карте поменялись, например, видимый прямоугольник (и этот прямоугольник нужен для загрузки каких-нибудь поинтов), то сообщать в модель/стор об этом из компонента. И наоборот, отслеживать компонентом какие-то изменения в сторе, что-то меняя в карте.
Доступ к карте отовсюду может привести к анархии в коде.
Именно поэтому я изначально рассмотрел "классические" методы о которых Вы говорите.
В разных ситуациях удобнее использовать различные подходы.
Вы можете использовать любой метод который считаете правильным в вашем конкретном случае.
Имхо в приведенном примере компонент может оказаться слишком загруженным, так как вся синхронизация происходит через компонент. Вынос всей этой дополнительной логики за рамки компонента сделает код чище.
Можно будет убедиться в этом в моей следующей статье - Управление состоянием React приложения с mapbox-gl с использованием XState
где будут показаны преимущества данного подхода.
Вовсе не обязательно делать всю логику работы с картой в самом компоненте, гораздо лучше будет, например, по onCreated создать экземпляр класса, в котором реализуется эта логика, а так же делается подписка на какое-нибудь состояние и т.д., и разместить его в ref (который useRef). Тут важно вот что: в общем случае компонент вполне может размаунтиться, и в этот момент надо будет прибить экземпляр, потому что карта - всё, и дальнейшая работа с ней не нужна. Таким образом, с одной стороны, не засоряется код компонента, с другой - карта не уехала наружу, и время жизни всего, что с ней связано, контролируется компонентом.
Ваш пример, опять же, не решает проблему приведенную в статье - удобный доступ к инстансу карты из других компонентов.
Удаление экземпляра происходит и в моем случае, независимо от того где она, внутри, снаружи.
Описанный Вами подход имеет место быть, но это не значит что он единственно верный.
Это вы только что заново изобрели то о чем я написал в статье, поздравляю
"А зачем передавать карту вот так наружу?"
А зачем - описано в статье.
"Полагаю, правильнее было бы"
В каком месте то что вы предлагаете претендует на правильность? Какие у вас критерии правильности и в чем они заключаются?
"Ведь карта - это кусок слоя представления"
Как насчет куска слоя рендерига? И использования SRP что подразумевает разделение рендеринга и бизнес логики?
"Доступ к карте отовсюду может привести к анархии в коде."
Если вы не умеете грамотно использовать SRP то не удивительно что в вашем коде возникает анархия
Хранение инстанса карты mapbox-gl вне React