Тёмный

Как мы решили проблемы с z-index + ВИКТОРИНА! 

АйТи Синяк
Подписаться 32 тыс.
Просмотров 11 тыс.
50% 1

Буквально недавно на работе я получил баг с z-index, я его по быстрому пофиксил и получил еще 2 бага. Я как то не придавал этой проблеме значения, и тут мой коллега ревьювил мой очередной пул реквест и пришел ко мне с идеей, как покончить войну с z-index в нашем проекте. И как раз в тот же день, я слушал подкаст веб стандарты и там обсуждали статью по работе с z-index. И решение, которое предлагают в статье, показалось мне крайне нелепым по сравнению с тем, что предложил мне Дима. Поэтому я решил спонтанно записать это видео, возможно это решение кому-то будет полезным. И еще в конце выпуска вас ждет небольшая викторина, поэтому не переключайтесь)
Поддержать Айти Синяка можно здесь:
RU-vid: / @it-sin9k
boosty: boosty.to/sin9k
Patreon: / itsin9k
00:00 Анонс темы
00:45 Как мы мыслили раньше
01:50 Баг сломал прежний подход
02:22 Что такое Портал
02:47 Зачем мы используем Портал
03:02 Компонент Portal
03:40 Компонент Popup
03:56 Компонент Popover
04:16 Смотрим результат
05:30 Викторина!
07:22 Подписывайтесь!
Подписаться на канал: / @it-sin9k
Twitter: / it_sin9k
-------------------------
Данный канал создан для инициирования бесед на различные темы IT сферы (социальные / технические), а также для тех кому короткая видео выжимка статьи, выступления на конференции или же просто личных мыслей, являются более удобным форматом

Опубликовано:

 

