Динамическая пагинация на React JS. Подгрузка при скролле страницы React JS

Поделиться
HTML-код
  • Опубликовано: 2 окт 2024
  • В этом уроке мы сделаем динамическую пагинацию, другими словами подгрузку данных при скролле страницы на React js.
    Мой курс "Продвинутый Frontend. В production на React" - ulbitv.ru/fron...
    Поддержать меня и мой канал вы можете по ссылкам ниже.
    Qiwi кошелек - www.qiwi.com/n...
    Яндекс деньги - yoomoney.ru/to...

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

  • @BorderInVais
    @BorderInVais 3 года назад +42

    Откровенно говоря, я на этом канале встречаю то, что действительно интересно увидеть и посмотреть. Канал просто пушка. Удачи и благополучия:)

  • @shiryaev585
    @shiryaev585 3 года назад +5

    В самом конце у автора опечатка: в проверке scrollHandler должно быть photos.length === totalCount, а не photos.length < totalCount
    PS Отличный урок, огромное спасибо

  • @dieu-merci
    @dieu-merci 2 года назад

    Большое спасибо за такой контент, быстро, кратко и по делу. Надеюсь у вас в жизни все будет хорошо

  • @КарэнАкопьян
    @КарэнАкопьян Год назад

    Спасибо за урок! Уже несколько раз применяю данный метод в рабочем проекте

  • @ГеоргийПарсегов-и3п

    Как всегда - лучший!

  • @motivation_upp
    @motivation_upp 3 года назад +16

    Если после добавления общего количества страниц контент при скролле не загружается, то во втором useEffect вторым аргументом нужно передать не пустой массив, а totalCount:
    useEffect(() => {
    document.addEventListener('scroll', scrollHandler);
    return () => {
    document.removeEventListener('scroll', scrollHandler)
    }
    }, [totalCount])

    • @yaroslav8609
      @yaroslav8609 2 года назад

      спасибо!

    • @skily4866
      @skily4866 2 года назад

      Спасибо, у меня новые данные не приходили в scrollHandler, а теперь работает

    • @skily4866
      @skily4866 2 года назад +3

      и там надо не только totalCount но и те объекты что мы получаем, чтобы сравнение работало для конца скролла

    • @pervertedhero7438
      @pervertedhero7438 2 года назад

      Спасибо тебе ! Выручил

    • @ВладБоровков
      @ВладБоровков 2 года назад

      всем лойсы, комменты в жилу!

  • @nelson6783
    @nelson6783 3 года назад +1

    отличный материал!!!

  • @profidev_js
    @profidev_js 2 года назад +7

    Ох парень, ты как всегда. Ролик на 10 минут, но все четко. По делу, и с комментариями. Приятно следить!

  • @vana__f7570
    @vana__f7570 2 года назад

    большое спасибо ulbi tv

  • @Affrit
    @Affrit 2 года назад +1

    Спасибо бро

  • @Eguar42
    @Eguar42 3 года назад +6

    добрый вечер, подскажите, а почему у меня переменные photos и totalCount внутри функции scrollHandler равны пустому массиву и нулю?! уже 3 раза пересмотрел

    • @UlbiTV
      @UlbiTV  3 года назад

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

    • @HaDaGaRa
      @HaDaGaRa 3 года назад +6

      useEffect для слушателя скролла должен так же срабатывать при fetching == true
      useEffect(() => {
      document.addEventListener('scroll', scrollHandler)
      return function () {
      document.removeEventListener('scroll', scrollHandler)
      }
      }, [fetching])
      Иначе стейты для хэндлеров менятся не будут.

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

      Потому, что скролХендлер замыкается с теми данными, что попали при инициализации и они там остаются навечно навсегда 😅

  • @Asgyr
    @Asgyr 2 года назад +4

    есть ссылка на гит данного урока ?

  • @Влэйпи
    @Влэйпи 3 года назад +2

    А что делать, если у меня в запросе на сервер помимо currentPage есть и другие запросы, например sort , который тоже меняется? И + запрос хранится в reducer(redux-thunk)

  • @ЕвгенийМакарук-ж8в
    @ЕвгенийМакарук-ж8в 3 года назад +1

    лайк
    за пагинацию

  • @vasyl_ua356
    @vasyl_ua356 2 года назад +5

    Привет! Очень полезноє видео как и контент канала! Спасибо что уделяєш время интересным и обучающим видео!

  • @sergeylunyaka4315
    @sergeylunyaka4315 2 года назад +1

    как избавится от скачущего экрана.. перерисовывает копоненту... вместо скролла использовал обсервер

  • @alekseyr8372
    @alekseyr8372 8 месяцев назад +1

    IntersectionObserver кагбы существует. Он удобнее

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

    Привет. Делал также как в твоём видео, при скролле у меня почему-то загружает 3-5 страниц и после останавливается, хотя через раз работает нормально и может прогрузить все страницы. Поигрался с зависимостями в useEffect в котором добавляется обработчик скролла, добавлял туда totalCount и fetching по отдельности и вместе, но не помогло. Не знаешь в чём может быть дело? Заранее спасибо за крутые обучающие ролики!

  • @pavelsh6531
    @pavelsh6531 3 года назад +5

    Спасибо за урок динамической пагинации на React!

  • @itpro952
    @itpro952 3 года назад +5

    Спасибо за видео. Насколько знаю у такой пагинации есть траблы с СЕО оптимизацией, особенно у яндекса, поэтому в каких то интернет магазинах лучше делать классическую постраничную пагинацию, ну это так, на случай если кому то понадобится

    • @UlbiTV
      @UlbiTV  3 года назад

      Возможно) Честно говоря с СЕО не особо знаком

    • @TheProfessionalGambler
      @TheProfessionalGambler 3 года назад

      У любом спа траблы с сео. Потому что по факту у тебя страница с одним div#root и скриптами. Это решается ssr и другими вариантами.

  • @bigenough2122
    @bigenough2122 3 года назад +2

    Привет! Крутые видео, спасибо. Ты будто чувствуешь что нужно)
    Хотел узнать, работал ли со styled-component?

    • @UlbiTV
      @UlbiTV  3 года назад

      Привет, спасибо большое) со styled component не работал, не приходилось)

    • @bigenough2122
      @bigenough2122 3 года назад +1

      @@UlbiTV понял. Было бы интересно узнать твоё мнение, как будет свободное время)
      Несколько раз на пед проектах пытаюсь подключить, но что-то не заходит, хотя идея интересная. Стили прям в компоненте. Но появляется проблема, когда много стилей, компонента превращается в портянку, этого конечно можно избежать создавая отдельные js файлы со стилями, но тогда смысл теряется.

    • @bigenough2122
      @bigenough2122 3 года назад +1

      Лол, сам ответил на свою просьбу

    • @UlbiTV
      @UlbiTV  3 года назад

      @@bigenough2122 ахах, ну да, сам и ответил, компоненты максимально уменьшать надо, выносить из них логику/состояние и уж тем более стили, особенно если проект большой, иначе это трудно поддерживать) Но в небольших можно хоть инлайн стили писать, тут уже дело удобства

    • @bigenough2122
      @bigenough2122 3 года назад +1

      @@UlbiTV а кст, контейнерные компоненты в приложении считается хорошим тоном?

  • @Алексей-т2х8й
    @Алексей-т2х8й 3 года назад +3

    +

  • @aximas778
    @aximas778 2 года назад +1

    Если же у вас не срабатывает document.addEventListener('scroll', handleScroll) то добавьте третим аргументом true и всё сработает document.addEventListener('scroll', handleScroll, true)

  • @TheProfessionalGambler
    @TheProfessionalGambler 3 года назад +7

    Классная инфа!
    Почему выбрал реакт, а не вью? Недавно на вью начал проект, переходиться легко и назад не сильно хочется 😄

    • @UlbiTV
      @UlbiTV  3 года назад +1

      С реакта начинал, а так я и с вью тоже работаю) Одно и тоже по сути, в разной оболочке)

    • @TheProfessionalGambler
      @TheProfessionalGambler 3 года назад +2

      @@UlbiTV в принципе да, на вью за день два основы понял) Просто вижу что уроки только по реакту, думаю может больше нравится)

    • @bigenough2122
      @bigenough2122 3 года назад +2

      @@TheProfessionalGambler вью проще? что в нем нрав, и почему решил перейти?)

    • @UlbiTV
      @UlbiTV  3 года назад +3

      @@TheProfessionalGambler реакт роднее как то 😁

    • @TheProfessionalGambler
      @TheProfessionalGambler 3 года назад +5

      @@bigenough2122 мне показался проще, на я уже знал реакт. Может с 0 тоже казался сложным) Появилась работа на вью вот и изучил. Вью как более молодой взял лучшее от реакта и ангуляра. Например v-model, отделение 'модели' и разметки, автобиндинг this. Один из главных плюсов, это что вью фреймворк и централизовагный стейт с роутом очень легко встраивается + все это можно посмотреть в одном расширении хрома. Можно сказать, что реакт + мобх похож на вью.

  • @disposables72
    @disposables72 3 года назад +4

    Неплохо. Лёгкий ненапряжный урок.

    • @UlbiTV
      @UlbiTV  3 года назад

      Благодарю, стараюсь для вас)

  • @yarikpetrenko
    @yarikpetrenko 2 года назад +2

    Интересует как подобное реализовать на Next JS. Я так понимаю данный метод не подойдет ибо рендеринг будет только на стороне клиента. А решений без перехода на другую страницу я так и не нашел.

  • @ВладикГеранин
    @ВладикГеранин 3 года назад +3

    Допустим я подгрузил несколько пользователей 20 штук , хочу удалить первых 2 , они удалятся из базы данных но не в реальном времени удалятся только после перезагрузки страницы , я не могу понять как это можно сделать

  • @tohirasadov689
    @tohirasadov689 2 года назад +1

    Best all the best

  • @АртемКулинский-ю4о
    @АртемКулинский-ю4о 2 года назад +1

    Бля, чел, я работаю и пользуюсь твоими видосами. Просто кайф, что можно не ебать себе мозги по поводу таких штук и сосредоточиться на других, еще не решенных задачах. Красава)) Лайк

  • @ipa_stor
    @ipa_stor 3 года назад +3

    Как всегда отлично преподнес информацию, спасибо, полезная штука. И тут появился вопрос - я сейчас балуюсь со switch кейсом, а именно собрал несколько вариантов для показа страницы (в зависимости от значения view меняется контент, идея в том, чтобы обернуть контент в приятную анимацию и фактически убрать переходы по страницам) и соответственно вопрос, разумно ли было бы использовать динамическую пагинацию и хранить данные на том же mongodb, а погружать при смене значения view? Это исключительно теоретический вопрос, поскольку, понятное дело запросы и ответы будут требовать времени и могут ловить лишние ошибки. Просто интересно, где еще, кроме погрузки фактического контента можно использовать этот инструмент... Мне пришло в голову только возможность догружать темы, скажем, если взять тот же проект с mern-cloud-disc, то добавлять персональные темы, а настройки хранить под ключом юзера. Сорри за большой текст:)

    • @ipa_stor
      @ipa_stor 3 года назад +1

      Значение view храню в state*

    • @UlbiTV
      @UlbiTV  3 года назад +1

      Большой текст это всегда круто, значит человеку действительно интересно) пиши столько, сколько считаешь нужным, всегда постараюсь ответить) Ну вообще, конкретно вот такая пагинация нужна только лишь для подгрузки поэтапной каких то данных, другой кейс даже придумать не могу)

  • @vladyslavfx3892
    @vladyslavfx3892 3 года назад +2

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

  • @ivanbag9741
    @ivanbag9741 3 года назад +2

    Спасибо!!!👍

  • @azaanadkins4820
    @azaanadkins4820 3 года назад +1

    Видос топчик, продолжай снимать! Если решить попасть в тренды ютуба, юзай Вибум, а с промокодом ST1234581 будет неплохая скидка

    • @UlbiTV
      @UlbiTV  3 года назад

      Спасибо)

  • @Vlad-us9xt
    @Vlad-us9xt 3 года назад +1

    top

  • @konstantinzhirnov3013
    @konstantinzhirnov3013 3 года назад +2

    Спасибо. Отличное видео про динамическую пагинацию. React рулит.

    • @UlbiTV
      @UlbiTV  3 года назад +1

      Спасибо, Константин!

  • @artempavlenko5147
    @artempavlenko5147 3 года назад +2

    Курто, полезно !
    Благодарен.
    #reactjs

    • @UlbiTV
      @UlbiTV  3 года назад +1

      Благодарю вас!)

  • @МаксимИванов-ф8р
    @МаксимИванов-ф8р 3 года назад +3

    Спасибо за видео. Тимур а сможете показать как реализовать SideBar с навигацией, с выпадающими списками, с активным роутом и т.д. , например как у ютуб)

    • @ipa_stor
      @ipa_stor 3 года назад +1

      Сразу оговорюсь, что я новичок, а потому сомневаюсь в своем ответе, да и не уверен, о том ли спрашивали, но в курсе про клауд диск на канале есть очень понятные объяснения как делать навигацию с роутами(при помощи react-router-dom), кстати, он же позволяет упростить создание и работу с попап(если нужен выпадающий поверх сайдбар), но если нужен сдвиг контента, то я бы описал 2 класса в CSS и использовал state, как триггер(в том же курсе, видео про loader очень понятно объясняет)... Но дождемся ответа спецов:))))

    • @UlbiTV
      @UlbiTV  3 года назад +1

      И вам спасибо за комментарий, Максим) есть видео про бургер меню, там та же навигация по сути) Но вообще что то связанное с грамотной навигацией я сниму наверное чуть позже)

    • @UlbiTV
      @UlbiTV  3 года назад +1

      @@ipa_stor да ты все правильно сказал)) спасибо!)

    • @ipa_stor
      @ipa_stor 3 года назад +1

      @@UlbiTV все видео с канала:))) помогают

    • @UlbiTV
      @UlbiTV  3 года назад +3

      @@ipa_stor Очень приятно это слышать, постараюсь сделать еще как можно больше полезных видео) Скоро будет полный курс по MobX

  • @thegulpofenglish4131
    @thegulpofenglish4131 3 года назад +1

    Как всегда спасибо) единственное хотел задать вопрос: что нужно делать чтоб typescript не ругался на unexpected arrow functions ( функция onLoad по дефолту в твоем видео) ?

  • @andteslenko
    @andteslenko 3 года назад +2

    Зашел поставил лайк, спс за инфу

    • @UlbiTV
      @UlbiTV  3 года назад

      Спасибо друг, ценю!)

  • @saidmalikallayarov4104
    @saidmalikallayarov4104 3 года назад +1

    Очень помог

  • @ОлегП-т2и
    @ОлегП-т2и 3 года назад +4

    Привет, все круто, все обалденно, но пожалуйста кидай код, бывает не когда переписывать.

  • @alexbaboy7292
    @alexbaboy7292 3 года назад

    Почему так быстро все? приходится замедлять в 2 раза!

  • @ekhuuuu
    @ekhuuuu 3 года назад +2

    В коде присутствует ошибка, чтобы получить общее количество элементов надо писать:
    response.headers.get(‘x-total-count’)

    • @HaDaGaRa
      @HaDaGaRa 3 года назад

      response.headers.get is not a function
      А код из видео вполне работает.

    • @АлександрШтоколов-б7д
      @АлександрШтоколов-б7д 3 года назад

      @Егор Леро , благодарю за информацию, пол часа искал причину почему нет доступа к значению данного заголовка, либо что-то поменялось в получении заголовков с момента выпуска видео до текущего, но вариант с видео, не работает, выдает undefined, так как заголовки обернуты в symbol и просто так к ним уже не получить доступ, а вот через get(‘x-total-count’), все отлично получает, но с другой стороны @HaDaGaRa утверждает, что все на оборот, как бы там ни было вариант от Егора у меня работает, а как на видео нет, к справке, я использовал данную пагинацию на redux, redux-saga, next.js, а автор использует простой react и хуки, хотя скорее всего это дело в axios возможно он как-то преобразует доступ к заголовкам и не только, в общем те у кого не работает, пробуйте оба варианта.

  • @meristenuskeev6985
    @meristenuskeev6985 3 месяца назад

    Супер

  • @petrvictorovich
    @petrvictorovich 2 года назад

    Бомболейло! Теперь такое прикручу куда угодно!

  • @artemholba3074
    @artemholba3074 3 года назад

    Спасибо огромное за крутой контент. Есть вопросик. У меня при скролле функция Handler отрабатывает 2 раза и подгружается сразу по 2 новые страницы. Почему так может быть?
    UPD: оказывается, что такое происходит только c открытым окном devtools в chrome)) А вот почему??

  • @МариямАппаева-ы1я
    @МариямАппаева-ы1я 3 года назад +2

    Интересная информация 👍

    • @UlbiTV
      @UlbiTV  3 года назад

      Благодарю!)

  • @andrewreidn8062
    @andrewreidn8062 3 года назад +1

    А куда пропала обычная пагинация?

    • @UlbiTV
      @UlbiTV  3 года назад +1

      Не совсем понял вопрос?

  • @alexandrelagin5490
    @alexandrelagin5490 3 года назад +1

    Просто шикарно, не большой ролик, тема хорошо раскрыта, всё чётко и понятно и нет воды. Популярна тема среди зарубежных ютуберов - разработка клона какого-то приложения, подумайте над этим вариантом. Кого можете посоветовать из англоязычных авторов ? из ютуба или юдеми. Даже не могу представить, сколько времени у вас уходит на создание видео в таком режиме, очень часто они выходят, лишь бы вы не выгорели, не забывайте отдыхать!

    • @UlbiTV
      @UlbiTV  3 года назад

      Спасибо друг!) Я сам давно уже не смотрю ролики, как то времени не хватает, только по конкретным темам, поэтому наврядли кого то посоветую) Отдыхать успеваю, хотя хотелось бы побольше!) Спасибо вам!

  • @Nikitosss91
    @Nikitosss91 3 года назад

    Дай бог тебе здоровьечка на все органы!

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

    Спасибо всё классно изложено, но у меня не useState, ни import не работают....

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

    функция scrollHandler - не работает как задумывалось. В ней значение page на момент создания и следовательно при прокрутке контента не меняется .

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

    У тебя в конце не правильно, scrollHandler не видит стейт переменные -
    The scrollHandler function in the code you provided is not directly accessing the state variables because it is a separate function and does not have direct access to the component's state.

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

    Чувак, спасибо конечно за видео, но где код? Или ты предлагаешь пользователям стать стеногрфистками и записывать на слух?

  • @romanmed9035
    @romanmed9035 2 года назад

    возникает резонный вопрос, почему в реакте мы не используем родное onScroll? зачем обращаться к глобальной переменной, да еще и навешивать события?

  • @СергейНикитин-п4о1э

    Еще вопрос, на сколько правильно в реакт приложении использовать document?

  • @anaxronik
    @anaxronik 3 года назад +1

    Отлично. А как насчет скрытия / удаления уже просмтренной информации?

    • @UlbiTV
      @UlbiTV  3 года назад

      Спасибо, а зачем?

    • @Acyee
      @Acyee 2 года назад

      @@UlbiTV Например для оптимизации

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

    А у меня скролл плашка остается на месте, т.е отрисовываются новые табы, и прокрутка как была < 100 так и остается. В чем может быть проблема?

  • @СергейНикитин-п4о1э
    @СергейНикитин-п4о1э 2 года назад

    Улби напиши плиз, зачем использовать замут с юзЭффектом если можно просто повесить на див онСкрол?

  • @feodoraxis
    @feodoraxis 8 месяцев назад

    Спасибо за полезное видео. Очень помогли

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

    Интересная тема. Только в моем случае это будет не высота всей страницы, а отдельного блока. Ну, концепцию нужно будет поменять немного, а так всё тоже самое.
    А если вот наперед забегать, что используется в реальности для пагинации при скролле в реальных проектах?

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

    Есть проблема при такой же пагинации при скролле вверх)

  • @rert5575
    @rert5575 2 года назад

    its cool

  • @BigBigLeo
    @BigBigLeo 3 года назад +1

    Спасибо, отличный материал.

    • @UlbiTV
      @UlbiTV  3 года назад

      Благодарю!

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

    Супер-полезный канал, спасибо большое!!!

  • @роматарасов-о8л
    @роматарасов-о8л 3 года назад +1

    Гигант не только мысли, но и дела

    • @UlbiTV
      @UlbiTV  3 года назад

      Ну прям гигант)) спасибо!)

  • @annes1610
    @annes1610 3 года назад

    лайк, ролик топ! решал проблему и тут прям все есть. автору респект!

  • @sergeysamius1128
    @sergeysamius1128 3 года назад

    Спасибо за видео

  • @garry007gorets7
    @garry007gorets7 2 года назад

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

  • @happydamage2614
    @happydamage2614 2 года назад

    Спасибо, как всегда материал огонь

  • @MySven1980
    @MySven1980 3 года назад +4

    Хорошо, но вместо скролла лучше использовать developer.mozilla.org/ru/docs/Web/API/Intersection_Observer_API

    • @UlbiTV
      @UlbiTV  3 года назад +2

      Не знал об этом, действительно, то что нужно, спасибо за инфу)

  • @vladislav_pikiner
    @vladislav_pikiner 2 года назад

    в поддержку топового канала

  • @mixfix86
    @mixfix86 3 года назад

    очень годно! очень!

  • @MK-td2dt
    @MK-td2dt 2 года назад

    Спасибо помог !

  • @DenInside
    @DenInside 2 года назад

    Бро, ты супер. Спасибо тебе большое.

  • @РоманБыков-э6м
    @РоманБыков-э6м 2 года назад

    Как всегда полезно, сжато, но ёмко!

  • @Infinity-zf8ms
    @Infinity-zf8ms Год назад

    Спасибо за видео)

  • @pixelwinner
    @pixelwinner 2 года назад

    Лучшее видео в своем роде.

  • @alexalex-zh4ep
    @alexalex-zh4ep Год назад

    спасибо.

  • @lydiehenckes6051
    @lydiehenckes6051 2 года назад

    Спасибо!

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

    Я так думаю, что допустим ты долистал до 10 страницы, зачем у пользователя показывать предыдущие, если их можно убрать. А если назад отскроллился, то запрос за ними сделать. Как я понимаю, это все в оперативке находится, и ее может так не хватить

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

      Для этого есть виртуальные списки

  • @КириллСмирнов-ь5ъ
    @КириллСмирнов-ь5ъ 2 года назад

    Есть еще такая штука как -- IntersectionObserver Насколько целесообразно использовать её?

    • @suppick9990
      @suppick9990 2 года назад +1

      Лучше использовать её, автор на момент создания ролика не знал о ней

  • @barmaley9705
    @barmaley9705 2 года назад

    Так хлопцы идея конечно хорошая но есть нюансы, этот код не совсем рабочий, длинна загруженных постов не будет изеняться в коллбеке потому что она будет браться из замыкания, соответственно проверка на загрузку всех постов не сработает никогда. Если добавить массив загруженных постов в массив зависимостей ЮЗЕффекта то начинаются баги в виде сбоя порядка и очередности загрузки страниц. Я думаю что намного проще и целесообразнее делать динамическую пагинацию с использованием IntersectionObserver API.
    P.S. Если я не прав то поправьте пожалуйста

    • @lidijajezova2025
      @lidijajezova2025 2 года назад +1

      В его фундаментальном курсе по реакт он как раз использует IntersectionObserver

  • @Story-J
    @Story-J 2 года назад

    Сейчас такое лучше реализовывать через обзервэбл апи

  • @atlasua2021
    @atlasua2021 3 года назад

    Еба, обычно я вас всех на скорости х2.5 смотрю и мне медленно, но без звука кажется всё таким быстрым.
    А по поводу видео, спасибо за видео.

  • @littlegrownbeats
    @littlegrownbeats 2 года назад

    Великолепное видео, попробовал, просто и круто, благодарность автору!)