Я создал компонент vue на основе MapBox, который ограничен в инициализации до того, как он будет стоить денег, и это совершенно нормально. Но я хочу уменьшить количество повторных инициализаций моего компонента карты ради них и себя. Вот почему я подумал, можно ли один раз определить компонент, передать некоторые свойства, а затем обрабатывать состояние через vuex.
Прямо сейчас мне пришлось бы импортировать свой компонент и добавить данные следующим образом:
<Map
:sources = "geoData.sources"
:layers = "geoData.layers"
:mapOptions = "mapOptions"
:componentOptions = "{ drawingEnabled: toggleMapDrawing, activeLayers: activeMapLayers, activeMarkerGroups: [] }"
@loaded = "onMapLoaded" @selectedMarkers = "onSelectedObjects"/>
За componentOptions
наблюдают, поэтому компонент соответствующим образом меняет свое состояние.
Мои идеи/подходы до сих пор были следующими:
Инициализация карты происходит в смонтированном хуке компонента и выглядит так:
const baseOptions = {
accessToken: process.env.MAPBOX_TOKEN,
container: 'map',
style: process.env.MAPBOX_STYLE_URL,
minZoom: 10,
maxZoom: 20,
zoom: 13,
bearing: 150,
pitch: 50
}
this.map = new mapboxgl.Map(Object.assign(baseOptions, this.mapOptions))
if (!this.map) { throw new Error('Could not create map. Make sure the token is valid.') }
Я могу ошибаться, может быть, есть лучший способ, или, может быть, вся эта идея может быть мусором, но, надеюсь, это не так. Также обратите внимание, что я не использую модуль vue-mapbox, потому что он больше не поддерживается.
Буду благодарен за любые идеи и подсказки :)
@Fanoflix Я хочу изменить переданную опору после первой инициализации. Как я уже сказал, переданный реквизит componentOptions
отслеживается внутри компонента для обработки состояния...
Вы могу используете <KeepAlive>, встроенный компонент, доступный как в Vue2 (документы), так и в Vue3 (документы).
По сути, это гарантирует, что компонент с тегом keep-alive будет mounted
только один раз. Таким образом, в вашем случае вы можете разместить карту где угодно, и карта будет инициализирована только один раз в своем mounted
хуке.
Если вам нужно использовать момент, когда ваша карта, так сказать, «сфокусирована» или «активирована», вы можете использовать хуки activated
и deactivated
.
Есть очевидное и логичное ограничение. Пока родитель активен и смонтирован, дочерние компоненты компонента, которые поддерживаются активными, останутся активными. Но если родитель компонента поддержки активности размонтируется, то все файлы дети также будут демонтированы, даже если их оставили в живых. Это все очень очевидно, но мне просто захотелось указать на это.
Итак, в вашем случае использования вы хотите, чтобы компонент (компонент <Map>
) был глобально сохранен после его первой инициализации. Я предлагаю вам кэшировать сам элемент карты и хранить его в хранилище. Затем на каждом хуке компонента <Map>
onBeforeMount
(Composition API) или beforeMount
(Options API) вручную проверьте, кэширован ли элемент, если да, то вставьте кэшированную карту из хранилища, в противном случае инициализируйте карту.
Да, это звучит как правильный подход. Я могу реализовать компонент как синглтон. Это не звучит как слишком хакерский способ, я обязательно попробую, спасибо!
Если я правильно понимаю это после быстрого чтения; вы хотите, чтобы компонент карты загружался один раз и оставался статичным до конца жизненного цикла вашего приложения? Вы не будете менять переданные реквизиты после его первой инициализации?