Новые возможности React с useDeferredValue

แชร์
ฝัง
  • เผยแพร่เมื่อ 10 ต.ค. 2024

ความคิดเห็น • 56

  • @Ernuna
    @Ernuna วันที่ผ่านมา +37

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

    • @it-sin9k
      @it-sin9k  วันที่ผ่านมา +1

      Хорошо сказано!)

    • @AA-Vezel
      @AA-Vezel 12 ชั่วโมงที่ผ่านมา

      С другой стороны, uDV будет нагружать машину пользователя, тратить киловатты (эффект масштаба) на пустые обсчеты и тем самым увеличивая углеродный след. Как бы нам зелёные звиздюлей не дали за такую оптимизацию 😂

  • @yanik-sher
    @yanik-sher วันที่ผ่านมา +8

    спасибо за выпуск, очень интересно было послушать, как можно использовать useDeferredValue и что твориться под копотом

  • @The14Some1
    @The14Some1 14 ชั่วโมงที่ผ่านมา +5

    Автор, ты так и не сделал одно очень важное замечание:
    Поскольку реакт отбрасывает те рендеры, которые он не успевает, если новые изменения происходят до окончания рендера, то мы увидим следующий рендер только когда поток изменений будет содержать достаточно большую паузу, чтоб ререндер успел успешно завершиться.
    Эта особенность делает данный подход неприемлемым как раз в тех случаях, о которых ты упомянул, а именно на 3:33. Если поток данных будет продолжаться непрерывно, то может возникнуть ситуация, что на рендер не будет хватать времени вообще никогда. И пользователь вообще не будет видеть обновлений.
    Правильным решением было бы делать ререндеры по мере их фактической возможности один за другим и не отменять рендеры при появлении новых изменений. При этом данные под каждый рендер-колл брать на момент получения заявки на этот рендер-колл.
    Как было:
    каждое изменение порождало свой рендер-колл, и блочило движок до окончания ререндера
    Как сейчас:
    каждое изменение порождает новый рендер-колл асинхронно, и если ререндер уже производится, то отменяет устаревший ререндер
    Как нужно:
    каждое изменение инвалидирует состояние, что является триггером для создания нового рендер-колла
    рендер-коллы выполняются в отдельном потоке один за другим, не блоча движок, и нет механизма отмены старого "устаревшего" рендер-колла.

    • @it-sin9k
      @it-sin9k  6 ชั่วโมงที่ผ่านมา

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

  • @АлексейСоколов-у3к
    @АлексейСоколов-у3к 2 ชั่วโมงที่ผ่านมา

    супер ролик! Синяк как всегда на высоте!

  • @eugenetit8072
    @eugenetit8072 13 ชั่วโมงที่ผ่านมา

    Шикарный выпуск!!! Помог аккуратно решить проблему)

  • @igormalykhin5528
    @igormalykhin5528 วันที่ผ่านมา

    Автору искренняя благодарность за ролики. На собесе благодаря Вашему ролику про react key отличился знанием.
    Пожалуйста, продолжайте в том же духе

    • @it-sin9k
      @it-sin9k  23 ชั่วโมงที่ผ่านมา

      хех) очень рад, что видео оказались полезными) не раз слышал, что люди по ним готовятся к собеседовниям) значит все не зря)

  • @АлександрВолков-о8ю
    @АлександрВолков-о8ю 8 ชั่วโมงที่ผ่านมา

    Спасибо, теперь буду знать, что можно не костылить дебаунсом

  • @NeoCoding
    @NeoCoding 11 ชั่วโมงที่ผ่านมา

    спасибо дорогой

  • @archibaldstriebendrossel
    @archibaldstriebendrossel 10 ชั่วโมงที่ผ่านมา

    Отличия от debounce:
    1. Юзер увидит конечную картинку раньше, т.к. useDeferredValue начинает её рендерить сразу, а не после таймаута.
    2. Не будет фризов в инпуте с какой бы скоростью юзер не печатал. С debounce юзер может попадать в просак между срабатыванием таймера и окончанием рендера.
    3. Потенциально больше жрёт процессор.

  • @ИгорьГолуб-н6щ
    @ИгорьГолуб-н6щ วันที่ผ่านมา

    Супер! Спасибо за контент. Полезно!

  • @AlexanderBorshak
    @AlexanderBorshak วันที่ผ่านมา

    Шо, опять?.. )))
    (За видео - лайк! Коммент скорее к разработчикам реакта.)

    • @AlexanderBorshak
      @AlexanderBorshak วันที่ผ่านมา

      И по сути вопроса. В чем наша проблема? Есть какая-то синхронная задача, которая тормозит рендер. Напрашивается логичное решение - сделать ее асинхронной; а если надо - то и обернуть внутри все в дебаунс или тротлинг, и затем уже изнутри асинхронной задачи обновлять стейт реакта, чтобы вызвать ререндер. Но создатели реакта почему-то не топятся показать всем идиоматичными примерами как надо делать в том или ином случае (включая наш), а спешат добавить новый костыль, который - как оказывается из данного видео - еще и ломает поведение уже знакомых API реакта. Браво, еще!..

  • @_GyG_
    @_GyG_ วันที่ผ่านมา

    Спасибо Синяк! Как всегда круто и доступно объяснил!

    • @it-sin9k
      @it-sin9k  วันที่ผ่านมา

      Спасибо за слова поддержки!)

  • @Ramosok
    @Ramosok วันที่ผ่านมา

    ❤как всегда очень круто!

  • @boldureans
    @boldureans วันที่ผ่านมา

    Привет Саш, спасибо за видео!

  • @Kotovar
    @Kotovar วันที่ผ่านมา

    Спасибо, было полезно)

  • @ОлегСелин-ш9ы
    @ОлегСелин-ш9ы วันที่ผ่านมา

    Спасибо, любопытная штука.

  • @johnstark3045
    @johnstark3045 วันที่ผ่านมา

    Отлично 🔥

  • @ГенаФес-ъ9з
    @ГенаФес-ъ9з วันที่ผ่านมา

    благодарю!

  • @BahramJabbarov-m4u
    @BahramJabbarov-m4u วันที่ผ่านมา

    Это очень круто!

  • @EgorMoscowNeverSleep
    @EgorMoscowNeverSleep วันที่ผ่านมา

    useDeferredValue полезен в связке с (будущим) хуком use, для реализации асинхронного состояния. Но, опять же, реализация на сигналах будет лучше.

  • @egorovsa
    @egorovsa 12 ชั่วโมงที่ผ่านมา

    Пасип, некогда даже новые фичи посмотреть, не то что их попробовать и уж тем более сразу пускать в прод. Однако какие бы и сколь сложные интерфейсы я не делал, всегда тем не менее обходился дебаунсером. Но смысл я уловил. Дебаунсер ты хардкодиш тайминги, а тут энжин сам смотрит может ли он схавать поток или нет. Однако...

  • @alexeyshaykov
    @alexeyshaykov วันที่ผ่านมา

    с ума сойти! спасибо

  • @dev_zloi
    @dev_zloi วันที่ผ่านมา +1

    Получается основное преимущество, что зависит от мощности железа, а не от захардкоженной цифровой в setTimeot. Но как же все быть, если летит бесконечный поток данных в сокете?

    • @it-sin9k
      @it-sin9k  23 ชั่วโมงที่ผ่านมา +1

      как и с debounce это будет ждать момента, когда хоть на момент поток данных прервется

  • @popuguytheparrot_
    @popuguytheparrot_ วันที่ผ่านมา

    Точно предыдущий результат "выбрасывается на помойку"? Планировщик реакта как раз имеет механизм переиспользовать предыдущую работу

  • @EgorMoscowNeverSleep
    @EgorMoscowNeverSleep วันที่ผ่านมา

    useDeferredValue хуже чем любая реализация сигналов. Нафиг он нужен, не очень понятно.
    По капотом этот хук использует Promise.reject, чтобы сигнализировать об асинхронном процессе + лишний рендер для каждого изменения. При использовании сигналов, будет только один рендер.
    Update: Написал комментарий не посмотрев видео, думал будет речь про связку useDeferredValue + use, а тут про SlowList.
    Безусловно, для SlowList useDeferredValue полезен.

    • @it-sin9k
      @it-sin9k  วันที่ผ่านมา

      о каких именно сигналах в рамках React идет речь?

    • @Илья-с1л6э
      @Илья-с1л6э วันที่ผ่านมา

      почему при использовании сигналов будет только один рендер? Будет так же рендер на каждое изменение инпута. Но рендер будет более атомарным

    • @EgorMoscowNeverSleep
      @EgorMoscowNeverSleep วันที่ผ่านมา

      @@it-sin9k я для себя сделал собственную реализацию. А так, погуглите. Любая реализация сигналов у которой есть хук useSignal подойдёт.

    • @EgorMoscowNeverSleep
      @EgorMoscowNeverSleep วันที่ผ่านมา

      Update: Написал комментарий не посмотрев видео, думал будет речь про связку useDeferredValue + use, а тут про SlowList.
      Безусловно, для SlowList useDeferredValue полезен.

  • @Chuv111
    @Chuv111 วันที่ผ่านมา +3

    Как то сомнительно выглядит. Все время такие проблемы решались с debounce. А что теперь? Нагружаем процессор бесполезными вычислениями и тратим заряд батареи на устройствах только ради того, что бы чуть более точно подобрать задержку debounce

    • @Lear-fe6se
      @Lear-fe6se วันที่ผ่านมา

      Вообще фича полезная для отображения данных, приходящих с сервера. Если рендер в основном задерживают асинхронные запросы, то там высокой нагрузки не будет.
      Но вот с такими кейсами, как тяжёлые вычисления на фронте, она действительно может привести к лишней трате заряда

    • @it-sin9k
      @it-sin9k  วันที่ผ่านมา +1

      если вы хотите использовать debounce это же не проблема) выбирайте инструмент, который вам нравится :)

    • @Chuv111
      @Chuv111 วันที่ผ่านมา

      @@Lear-fe6se А что принципиально поменяется если с сервера будут данные приходить, а не из инпута? С сервером по идее вообще проблем не должно быть, вряд ли вы будете присылать обновления с сервера с настолько высокой частотой, что интерфейс не будет успевать рендериться.

    • @Lear-fe6se
      @Lear-fe6se วันที่ผ่านมา

      @@Chuv111 нет, я другую ситуацию представляю:
      Данные получаем из инпута, но рендер у нас медленный не потому, что нужно отрисовать таблицу с миллионом строк, а потому что нужно отправить запрос на сервер и дождаться ответа.
      В таком случае useDefferedValue не нагрузит клиентское устройство, но отзывчивость повысится в сравнении с debounce. Да, нагрузка на сервер может увеличиться. Но это не так критично, как для клиента. Плюс отправленные запросы можно отменять

    • @Chuv111
      @Chuv111 วันที่ผ่านมา

      @@it-sin9k Я пытаюсь понять в каких случаях useDeferredValue будет лучшим выбором. Так то фича выглядит интересно, но пример в видео выбран не очень удачно. Единственный плюс, который мне приходит в голову, это то что не надо свой хук для debounce писать и придумывать значение задержки. Про минусы я уже написал

  • @МаксимСинькевич-в2я
    @МаксимСинькевич-в2я วันที่ผ่านมา +2

    1ый😎

    • @tagnati5585
      @tagnati5585 วันที่ผ่านมา +2

      Мля, я второй

  • @kaifaty
    @kaifaty วันที่ผ่านมา +4

    По итогу весь maintread забит реактовскими бесполезными вычислениями с 0 результатом. Ммм, вкуснятина

    • @corvus278
      @corvus278 วันที่ผ่านมา

      Так они и до этого были бесполезными, только из ещё больше было

    • @Chuv111
      @Chuv111 วันที่ผ่านมา

      @@corvus278 До этого юзали debounce с фиксированой задержкой, и никаких лишних вычислений не было

    • @kaifaty
      @kaifaty วันที่ผ่านมา

      @@corvus278 там в промежутке хоть что-то выводилось в процессе ввода

    • @it-sin9k
      @it-sin9k  วันที่ผ่านมา

      использование debounce никто не отменял :)