Загружаем изображение…
Мутанты на проводе или Всевидящий MutationObserver
– Когда мир перестаёт быть реактивным, остаётся только наблюдать –
tl;dr
Давненько у нас не было фронтовых баек, а пожалуй что вот оно!
Уютный мир: ламповый laravel, приятные vue-компоненты, встроенные в шаблоны. Всё живёт в безмятежном неведении надвигающейся катастрофы.
Но тут появляется внешний JS-скрипт, который начинает управлять состоянием vue-компонента извне. В частности - открывает попап, а vue-форма внутри должна менять своё поведение.
Должна, но не может!
Классические приемы не работают:
- Пропсы не пробросить - компонент уже смонтирован;
- События не проэмитить - нет родителя;
- Пересоздавать компонент с переносом логики - слишком жирно. Да и внешний скрипт менять нельзя.
Можно было бы отчаяться и уйти из IT на ферму кроликов разводить, но на помощь приходят мутанты-наблюдатели!
Да, MutationObserver - наше спасение. Всевидящее Око Саурона в мире DOM.
Создаём наблюдателя. Теперь он в засаде и зорко наблюдает за всеми изменениями у родителя:
Но что бы наблюдатель был не слишком наблюдателен, ограничим его кругозор через фильтр:
Ну и, конечно, по-джентльменски освобождаем наблюдателя при смерти компонента.
Если состояние меняется вне зоны реактивности компонента - это не приговор.
Мутанты среди нас, и они всегда помогут!
#vue #mutationobserver #javascript #frontend #web #разработка
– Когда мир перестаёт быть реактивным, остаётся только наблюдать –
tl;dr
Иногда не нужно менять архитектуру. Достаточно наблюдать и DOM сам расскажет, что произошло.
Давненько у нас не было фронтовых баек, а пожалуй что вот оно!
Уютный мир: ламповый laravel, приятные vue-компоненты, встроенные в шаблоны. Всё живёт в безмятежном неведении надвигающейся катастрофы.
Но тут появляется внешний JS-скрипт, который начинает управлять состоянием vue-компонента извне. В частности - открывает попап, а vue-форма внутри должна менять своё поведение.
Должна, но не может!
Классические приемы не работают:
- Пропсы не пробросить - компонент уже смонтирован;
- События не проэмитить - нет родителя;
- Пересоздавать компонент с переносом логики - слишком жирно. Да и внешний скрипт менять нельзя.
Можно было бы отчаяться и уйти из IT на ферму кроликов разводить, но на помощь приходят мутанты-наблюдатели!
Да, MutationObserver - наше спасение. Всевидящее Око Саурона в мире DOM.
Создаём наблюдателя. Теперь он в засаде и зорко наблюдает за всеми изменениями у родителя:
const component = el.parentElement as HTMLDivElement | null;
let observer: MutationObserver | null = null;
onMounted(() => {
observer = new MutationObserver(() => {
if (component.classList.contains('popup_active')) {
// наша логика
}
})
observer.observe(component, {
attributes: true,
attributeFilter: ['class'],
});
});
Но что бы наблюдатель был не слишком наблюдателен, ограничим его кругозор через фильтр:
attributeFilter и следим строго за классом.Ну и, конечно, по-джентльменски освобождаем наблюдателя при смерти компонента.
onUnmounted(() => {
observer?.disconnect();
observer = null;
});
Если состояние меняется вне зоны реактивности компонента - это не приговор.
Мутанты среди нас, и они всегда помогут!
#vue #mutationobserver #javascript #frontend #web #разработка
Просмотры: 38