Пишем библиотеку для виртуального скролла с нуля | React

Поделиться
HTML-код
  • Опубликовано: 7 сен 2024

Комментарии • 67

  • @v.demchenko
    @v.demchenko Год назад +5

    Обьяснил топ🤗
    Проблема, пример проблемы и как решать будет.
    Топ.

  • @KycokFt
    @KycokFt Год назад +2

    Так ведь в видео напротив только вертикальная виртуализация ;)
    Клевое видео, спасибо!

  • @stanislavdanilov3253
    @stanislavdanilov3253 Год назад +7

    Очень полезный контент! Спасибо за твою работу

  • @user-vm2db5cq1g
    @user-vm2db5cq1g 11 месяцев назад +1

    Аюб молотчик!!! Слежу за твоими видео, побольше таких практических кейсов как этот!! Супер!

    • @ayub_begimkulov
      @ayub_begimkulov  11 месяцев назад

      Спасибо! В планах есть еще похожие плейлисты. Главное, чтобы просмотры не как тут набирались)))

  • @sergeyfrantsev4449
    @sergeyfrantsev4449 Год назад +1

    Супер круто! Я наконец добрался всё разом посмотреть)

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      Буду рад фидбэку по каждой части)

  • @user-rl7ly3cz6g
    @user-rl7ly3cz6g Год назад +3

    Очень интересно! Буду ждать продолжения!

    • @njkzbby6174
      @njkzbby6174 Год назад +2

      Да, я тоже!

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      Скоро должно выйти, вторую и третью часть уже записал. Думаю в ближайшие дни еще четвертую буду записывать)

  • @user-bg3hu1oz4y
    @user-bg3hu1oz4y Год назад +1

    Супер! Было бы интересно посмотреть подобные "best practies"

  • @TheLazarev88
    @TheLazarev88 11 месяцев назад

    Мега полезно! Было бы интересно еще sticky column и row как реализуются.

  • @xoxo2880808
    @xoxo2880808 Год назад +2

    Коммент подлиннее, для поддержки канала, спасибо, интересно:)

  • @Andrey-lr7wp
    @Andrey-lr7wp 5 месяцев назад

    Привет, спасибо за серию видео по виртуальному скроллу, оказалось очень полезно! У меня такой вопрос - почему для конечного item ты указываешь top: 0, а после делаешь transform: translateY(virtualItem.offsetTop)? Почему сразу не установить top в нужную для этого позицию virtualItem.offsetTop? И что ты сказал на 16:41, что какой то транслейт работает более быстро, какой я не могу расслышать)

  • @user-rm7oz4xu3k
    @user-rm7oz4xu3k Год назад +1

    Очень очень круто, класс)

  • @ss.siberia
    @ss.siberia Год назад +1

    Очень интересно, спасибо)

  • @luckystrike91
    @luckystrike91 Год назад +1

    я пытался тоже писать свою виртуализацию для списков, имея опыт нативной андроид разработки и так и не осилил кейс с рендерингом элементов различной высоты. в анроиде для этого есть либа recyclerview и я пытался сделать что-то подобное. но фишка в том, что в андроиде у всех компонентов есть стадия измерения, лейаута и собственно отрисовки, и можно эти методы переопределить и посчитать/изменить размеры ещё не отрисованого элемента. как с этим быть в html/js я так и не понял, в предвкушении следующего видео!)

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      На самом деле тут что-то похожее получается. В определенных стадиях рендеринга компонента производим нужные действия. Правда работать с этим не так просто и очевидно. Спасибо за фидбэк!

  • @user-mp9hx4tt9x
    @user-mp9hx4tt9x 11 месяцев назад +1

    Привет, классный ролик с отличным контентом! Возник вопрос, по какой причине было решено использовать addEventListener, а не onSroll на контейнер, были ли какие-то конкретные причины, или это больше для удобства? Спасибо!

    • @ayub_begimkulov
      @ayub_begimkulov  11 месяцев назад

      скорее для удобства. мы же внутри хука просто доступ к DOM ноде получаем. Не хотелось, чтобы человек еще сам должен был руками вещать наш onScroll обработчик.

  • @user-vr1bt4bv6s
    @user-vr1bt4bv6s Год назад +1

    Удачи

  • @Victor-il9gm
    @Victor-il9gm Год назад +1

    отличный контент! спасибо!
    объясни, пожалуйста, для чего нужен overscan, с видоса не понял (

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад +1

      Нужно для того, чтобы при быстром скролле ты не видел белый экран. Так как скролл происходит в отдельном треде, который переодический эммитит ивенты в JS.

    • @Victor-il9gm
      @Victor-il9gm Год назад

      @@ayub_begimkulov Спасибо за ответ! Забыл удалить вопрос, ибо стало понятно во втором видосе, где ты проговорил тоже самое, что написал в этом ответе :)

  • @slprime-old
    @slprime-old Год назад +1

    ух... помню как делал подобное на чистом js для ie8 в свое время. наигрался знатно, зато скорость работы была космической

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      IE вообще боль огромная, тем более восьмой. Там получается даже es5 не поддерживался же?

    • @slprime-old
      @slprime-old Год назад

      @@ayub_begimkulov ага

  • @HEX_CAT
    @HEX_CAT Год назад +3

    ❤🎉

  • @alexeyfilippov42
    @alexeyfilippov42 9 месяцев назад

    хм с ходу не придумал где это использовать для чего такая таблица. кажется не видел таких примеров раньше

    • @ayub_begimkulov
      @ayub_begimkulov  9 месяцев назад

      Бывают таблицы, где нужно отображать большое количество данных (500+) без пагинации. В таких случаях полезно бывает.

  • @dankryt
    @dankryt Год назад +1

    По-моему в данном кейсе было бы лучше использовать intersection observer, чем вешать листенер на скролл

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      А можешь пожалуйста раскрыть мысль? Не совсем понимаю, как он тут мог бы помочь? IntersectionObsrver больше же про попадание элемента во viewport, то есть нужно, чтобы DOM элемент уже был какой-то. А в нашем случае у нас вообще не рендериться ничего, кроме видимых элементов + overscan.

  • @baileysli6235
    @baileysli6235 Год назад +1

    20:13 А можешь подсказать как ты настраиваешь TS, что он понимает, что это браузерные таймауты которые отдают число, а не нодовские?

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      У меня просто не стоит @types/node в этом проекте). А так, если можно использовать widnow.setTimeout, для того, чтобы возвращалось число.

    • @baileysli6235
      @baileysli6235 Год назад

      @@ayub_begimkulov обычно так и поступаю, поэтому удивился. Спасибо

  • @rustamakhmetyanov4404
    @rustamakhmetyanov4404 10 месяцев назад

    Как раз что такое хочу сделать в проекте, я делал с intersection observer, с бека приходят товары по 6шт например, в экран влезает 4шт, и когда скрол доходит до предпоследнего загпуженного товара кидается запрос на бек. Но теперь проблема, когда юзер открывает страницу товара и выходит назад, как то надо сохранять, товары которые он просмотрел, либо только кусок прошлого списка, но тогда придётся ещё скрол наверх обрабатывать как то))

    • @Mr.Bellamy
      @Mr.Bellamy 6 месяцев назад

      Дак а в чем проблема? Текущий отображаемый список и позицию скролла хранишь в глобальном стейте и сетаешь их при возврате, вместо дефолтных первых n элементов и топСкролл = 0.
      3 месяца прошло уже, но может кому-то другому пригодится)

    • @rustamakhmetyanov4404
      @rustamakhmetyanov4404 6 месяцев назад

      @@Mr.Bellamy проблема была как потом отслеживать обратный скрол и грузить предыдущие. Сколько грузить позиций типа обычно грузишь по 6, а при возврате надо ли сверху и снизу ещё по 6 грузить или только по скролу))

  • @user-kj6go4ft4j
    @user-kj6go4ft4j Год назад +1

    🎉🎉🎉🎉🎉

  • @user-lv2tm3kh5s
    @user-lv2tm3kh5s 9 месяцев назад +1

    Очень жаль, что данный подход с абсолютным позиционированием не подходит для таблиц. А так решение хорошее

    • @ayub_begimkulov
      @ayub_begimkulov  9 месяцев назад +1

      Ты ведь под таблицами подразумеваешь табличную верстку (table, tr, td, display: table и тд)?
      Просто есть библиотеки, которые и их виртуализировать могут. Из популярных помню react-virtuoso. Можешь в его сторону посмотреть.

    • @user-lv2tm3kh5s
      @user-lv2tm3kh5s 9 месяцев назад

      @@ayub_begimkulov Да, именно про html таблицу. Но хочу применить для проекта на Ангуляре, так как у нас таблицы очень специфические и с большим объемом данных, в память подгружается до 100 mb, очень тяжко приходится браузеру. Спасибо, посмотрю, как в этой библиотеке реализовано

  • @ruslanjafarov
    @ruslanjafarov Год назад

    какой шрифт и фонт-сайз?

    • @ayub_begimkulov
      @ayub_begimkulov  Год назад

      По шрифту -- дефолты из VSCode на маке (Menlo, Monaco, 'Courier New', monospace)
      Касательно фонт сайз -- 14px + один раз на cmd+ нажал, чтобы на телефонах тоже все видно было.

    • @ruslanjafarov
      @ruslanjafarov Год назад

      @@ayub_begimkulov, благодарю

  • @AlexeyProgramming
    @AlexeyProgramming Год назад +6

    Какой «гений» додумался называть виртуальной скролл виртуализацией 💩 Виртуализация обычно относится к созданию виртуальной изолированной системы для исполнения кода абстрагированного от аппаратной реализации. Я уж думал докер напишет или эмулятор, а тут всего лишь виртуальный скролл для которого уже и так десятки библиотек существует 🤭

    • @jgkdmdevienjjgg8866
      @jgkdmdevienjjgg8866 Год назад

      Виртуализированное отображение списков/контента наверное правильнее, но в контексте фронтенда обычно только это и бывает, по этому так сокращают

    • @Artur-pk3sw
      @Artur-pk3sw Год назад +2

      извини бро, это я так назвал

    • @konstantinsamodurov436
      @konstantinsamodurov436 Год назад

      - "Какой «гений» додумался называть виртуальной скролл виртуализацией"
      Вот-вот... Есть же устоявшиеся термины: рендеринг - она же "отрисовка"...
      Автор - в следующий раз будет диз...

    • @jenek051
      @jenek051 Год назад

      Кому надо, всё понял))

    • @alcor9921
      @alcor9921 Год назад

      ​@@konstantinsamodurov436ну заплачь

  • @fedordostoevskiy4209
    @fedordostoevskiy4209 Год назад

    Виктор Карпов делал похожее и называл "Виртуальный лист".) Это для умников про докер. 😂 Кто-то есть его уровня викомментах? 😂

  • @ummyusuf8206
    @ummyusuf8206 Год назад +1

    🎉🎉🎉🎉🎉