Зачем на самом деле нужен хук useCallback

Поділитися
Вставка
  • Опубліковано 20 жов 2024

КОМЕНТАРІ • 106

  • @anonlog
    @anonlog Рік тому +33

    Михаил, спасибо вам за разъяснение useCallback, его лепят везде где нужно и не нужно и никто не понимает особо, зачем он нужен)) Теперь за 8 минут вашего видео все стало на свои места!! От вас контент просто бесценный!!))☺👍 Лайк однозначно!))

  • @olegsh2888
    @olegsh2888 Рік тому +17

    Михаил, это огонь! У меня коллеги тоже любят обернуть банальное сравнение 2х переменных в мемоизацию, не парясь, что мемоизация сильно дороже элементарного сравнения 2х примитивов) нужен баланс между «я вообще ничего не знаю про мемоизацию» и «я мемоизирую каждый чих»

  • @НиколайМиров-т3т

    До этого видео я не мог понять для чего useCallback и как ей воообще пользоваться. Видео супер полезное. Частно тут нахожу что-то для себя, спасибо! (Самоучка)

  • @tanyaDreamer
    @tanyaDreamer Рік тому +4

    Михаил, это были очень познавательные 8 минут)) Спасибо, наконец-то всё по полочкам с useCallback. На проектах все, в том числе я, его использовали неправильно.

  • @АндрейСорокин-ь6ъ

    "один мой коллега засунул целый реакт-компонент в useCallback" - ааааа!!! господи, я думал только у нас такая дичь в проекте) как же я устал бороться с этими мамкиными оптимизаторами) спасибо, теперь кроме видоса айти синяка, буду кидать еще ваш )

    • @sharkman6434
      @sharkman6434 Рік тому +6

      У ayub begimkulov тоже есть объяснение и оно несколько глубже даже чем тут )

    • @powt73sas
      @powt73sas Рік тому +1

      Жёстко.

    • @DubinArtur
      @DubinArtur 11 місяців тому +1

      Вы, случайно, не вместе работаете?)

  • @vladislav_pikiner
    @vladislav_pikiner Рік тому +4

    спасибо за сложные темы простым языком)

  • @mr_Fr0xman
    @mr_Fr0xman Рік тому +2

    Михаил, спасибо большое! Смотрел твой бытрый курс по React Router, и тут после третьего видео UA-cam "подсунул" мне это видео. Думал не смотреть, ведь "-да что я ещё могу узнать про useCallback?", оказалось, что ключевую вещь😅. Спасибо! Теперь буду тщательно думать перед решением мемоизации сущностей🤝

  • @IvanZakharanka
    @IvanZakharanka Рік тому +1

    Как всегда отлично! Спасибо! А еще я прям офигел насколько хороша новая дока React 😯

  • @yaroslavzef7267
    @yaroslavzef7267 7 місяців тому +1

    Спасибо за пример про связку memo + useCallback. Такого даже чат GPT не подсказал)

  • @sphinxik
    @sphinxik Рік тому +1

    Просто супер доступно объяснил. Спасибо большое!!!

  • @necelentano
    @necelentano Рік тому +1

    Спасибо Михаил! Полезное видео 👍

  • @mrakobes3736
    @mrakobes3736 Рік тому +1

    Отличное объяснение, спасибо!

  • @sankov206
    @sankov206 Рік тому +2

    Привет, спасибо за видео! Наконец-то кто-то правильно объяснил, потому что все видео на эту тему содержат неправильную информацию и какие-то глупые надуманные примеры, не имеющие отношения к реальному миру.

  • @aleksprimetv
    @aleksprimetv Рік тому +5

    Круто, можно про useMemo так же по полочкам разложить?)

  • @SkyAndStarss
    @SkyAndStarss Рік тому +1

    отлично, очень ясное видение ситуации, спасибо!

  • @АлексейСтепанов-к9о

    Михаил, спасибо за видео. Как всегда на высоте. Сложные вещи простым языком. Было очень полезно послушать про правильное использование useCallback

  • @ivmerk
    @ivmerk 3 місяці тому

    доходчиво, спасибо за труды..

  • @rossmanov
    @rossmanov Рік тому +3

    Михаил, вы создаете очень полезный контент)

  • @promoabys
    @promoabys Рік тому

    Михаил, спасибо.
    Всё просто и понятно !!!

  • @mikhailblush5261
    @mikhailblush5261 Рік тому +6

    на 8:00 чуть оговорился "два кейса, когда нужен useEffect"

  • @serjdenisov2114
    @serjdenisov2114 Рік тому

    Михаил, спасибо за информацию!!!

  • @lexymenshicov5278
    @lexymenshicov5278 6 місяців тому

    Спасибо большое за видео, очень качественно всё поясняется

  • @YaniaRZ
    @YaniaRZ Рік тому

    Спасибо, наконец-то дошло, для чего этот хук нужен! Хотя второй вариант я использовала, благодаря подсказкам eslint(, но без понимания особого)

  • @OlegSas
    @OlegSas Рік тому

    Михаил, спасибо большое! Просто, понятно, интересно.

  • @АнатолийГорбов-о1ь

    Михаил как всегда отличное видео и понятное! Спасибо

  • @askarzhaanbaev5834
    @askarzhaanbaev5834 8 місяців тому +2

    Спасибо, но я ничего не понял. Можно ещё какой нибудь пример

  • @unknownWakeborder
    @unknownWakeborder Рік тому

    Очень полезный материал получился, спасибо!

  • @artedza
    @artedza Рік тому

    Спасибо за объяснение!

  • @v.demchenko
    @v.demchenko Рік тому

    Кайф🎉 можно еще видео подробное по хукам?

  • @elstar7466
    @elstar7466 Рік тому +1

    Есть еще коллбэк-рефы, когда функция принимает как аргумент node (dom-узел) и присваивается атрибуту ref в JSX. Используется это обычно для передачи dom-узла кастомному хуку. useRef не всегда тут может помочь, ибо useEffect на него не реагирует, а вот коллбэк-реф он увидит.

  • @MasterHobbitLoL
    @MasterHobbitLoL 3 місяці тому

    Спасибо, отличное видео

  • @romanshevchenko9237
    @romanshevchenko9237 Рік тому

    Спасибо огромное, это лучшее объяснение useCallback во всех интернетах! Но я только одного не понял - зачем линтер требует добавить logUpdate в массив зависимостей во втором примере? Какая тут логика?

  • @DenisBien
    @DenisBien 4 місяці тому

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

  • @Kotovar
    @Kotovar 4 місяці тому

    Большое спасибо:)

  • @seosspro9686
    @seosspro9686 Рік тому

    Спасибо, все отлично объяснил

  • @cybersystem5137
    @cybersystem5137 4 місяці тому

    У нас в конторе принято всегда оборачивать. Я уже устал спорить, поэтому просто делаю че просят )) А в целом да, знаю давно, что это шляпа каждый раз мемоизировать. Еще есть другой фетишь: юзмемо. Каждую букву заворачивают 😅

  • @СултанбиЖолдыбай

    Ждем про useMemo)

  • @SvetlanaSiakina
    @SvetlanaSiakina 28 днів тому

    Возражение: в официальной документациии написано useCallback is a React Hook that lets you cache a function definition between re-renders. Это выглядит не как то, что озвучили вы говоря: Каждый ререндер у нас будет создаваться та де самая функция на 1: 45 - только ссылка сохранится.

  • @carcinogen0075
    @carcinogen0075 Рік тому

    Забыли сказать про ментальную нагрузку) Минимальный оверхед который дает useCallback не стоит возможных проблем с производительностью в местах где забудешь обернуть в useCallback. Так что с практической точки зрения всё лепить в useCallback имеет смысл

  • @anatoliiilescu839
    @anatoliiilescu839 Рік тому

    Thanks Mihail!

  • @michaelveselov589
    @michaelveselov589 Рік тому +4

    Спасибо, Михаил, у Вас наконец-то появились нормальные коллеги. Судя по объяснению данного хука в рамках курса по Реакт, достойных и мотивирующих коллег у Вас на тот момент не было!))

    • @mishanep
      @mishanep  Рік тому

      В смысле мотивирующих на подобный контент?))

    • @michaelveselov589
      @michaelveselov589 Рік тому +1

      @@mishanep Михаил, если я правильно понял предисловие, то до сегодняшнего дня у Вас были коллеги, твердо знавшие когда и в каких сочетаниях использовать useCallback))

  • @rudinandrey
    @rudinandrey Рік тому

    спасибо, очень понятно.

  • @daniyarzhanakhmetov7741
    @daniyarzhanakhmetov7741 Рік тому

    Супер, спасибо!

  • @romanmed9035
    @romanmed9035 Рік тому

    если можно о useEffect но с акцентом на помещение используемой в нем функции в массив зависимостей. линтер этого требует. но вот сегодня поместил и получил кольцевую обработку. как в видео. в случае когда мы не можем поместить функцию внутрь эффекта. например она вообще берется из собственного хука.

  • @voytko1994
    @voytko1994 Рік тому

    отличный урок! Сам никогда не понимал толком, знал в теории, но на практике - профан, давай еще про useMemo, в чем разница с useCallback?

    • @yantakushevich1014
      @yantakushevich1014 Рік тому +1

      useCallback возвращает функцию, а useMemo возвращает уже готовое значение, например объект. А так, суть одна и та же - возвращать ссылку на одну и ту же сущность, если зависимости не изменились.

  • @eugenekaler6048
    @eugenekaler6048 Рік тому

    Михаил, спасибо Вам за ваши труды!
    С удовольствием смотрю Ваши курсы на Udemy.
    Планируете ли Вы какой-нибудь новый курс?
    Очень хотелось бы, раскрыть тему CI/CD Jenkins.

    • @mishanep
      @mishanep  Рік тому +1

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

  • @dmitryrazdobudko4914
    @dmitryrazdobudko4914 Рік тому

    Спасибо за ролик. Очень наглядное объяснение, ибо тема действительно непонятная. Полагаю, аналогичный подход актуален и для useMemo?

    • @mishanep
      @mishanep  Рік тому

      C useMemo чуть сложнее. Здесь мы просто создаем функцию, не вызывая ее. А useMemo предполагает мемоизацию вычислений. Поэтому иногда данный хук нам может пригодиться, чтобы не повторять дорогих вычислений, даже если мы не планируем передавать их в другой компонент. В целом, логика с memo и использованием массивов/объектов как зависимостей для других хуков - аналогичная. Но, повторюсь, есть и другие кейсы использования.

  • @user-hruser
    @user-hruser Рік тому

    Сделай такой де пример, и предавай колбэк в таблицу и посмотри как будет рендерится или нет

  • @sno-oze
    @sno-oze Рік тому +1

    useCallback и memo - это не бесплатно, не факт, что в попытках оптимизации, всё не стало гораздо медленнее, чем без них. Нужны пруфы, пока же видно лишь то, что нет смысла использовать на столь легковесных компонентах лишнюю оптимизацию.

  • @grigoriyil6400
    @grigoriyil6400 Рік тому +1

    Михаил, вы волшебник. Я только учусь и вчера убил весь день на решение проблемы лишнего рендеринга. А тут ваш видосик подоспел как раз вовремя. Осталось придумать как это все состыковать с useForm :)) Спасибо вам большое за контент.

  • @mr_Fr0xman
    @mr_Fr0xman Рік тому

    Михаил, можешь сделать похожий обзор про useMemo? Понимаю, что там похожая ситуация, но всё же, возможно есть свои нюансы

  • @STELLS541
    @STELLS541 Рік тому

    Очень годно))

  • @NeoCoding
    @NeoCoding 11 місяців тому

    пять лет уже постоянно что-то делаю на реакт но до этого материала до сих пор не дорос..

  • @xice111
    @xice111 Рік тому +1

    видел как некоторые люди добавляют useCallback для callback отправленных в addEventListener, я так понимаю это излишне?

    • @mishanep
      @mishanep  Рік тому

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

  • @vasiliy_konnov
    @vasiliy_konnov Рік тому

    Очень крутой 😎👍

  • @ПользовательПользователь-с8к

    Стоило сказать про преждевременную оптимизацию всё же. А то пойдут ведь добавлять useCallback+memo куда не попадя, считая, что так надо 😅

  • @ArtmenBoss
    @ArtmenBoss Рік тому

    В доке еще пишут можно все кастомные хуки в useCallback оборачивать

    • @mishanep
      @mishanep  Рік тому

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

    • @ПользовательПользователь-с8к
      @ПользовательПользователь-с8к 9 місяців тому

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

  • @zubenkopetrovich4573
    @zubenkopetrovich4573 Рік тому

    господа, сколько не смотрел не могу понять разницу между useMemo, useEffect, useCallback. Даже после просмотра этого видео не до конца понял всю ситуацию с useCallback. Если не сложно, можете подробно разъяснить или скинуть ссылку на какой-то источник с подробным объяснением.

  • @Jaaaaaamp
    @Jaaaaaamp Рік тому

    4:17 говорится, что обновился родитель, но чей это родитель? этот момент не понятен, может кто объяснить?

  • @petrs5567
    @petrs5567 Рік тому

    Grand merci à vous, но обращаю внимание уважаемого автора на потенциальную оговорку 8:03: по всей видимости, вместо фразы "два кейса когда нам нужен useEffect()" имелось в виду "два кейса, когда нам нужен useCallback()"? Поправьте, если не так

  • @cmac2cmac
    @cmac2cmac Рік тому

    Спасибо!

  • @ALEKSEY_77737
    @ALEKSEY_77737 9 місяців тому

    Спасибо

  • @ВячеславТихонов-ц7й

    1е нормальное объяснеие🙏😀

  • @ssurrokk
    @ssurrokk Рік тому +1

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

  • @maaobzor2824
    @maaobzor2824 Рік тому +1

    В первом случае хватило бы только React.memo, повторных ререндеров компоненты не происходило бы

  • @HyndoDristalix14
    @HyndoDristalix14 Рік тому

    Вопрос , а если мы данные вырисовываем с RTK query , то нужно ли использовать useCallback?

    • @HyndoDristalix14
      @HyndoDristalix14 Рік тому

      либо React query, там же по сути автоматом кешируется все

    • @mishanep
      @mishanep  Рік тому +1

      Что конкретно вы предлагаете кэшировать с useCallback при использовании названных библиотек?

  • @weynemeynen
    @weynemeynen Рік тому

    Два кейса когда нужен useEffect (8:03) или всё же useCallback?

  • @Neteruss
    @Neteruss 11 місяців тому

    а если в Hook вынести?

  • @TpyrBo3Db
    @TpyrBo3Db Рік тому +1

    тупо лучший

  • @mkhitarmuradyan4432
    @mkhitarmuradyan4432 Рік тому

    fantastic !

  • @jamjam3337
    @jamjam3337 Рік тому

    👏👍

  • @randomedd9102
    @randomedd9102 Рік тому +1

    8:02 useCallback*

  • @profesor08
    @profesor08 Рік тому

    Можно забить на useCallback, если ты передаешь свой колбек в какой-то самый простой компонент. Или когда данные, от которых он зависит, постоянно обновляются, и ты точно знаешь как он устроен внутри. А вот взаимодействие с DOM, это уже дорогая операция, это дороже чем инициализировать функцию, и чем 10 функций. А еще очень часто есть много готовых компонентов и компонентов из сторонних модулей, и как на это повлияет использование useCallback, заранее не известно. А выстрелить это может в самый неподходящий момент, заблокировать юзеру страницу, сожрать всю память или вылететь с переполнением стека вызовов. По этому, из соображений безопасности и здравого смысла, использовать useCallback надо для каждой объявленной внутри компонента функции, которая зависит от данных в этом компоненте. В противном случае ей там делать нечего, и она должна быть объявлена вне компонента.

  • @miloman1995s
    @miloman1995s Рік тому

    а как же removeEventListener, там необходимо передавать функцию с изначальной ссылкой, и соответственно для этого мы можем callback функцию, передаваемую в addEventListener обернуть в useCallback - чтобы не потерять ссылку на нашу изначальную callback функцию)

    • @mishanep
      @mishanep  Рік тому +1

      Смотря как вы добавляете, снимаете ивенты. Как правило, это одна и та же функция, обернутая в useEffect. А значит и ссылка на функцию будет одна.

  • @boburmustafo8868
    @boburmustafo8868 Рік тому

    spasibo

  • @АлешаАлексей-г8ь

    База))

  • @darkside2436
    @darkside2436 Рік тому +2

    Преждевременная оптимизация хуже чем никакая оптимизация вовсе.

  • @sergey_zatsepin
    @sergey_zatsepin Рік тому

    Ну вот эти слова про "дорогую операцию" ничем не подкрепленные, вообще не айс. Сам то проверял или так просто, услышал от кого-то, кто сам услышал от кого-то и т.д., и так вы просто повторяете бездумно друг за другом? Что там с holy js кстати, едешь/не едешь?

    • @alext5030
      @alext5030 Рік тому +1

      Типичное поведение практически всех современных программистов, в т.ч. высокого уровня - это слепое следование каким-либо догмам, не пытаясь разобраться, насколько они актуальны и в каких случаях. Туда же ничем не подкрепленные заявления о низкой / высокой производительности, бесконечная битва с ререндерами (в SPA), бОльшая часть которых на производительность с позиции end user влияет практически... никак.
      А потом имеем глючное нечто типа сайта Озона (там Vue, но в данном случае это иррелевантно) с вот уже годами (периодически) отваливающейся фильтрацией.
      Таковы реалии современного программирования "по фэн-шую".

    • @ПользовательПользователь-с8к
      @ПользовательПользователь-с8к 9 місяців тому

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

  • @iiiyx
    @iiiyx 7 місяців тому

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

  • @Garry_Levin
    @Garry_Levin 4 місяці тому

    Ролик может и неплохой, но без исходного текста не имеет никакого смысла. Дизлайк.

  • @lesters
    @lesters Рік тому +1

    спасибо очень полезная инфа что он юзается в тандеме с мемо

  • @ice_rd
    @ice_rd Рік тому +1

    Почему во Vue все так просто и лаконично. Нужно действие - кидай в экшен, нужно вычисление + кэш - используй компьютед. В React такие сложности из колбека, мемо и рефов ... 🥲

    • @Лаурахит
      @Лаурахит Рік тому

      Сам то же сравнивал и пришел к таким же выводам. Неоправданно все усложнено!!!

    • @PowWowVideo
      @PowWowVideo Рік тому +1

      В реакте ТОЛЬКО 3-4 хука, которые надо заучить и правильно использовать и ВСЁ:) Какие сложности ?

    • @ReAgent003
      @ReAgent003 Рік тому

      Согласен, реакт запутанный и в нём есть высокий риск уронить производительность. А Свелте, как и вью, проще в этом плане. Вот доклад на эту тему
      ua-cam.com/users/livebB-R_lOlTLE?feature=share&t=744

    • @xeleos
      @xeleos Рік тому

      согласен. В реакте на простейшие оптимизации надо тратить кучу времени, а во вью подход совершенно иной, там функции итак создаются 1 раз, поэтому ничего такого не надо.

    • @Лаурахит
      @Лаурахит Рік тому

      @@PowWowVideo Согласен, хуков не много, но их часто используют для создания кастомных хуков, и потом с этим разбираться надо). Сложности в том что из коробки в React все таки меньше чем в том же Vue. Много нужно самому дописывать

  • @givgiv6688
    @givgiv6688 Рік тому

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