1 июн 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 92   
@dmitrymukhin9458
@dmitrymukhin9458 3 года назад
ты придумал новую скороговорку: у портала поповер с попапом:)
@zhmenia
@zhmenia 3 года назад
Ура, наконец-то Ui-Kit!)) Мы как раз решаем такую же проблему с кучей попапов, актуально как никогда) P.S. Удачи с релокейтом!
@it-sin9k
@it-sin9k 3 года назад
Рады быть полезными) спасибо за напутствие)
@it-sin9k
@it-sin9k 2 года назад
В Амстердам)
@vladimirbavtenko9080
@vladimirbavtenko9080 3 месяца назад
Больше таких прекрасных практических решений! Лайкос с большой буквы!
@PoRoKLusT
@PoRoKLusT Год назад
На сколько быстро всё развивается. Сейчас такое решение уже обязан знать даже джун, всего чуть больше года прошло, офигеть)
@-X-Ray-
@-X-Ray- 3 года назад
Очень крутое решение) Удачи с переездом.
@yehorazyrankulov553
@yehorazyrankulov553 3 года назад
Ответ простой: z-index дочернего элемента не может быть меньше родительского) не уверен, но скорее всего он станет таким же как и родителя в таком случае. А в последнем же случае, ситуация такая же, просто у зелёного блока зиндекс будет 0, так как это дефолтное значение
@vitaliiiashchuk1534
@vitaliiiashchuk1534 3 года назад
Только наоборот, z-index дочернего элемента не может быть больше родительского, если у родительского z-index: 1, то дочернему хоть 1000 можно задать толку от этого не будет
@user-vm2db5cq1g
@user-vm2db5cq1g Год назад
Отличное решение! best practik для попапов!
@nazarshvets7501
@nazarshvets7501 3 года назад
Отличное решение! Наконец понял куда можно этот портал заюзать) Спасибо за ролик!
@it-sin9k
@it-sin9k 3 года назад
С порталом тут было сразу 2 примера)) с overflow: hidden и с z-index)
@AbraKadabra000
@AbraKadabra000 3 года назад
Ещё можно внутрь айфрейма его юзать)
@apanchuk
@apanchuk 3 года назад
Спасибо за видео. Отличная идея. 3 из 3 в викторине
@user-ye9rb5no6i
@user-ye9rb5no6i 3 года назад
Хорошее решение, спасибо за видео, и не нужно никаких соглашений какие цифры индекса и по какой системе должны быть у компонентов вне потока. Беспокойство вызывает только анимирование появления/исчезновения попапов, нет ли никаких сайд-эффектов с этой стороны.
@it-sin9k
@it-sin9k 3 года назад
да, мне так же понравилось это решение, что не надо возиться с этими цифрами) а по поводу анимации, там проблемы большой нет, там надо хук написать, который будет сначала закрывать попап, а потом вымаунчивать портал
@apanchuk
@apanchuk 3 года назад
@@it-sin9k "вымаунчивать"). you made my day, возьму на вооружение
@user-tn9fs9vi1l
@user-tn9fs9vi1l 3 года назад
Спасибо. Отличный, логичный способ.
@it-sin9k
@it-sin9k 3 года назад
да) вся его прелесть в простоте подхода)
@nilsen1879
@nilsen1879 2 года назад
Спасибо за видео! У меня возник вопрос. В Каком месте нужно маунтить второй попап? Я делал так: 1. Создал первый попап и добавил, например, в App.js. Внутри этого попапа рендерил второй попап. Но тогда у меня возникла проблема, так как первым добавляется второй попап, а затем первый попап. Как бы это правильно решить?)
@user-nf9kz9ih6v
@user-nf9kz9ih6v 3 года назад
Помнится у нас на проекте была задача, которую решили очень страшным методом. Суть была следующая: мы работали с аутсорс командой, которая поставляла нам компонент с текстом, при наведении на любое слово появлялся тултип с описанием данного слова. Проблема была в том, что api этого компонента не позволяло использовать порталы для этого тултипа и он обрезался (у нас был overflow: hidden в родительском компоненте). Мы уже до релиза не могли договориться. И на первое время был придуман страшный костыль, когда этот компонент оборачивался в hoc, который отслеживал положение тултипа и перерендеривал его в портале на том же месте. То есть сначала тултип рендерился без портала и после определения его позиции сразу же перерендеривался в портале. Ну, признаюсь, тогда все были в шоке от решения. Через месяц мы договорились и интерфейс компонента переделали, чтобы устранить этот костыль.
@it-sin9k
@it-sin9k 3 года назад
настоящая тру стори)) иногда приходится делать страшные решения) главное, что переписали очень быстро)
@almazkaliyev
@almazkaliyev 3 года назад
Очень крутой контент. Кстати, в Material UI порталы так и используются
@it-sin9k
@it-sin9k 3 года назад
ага) я когда UiKit компоненты проекта делаю, очень много смотрю на тот как сделано в material-ui) И порталы использовал по их примеру) а вот на одинаковый z-index 1300 у всех компонентов (Dialog, Popover, Drawer), я как то не обращал внимание, вот коллега и подсказал)
@379sanek
@379sanek 3 года назад
Класный канал, в чем делаешь анимации для ролика?
@it-sin9k
@it-sin9k 3 года назад
спасибо!) делает другой человек) насколько я помню в after effects
@set1k899
@set1k899 3 года назад
@@it-sin9k Все верно, анимации делаю в After Effects
@379sanek
@379sanek 3 года назад
@@set1k899 очень толково выходит, сам когда то в after effects делал шейповые антмации и разные приколы в связке с cinema 4d. Вообщем у вас классная команда и уникальный контент)). Представляю сколько трудов уходит даже на короткий ролик. Дерзайте, желаю побольше подписчиков, крутых проектов и жирных рейтов)
@setik964
@setik964 3 года назад
@@379sanek Спасибо! Будем стараться и улучшать контент👍
@user-qh5ok1ks3o
@user-qh5ok1ks3o 9 месяцев назад
Спасибо за крутое решение
@rnablack2695
@rnablack2695 2 года назад
А еее))я опытный верстальщик😜
@mykhailostepanishchev6472
@mykhailostepanishchev6472 3 года назад
супер,спс !
@user-tm5ow3et4l
@user-tm5ow3et4l 2 года назад
Не лучше ли использовать isolated? Не знаю как в реакт, но во Vue переход с одной модалки на другой url с открытием нового popup - нельзя сделать
@it-sin9k
@it-sin9k 2 года назад
А что под собой подразумевает isolated? В реакте можно запилить изменения попапа при изменении url
@user-dp6yt7yc9l
@user-dp6yt7yc9l Год назад
Проблема у данного решения в том что если вдруг в фоне потребуется показать модалку при этом текущая модалка не должна быть скрыта, т/е я заполняю форму в модалке 1, а по веб сокету приходит событие при котором нужно показать модалку 2, при этом мне бы не хотелось отвлекать пользователя от текущего контента.
@it-sin9k
@it-sin9k Год назад
Добавлять модалку под текущую модалку на будущее, тоже звучит не то чтобы хорошо) обычно прилетевшие модалки все равно летят на перед экрана. Ну и в таком случае есть решение, не обязательно добавлять в DOM дерево последним элементом, можно добавить предпоследним. Либо не отображать новую модалку, пока пользователь не закончит с текущей модалкой
@oleggrishechkin5059
@oleggrishechkin5059 2 года назад
какая то ерунда в Portal написана, createPortal сам по себе вставляет куда надо, в качестве второго аргумента указывайте рут - будет вставляться в конец указанного элемента далее, порядком сыт не будешь, но у нас есть контекст реакта, делаем враппер с провайдингом текущего z-index + 1 - и тк у нас все всплывашки являются сиблингами, то это будет работать как часы - каждый вложенный попап будет иметь z-index на единицу больше родителя.
@underpog5347
@underpog5347 3 года назад
а как можно достучаться до порталов в jest + enzyme тестах, к примеру я хочу протестировать, что у меня после закрытия поп-апа фокус возвращается в нужный элемент?
@it-sin9k
@it-sin9k 3 года назад
Честно говоря, я сходу хорошего решения не выдам. У меня. не такой богатый опыт в юнит тестировании компонентов
@LRXAORLOV
@LRXAORLOV 3 года назад
А как вы управляете логикой, диктующей, какой попам с каким может быть открыт одновременно, а какой закрывает некоторые из открытых? А если попам по верстке должен иметь ширину родителя, через js решаете?
@it-sin9k
@it-sin9k 3 года назад
Достаточно сложно ответить на этот вопрос коротко в комментариях. У меня целая философия по работе с попапами. Я их делю на разные категории и управляю ими по разному. Я начинал делиться какой-то базой в рамках плейлиста react-router-tricks. Думаю еще буду развивать тему попапов в разных плейлистах, как минимум в UiKit еще хотел одно видео про попапы записать
@ilnurryazhapov9377
@ilnurryazhapov9377 3 года назад
приятно смотреть
@it-sin9k
@it-sin9k 3 года назад
рады слышать) у нас уже много чего накопилось посмотреть)
@anatoliipokhylko9467
@anatoliipokhylko9467 3 года назад
Очень понравилась идея с ClickOutside компонентом, до этого всегда использовал хелпер функцию. Вроде все сделал по логике, как в видео, но reference компонента ClickOutside прилетает undefined. ref повесил на вложенный в ClickOutside элемент. По возможности, подскажите в чем проблема.
@it-sin9k
@it-sin9k 3 года назад
На словах достаточно сложно понять, в чем именно у вас проблема. Если вы уделите время и зальете код на codesandbox или github и покажете результат на gh-pages. Я постараюсь вам помочь :)
@anatoliipokhylko9467
@anatoliipokhylko9467 3 года назад
@@it-sin9k Третья попытка отправить комментарий
@anatoliipokhylko9467
@anatoliipokhylko9467 3 года назад
​@@it-sin9k думаю есть какая-то блокировка на добавление ссылок на codesandbox драфт с id laughing-fog-tykin
@it-sin9k
@it-sin9k 3 года назад
ага, мерси. Я посмотрел код, первый комментарий, это то что мы используем ClickOutside только для Popover, а не для Popup. А чтобы заработал код в sandbox, я изменил на а так же вот код самого ClickOutside: paste.ubuntu.com/p/4GnqjZwJcF/
@anatoliipokhylko9467
@anatoliipokhylko9467 3 года назад
@@it-sin9k большое спасибо! Я даже разобрался почему не работало раньше (current тоже переносил), проблема была, что работало 2 ClickOutside одновременно, потому, что Popup открывается с Popover. Отдельное спасибо за пример компонента ClickOutside, понравилась реализация 👍 Удачи в продвижении канала!
@VadimVoreNas
@VadimVoreNas Год назад
Решение интересное, но как оно будет работать, когда этот попап должен будет скролится рядом с компонентной, которая его вызвала? В моем проекте наоборот приходилось переносить с боди к компоненте, дабы отслеживал ее местоположение
@it-sin9k
@it-sin9k Год назад
да, со скролом есть косяк. И кстати впервые я его обнаржил буквально недавно. Обычно мы делали стратегию на скрол скрывать все или в некоторых ситуациях дизейблили скрол. Поэтому даже не знал о такой проблеме :(
@yehorazyrankulov553
@yehorazyrankulov553 3 года назад
А для чего в useState вы передали функцию с созданием дива, а не просто создали его? Вроде же это не трудозатратная операция
@it-sin9k
@it-sin9k 3 года назад
в моей голове выбор стоял следующий. На каждый рендер создавать div или создавать функцию и прокидывать это в useState. Я решил, что функция будет дешевле и пробросил функцию
@betterlucknexttime195
@betterlucknexttime195 3 года назад
@@it-sin9k мне кажется решение с useRef(domNode) было бы понятнее. По поводу "функция будет дешевле" - непонятно в чем заключается "дешевизна"? "На каждый рендер создавать div или создавать функцию и прокидывать это в useState" - причем тут прокидывание функции на каждый рендер - вы же просто лениво создаете див на каждый рендер)
@it-sin9k
@it-sin9k 3 года назад
рассмотрим следующий код: const [element, setElement] = useState(document.createElement('div')); можно его привести к следующему: const div = document.createElement('div'); const [element, setElement] = useState(div); т.е. абсолютно на каждый рендер создается новый div. И я решил не создавать div. С другой стороны в моем коде: const callback = () => document.createElement('div'); const [element, setElement] = useState(callback); В данном примере, мы не создаем div на каждый render, а создаем функцию callback на каждый рендер. В случае useRef, вы точно так же будете создавать div на каждый render, я решил, что это будет более избыточно, хотя цифрами я не могу подтвердить. Просто по внутренним ощущениям решил сделать так
@GagikHarutyunyan_dev
@GagikHarutyunyan_dev 3 года назад
@@it-sin9k мне кажется вопрос был в том, зачем вообще нужен useState? Не дешевле написать просто const container = document.createElement('div') useEffect...... { return ReactDOM.createPortal(children, container) }
@it-sin9k
@it-sin9k 3 года назад
а этот код опасен для продакшена. В данном примере если компонент зарендериться, то предыдущий div с тем же попапом удалится и вставится новый div. DOM будет сильнее перерисовываться. А в случае с useState мы всегда работаем с одним и тем же инстансом div и создаем его лишь один раз
@it-coding
@it-coding 3 года назад
Так же вопрос про useCallback , иногда в flatList в реакт нетив, нужно передать не просто renderItem, а с дополнительными пропсами, в итоге мы передаём через ()=> Это пересоздает компонент на каждый рендер родителя , выход - обернуть в useCallback ! Увидел пример в оптимизации этого листа , вообщем , нам вообще не нужно передавать пропсом функцию анонимную , если дочерний компонент нам дорого ререндерить! Часто бывает соблазн в итерации map , передавать в компонент не функцию определенную , а анонимную и в анонимной вызвать нашу функцию с переданным “item” из итерации
@it-sin9k
@it-sin9k 3 года назад
а как этот вопрос относиться к этому видео?)
@it-coding
@it-coding 3 года назад
@@it-sin9k извиняюсь , что не в тему , просто решил написать , как тему для обсуждения в видио или в комментарии , так как тут обсуждаются обычно такие тонкости )))
@it-sin9k
@it-sin9k 3 года назад
да, без проблем) вообще мысли правильные, мы даже в вебе делали похожий компонент List, в который передавали мемоизированную функцию
@Makaler
@Makaler Год назад
я новичек, поэтому возможно нубский вопрос, а как позиционируется поповер? Разве он находится не внутри родителя и уже относительно него позиционируется? Или все поповеры позиционируется относительно body (относительно окна)? upd: пересмотрел ещё раз, я правильно понимаю что и у попапа и у поповеров одинаковые стили pos fixed, а уже реакт попер навешивает absolute и позиционирует (top, left)
@it-sin9k
@it-sin9k Год назад
Все верно :)
@timzeynalov3537
@timzeynalov3537 2 года назад
red - z-index 3 , blue - z-index-1 , green - z-index-1, что получается ... красный родитель синего так что синий может быть показан в родителе если родитель 3 а child меньше или больше то не важно он будет показан в окружении родителя а зеленый не имеет родителя и так как он меньше по индексу чем красный то поэтому показан первым я думаю такие пироги
@baliinvestments
@baliinvestments 2 года назад
А почему контейнер храните в useState, а не в useRef?
@it-sin9k
@it-sin9k 2 года назад
Потому что в useState можно передать функцию, которая вызовется лишь 1 раз. И не будет создавать какой-то мнимый div на каждый ререндер. По крайней мере такая была идея. Хз насколько она окупается на самом деле
@kr4chinin771
@kr4chinin771 Год назад
Спасибо за хороший разбор! Я попытался реализовать все, что было показано в этом видео и в видео про декомпозицию. У меня успешно получилось, но я столкнулся с проблемой, когда решил немного расширить функционал. Я, как ты упомянул в конце, добавил компонент , который слушает нажатия на Escape и закрывает поп-апы. Однако мне бы хотелось, чтобы при каждом нажатии закрывался лишь последний попап, а не все вместе. Никак не могу придумать логику, как это реализовать, постоянно что-то ломается. Может быть есть какие-то идеи или наработки как это сделать? P.S. Если вдруг интересно - в компонент я оборачиваю содержимое портала, а код, от которого я пытаюсь всячески оттолкнуться, выглядит примерно так: const KeyboardListener: FC = ({onClose, children}) => { useEffect(() => { const closeOnEscapeKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() } document.body.addEventListener('keydown', closeOnEscapeKey) return () => document.body.removeEventListener('keydown', closeOnEscapeKey) }, [onClose]) return ( {children} ) }
@it-sin9k
@it-sin9k Год назад
Эту проблему я решил путем создания стора для событий. Я создал объект в стиле { ESC: [...], ON_ARROW_DOWN: [...], ON_ARROW_UP: [...] } Логика следующая. Когда монтируется компонент KeyDownListener. В конец массива ESC добавляет callback, и при анмаунте удаляю этот callback. Когда срабатывает addEventListener. Я иду в этот стор и беру последний callback и вызываю его. Описываю и понимаю что надо видео делать отдельное))
@kr4chinin771
@kr4chinin771 Год назад
@@it-sin9k Элегантное решение! Я вчера все-таки смог прийти к рабочему варианту, который чуть более императивный. Я создал в index.html отдельный див с id="portals" и все порталы складывал туда один за другим, присваивая каждому уникальный id, который принимал в пропсах: const [container] = useState(() => document.createElement('div')) container.id = id //... const portals = document.getElementById('portals')! portals.appendChild(container) Каждый портал также замыкает в себе функцию onClose(). При регистрации нажатия на Escape прослушивателем я смотрел, какой id у последнего дива в portals и вызывал для него функцию onClose(). Примерно так выглядит логика, только тут еще не вынесен в отдельный компонент для лучшей читабельности: const Portal: FC = ({ children, onClose, id }) => { const [container] = useState(() => document.createElement('div')) container.id = id useEffect(() => { const closeOnEscapeKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { const portals = document.getElementById('portals')! if (portals.children) { if (portals.children[portals.children.length - 1]?.id === id) { onClose() } } } } document.body.addEventListener('keydown', closeOnEscapeKey) const portals = document.getElementById('portals')! portals.appendChild(container) return () => { portals.removeChild(container) document.body.removeEventListener('keydown', closeOnEscapeKey) } }, [container, id, onClose]) return ReactDOM.createPortal(children, container) } Работает замечательно, из минусов - каждому порталу нужно присваивать уникальный id.
@kr4chinin771
@kr4chinin771 Год назад
Отдельный же у меня выглядит так при этом решении: interface KeyboardListenerProps { portals: HTMLElement onClose: () => void id: string children: React.ReactNode } const KeyboardListener: FC = ({ portals, onClose, id, children }) => { useEffect(() => { const closeOnEscapeKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { const portals = document.getElementById('portals')! if ( portals.children && portals.children[portals.children.length - 1]?.id === id ) { onClose() } } } document.body.addEventListener('keydown', closeOnEscapeKey) return () => document.body.removeEventListener('keydown', closeOnEscapeKey) }, [id, portals, onClose]) return {children} } В него я оборачиваю children портала: //... return ReactDOM.createPortal( {children} , container)
@kr4chinin771
@kr4chinin771 Год назад
+ пока не успел в точности разобраться, с чем это связано, но раньше при открытии нескольких поп-апов и клике на оверлей они закрывались сразу все, при имплементации же вышеописанного решения они стали закрываться последовательно, прямо как при нажатии на Escape. Вот такой приятный сайд-эффект.
@it-sin9k
@it-sin9k Год назад
@@kr4chinin771 а если внутри попапа надо будет обработать еще один onEsc? У вас в любом случае закроется попап
@nikto5878
@nikto5878 2 года назад
Годнота
@ilikecola378
@ilikecola378 Год назад
Я ниразу не использовал и даже забыл что есть порталы. Спасибо огромное
@it-sin9k
@it-sin9k Год назад
Сам не использовал, а как научился, то подсел на этот вариант)
@andrewscott788
@andrewscott788 Год назад
А ClickOutside это какая то библиотека или самописный компонент?
@it-sin9k
@it-sin9k Год назад
Я чаще всего пишу сам мелкий компонентик, иногда реализация немного отличается от проекта к проекту :)
@kr4chinin771
@kr4chinin771 Год назад
Я тоже задался этим вопросом и нашел интересную реализацию хука, которая выглядит примерно так: export function useClickOutside(ref: HTMLElement, func: () => void) { useEffect(() => { function handleClickOutside(e: any) { if (ref && !ref.contains(e.target)) { func() } } document.addEventListener('mousedown', handleClickOutside) return () => { document.removeEventListener('mousedown', handleClickOutside) } }, [ref, func]) } Остается только импортировать его в компонент (например, в ) и передать в него референс на сам поп-овер и функцию, которая будет его закрывать. Для тех, кому может быть интересно, моя реализация с поп-овера с новым API библиотеки Popper и этим хуком выглядит примерно так: const Popover: FC = ({ isOpen, onClose, referenceElement, children }) => { const [popperElement, setPopperElement] = useState() const { styles, attributes } = usePopper(referenceElement, popperElement, { placement: 'bottom' }) useClickOutside(popperElement, onClose) if (!isOpen) { return null } return ( {children} ) }
@AbraKadabra000
@AbraKadabra000 3 года назад
Начал смотреть видео и не могу не написать комментарий))) зет индекс сто??? Это очень весело. Кого вы хотели перекрыть этим значением??))) Зет индекс 99?)) В своей работе не использую зет индексы больше трёх.. потому что я знаю о стекующейся природе зетындексов. даже единица в редких случаях используется, когда остальные способы не работают)
@it-sin9k
@it-sin9k 3 года назад
Это мышление развилось в давние времена. Когда ты используешь разного рода либы. Например раньше крайне популярен был bootstrap. И если посмотреть стили их компонента попапа или тултипа, вы увидите, как раз такого рода z-index. Суть подхода в том, чтобы не цифру инкрементировать, а нолик добавлять, если хотите показать уровень выше. Таким образом теоретически bootstrap мог оставить вам задел использовать 101 или 102, для того чтобы поместить кастомные компоненты поверх бустраповского)
@o.korsakov4426
@o.korsakov4426 Год назад
Обратил внимание Popup Materil UI имеет z-index: 1300;
@AbraKadabra000
@AbraKadabra000 Год назад
Мне кажется это повод пойти тв гитхаб и научить этих любителей зет индекса в цссы :-(
@it-coding
@it-coding 3 года назад
Столкнулся с ситуацией , когда в дочерний компонент передавал ref , и параметр snapPints={[300]} И в родительском компоненте я использовал этот реф , и при ререндере родителя , у меня терялась ссылка рефа на тот дочерний компонент , решением было , обернуть массив в useMemo , что бы при ререндере родителя , дочерний компонент не перепривязывал реф , так как видимо такой вид передачи , «просто массив» , создаётся заново и уже другая ссылка на этот массив , ререндерит дочерний и идёт перепривязываение рефа, и я уже этим рефом не мог взаимодействовать с компонентом , который был вызван
@it-sin9k
@it-sin9k 3 года назад
да, пример хороший. В таких случаях без мемоизации никуда
@user-cq3hr5op5q
@user-cq3hr5op5q 3 года назад
Не получилось воспроизвести результаты из викторины, вот результат на github pages : lllep6ajlb.github.io/html-z_index-check/
@it-sin9k
@it-sin9k 3 года назад
Спасибо, что подготовил демку! Круто что не забил) мне кажется основная проблема, в том что наша html структура отличается. У тебя зеленый блок внутри красного, а в моем примере зеленый блок рядом с красным. Думаю, если это поправить, все станет на свои места)
@user-bn2qt4ge9x
@user-bn2qt4ge9x 3 года назад
Чел ты... поповеру дай z-index 10 , а попапу дай 100, так как поповер, который внутри в попапе лежит он по любому будет виден, а поповер который в не попапе соответсвенно не будет перекрывать попап из-за z-index ниже (10) и не надо никакие порталы
@it-sin9k
@it-sin9k 3 года назад
Как я и говорил в видео, порталы мы добавили по другим причинам)
@helplrewerse2925
@helplrewerse2925 Год назад
Это норм что ReactDOM занимает 133к?
@it-sin9k
@it-sin9k Год назад
да, не очень приятно vue - 95 angular/core - 238 Особо альтернативы успешной не видно В gzip по приятнее будет размер. Вместо 133к будет 42кб
Далее
Dependency Inversion || storage package
10:02
Просмотров 15 тыс.
Пробую торты
00:43
Просмотров 216 тыс.