Тёмный
No video :(

Что вы знаете о useCallback? 

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

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

 

28 авг 2024

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 257   
@d3mon18rus
@d3mon18rus 3 года назад
боже храни алгоритмы ютуба которые решили порекомендовать мне этот канал :D
@it-sin9k
@it-sin9k 3 года назад
Аминь :D
@Sashanovoseltsev
@Sashanovoseltsev 5 месяцев назад
Мне пришлось перейти из .Нет бекенд разработки на фронт, поучаствовать в найме, познакомиться со специалистом с реакт навыками гораздо выше моих, признаться ему в этом и спросить где он черпал знания чтобы узнать об этом канале) Так что вам еще повезло 😁
@0xlex695
@0xlex695 3 года назад
Просто супер! Какой же огромный труд делать анимацию, да еще и с таким высоким качеством подачи...Ты крут!
@it-sin9k
@it-sin9k 3 года назад
Спасибо!) это действительно не легкий труд) будем рады если поделитесь видео с коллегами)
@GagikHarutyunyan_dev
@GagikHarutyunyan_dev 3 года назад
это гигантский труд. Я как то создавал себе анимацию через adobe after effects. Это ад. Там еще нужно иметь супер мега железо, чтобы не зависло.. А процесс создания инфографики очень долгий. Я думаю на анимацию уходит несколько раз больше времени чем на контент
@it-sin9k
@it-sin9k 3 года назад
я честно говоря даже и не знаю, на что уходит больше времени. Очень много занимает расписывание сценария для видео. В плане на такой-то фразе показать вот этот текст или вот на бумаге нарисовал примерный вид страницы. Вот этот подробный видео сценарий занимает очень много
@ronnieatticus8455
@ronnieatticus8455 3 года назад
@Jerome Lochlan instablaster :)
@alexandrnasonov
@alexandrnasonov 2 года назад
@@GagikHarutyunyan_dev Привет рендерам по 8 часов, тут вам не реакт с мемойзами
@Elator11777
@Elator11777 3 года назад
Вот это действительно крутой контент, а не перессказывание документации!
@it-sin9k
@it-sin9k 3 года назад
Спасибо!) следующие 2 видео которые выйдут на канале, будут еще круче) **по секрету**
@-X-Ray-
@-X-Ray- 3 года назад
Дивный новый мир хуков, спасибо, очень полезно 👍
@user-ku2hc3mr3m
@user-ku2hc3mr3m 3 года назад
Спасибо за видео! Перепишу сегодня парочку компонентов)
@it-sin9k
@it-sin9k 3 года назад
С этим комментарием цель данного видео считаю достигнутой))
@dmitrysvetlov6001
@dmitrysvetlov6001 3 года назад
хорошее объяснение. хотелось бы по всем хукам такой разбор ) особенно по useReducer. успехов каналу, лайк / подписка.
@it-sin9k
@it-sin9k 3 года назад
Добро пожаловать!) ну уже как минимум на канале разобраные: useRef, useMemo, коснулись useEffect + useLayoutEffect и новый выпуск во вторник еще раскроет, что-то новое)
@DmitriLipski
@DmitriLipski 3 года назад
Спасибо за видео! Как всегда качественный контент. Можно ещё про useRef видео
@it-sin9k
@it-sin9k 3 года назад
Да, про useRef, там есть интересные трюки, однозначно про них будет выпуск
@aleksandrmatyka3118
@aleksandrmatyka3118 3 года назад
Нужно сделать запрос, чтобы некоторые ваши ролики делали как отдельный на сайте реакт документации)
@it-sin9k
@it-sin9k 3 года назад
Было бы очень не плохо)))
@viktorsoroka4510
@viktorsoroka4510 3 года назад
Отличный контент. Я бы ещё отметил что также приходится мемоизировать когда функции указываются в зависимостях тех же тех же useErffect или useMemo.
@it-sin9k
@it-sin9k 3 года назад
спасибо за комментарий! Я в данный момент намеренно не касался этих примеров, т.к. в следующих выпусках планирую про это поговорить более углубленно :)
@viktorsoroka4510
@viktorsoroka4510 3 года назад
@@it-sin9k Супер. Рад что покрывашь эти темы :) Кстати сколько времени уходит что бы смонтировать видео? Картинка получается супер, просто интересно почему в итоге допустим не выбрал обычный вариант например как делает Kent C. Dodds, который как мне кажется занимал бы меньше времени.
@it-sin9k
@it-sin9k 3 года назад
нас двое, я придумываю контент, записываю аудио и делаю текстовый драфт по визуализации и есть еще товарищ, который делает всю работу по видео ряду, рисует персонажей, делает разные визуальные эффекты и прочее. Поэтому сумарно это занимает очень много времени, посчитать особо не могу. Лишь один контент осознать и продумать подачу у меня занимает пару дней, по факту это как статью придумать и написать. Синяк - это единственный формат контента, который я бы сам стал смотреть. 5 - 10 минут, осознанного текста, с минимизированным количеством лишней информации (скрыт лишний код, лишние контролы в браузере и многое другое), с крупными шрифтами, чтобы смотреть на телефоне было удобно + фокус кода, чтобы понимать о чем речь идет, да и визуализация идеи какого либо патерна сильно упрощает его понимание, это то что смотрел бы я сам. В подаче Kent C. Dodds такого нет, тогда уж лучше по мне прочесть статьи какие-нибудь, чем смотреть длинные ролики с говорящей головй и перегруженным экраном. А я люблю все таки видео формат, поэтому и решил сделать, то что сам бы смотрел.
@dm.hol.3624
@dm.hol.3624 3 года назад
Респект за коммент, ради таких всегда их читаю.
@blgarOk
@blgarOk Год назад
Забыл одну важную деталь. Что бы этот трюк с useCallback работал, нужно чтобы дочерний компонент был оптимизирован от лишних ререндеров. Например, в родитель прилетает новый пропс, это тригерит ререндер родителя и всего поддерева, вне зависимости обернут колбек в useCallback или нет. Справедливости ради, в твоем примере родитель не имеет своего локального состоятия или пропсов используемых только в родителе, поэтому у тебя все корректно. Но все же в общем случае, даталь описанную выше, нужно учитывать.
@MACHETE912
@MACHETE912 3 года назад
Качественный контент, спасибо!
@it-sin9k
@it-sin9k 3 года назад
Спасибо!)
@muratx10
@muratx10 3 года назад
контент бомба! спасибо добрый Синяк! скину ребятам видос. 🔥
@it-sin9k
@it-sin9k 3 года назад
Мы рады быть полезными :) Рекомендую еще в твитер подписаться, пользы там не много, но иногда провожу опросы, какие темы хотели бы послушать
@muratx10
@muratx10 3 года назад
@@it-sin9k Обязательно! 👌
@arturbilyi1010
@arturbilyi1010 3 года назад
Топовое объяснение! Перед собесами мега полезно)
@underpog5347
@underpog5347 3 года назад
А в конце видео компонент не нужно обернуть в React.memo что бы useCallback внутри компонента имел какой-то смысл?
@it-sin9k
@it-sin9k 3 года назад
Абсолютно верно, необходимо использовать React.memo, я как то опустил в визуализации этот момент. Вероятно стоило добавить
@underpog5347
@underpog5347 3 года назад
@@it-sin9k Спасибо за ответ, очень полезное видео
@serhiirumiantsev7736
@serhiirumiantsev7736 3 года назад
Да, круто объяснил насчёт создания функции, но как по мне useCallback надо использовать только в связке с React.memo
@it-sin9k
@it-sin9k 3 года назад
В большинстве случаев да, но есть и другие более редкие кейсы, когда тебе нужна одна и та же ссылка на функцию. Например если у тебя есть window.addEventListener и window.removeEventListener, в таком случае нужно так же передать одну и туже функцию, иначе ты не сможешь отписаться от события.
@serhiirumiantsev7736
@serhiirumiantsev7736 3 года назад
@@it-sin9k ну ты конечно высаживаешь.... Найдешь редкий кейс, круто. Спасибо.
@samatzhetibaev8045
@samatzhetibaev8045 2 года назад
Видео отличное! У нас на проекте используют часто не по назначению. Подниму эту тему. Благодарю! Придерусь только к названиям обработчиков: 7:57, у них должен быть префикс `handle`. Ты и сам в видео говоришь, о том, что надо обработать (to handle) событие: handleClick, handleChange, handleSubmit, handleMyOwnClick, etc. Если это событие передаётся дальше как пропс, то префикс будет `on`: onClick, onChange, onSubmit, onMyOwnClick, etc. Ещё раз благодарю за видео! :)
@it-sin9k
@it-sin9k 2 года назад
Интересный подход к неймингу. Подниму этот вопрос в команде, интересно, кто как отреагирует :)
@mikhailstepanischev8316
@mikhailstepanischev8316 3 года назад
Спасибо,супер выпуск ! useCallback
@andrewginter8790
@andrewginter8790 3 года назад
Спасибо, очень полезно!
@pavlof
@pavlof 2 года назад
это очень круто!!! по возможности побольше хотелось-бы "своих реализаций", как в случае с useCallback или разбор source code-а
@it-sin9k
@it-sin9k 2 года назад
На этом канале много видео с разбором исходников :)
@eugeniyvinnikov5480
@eugeniyvinnikov5480 3 года назад
Боже мой, спасибо тебе ) наконец-то понял необходимость useCallback )
@it-sin9k
@it-sin9k 3 года назад
Сам немного был шокирован, когда осознал))
@srt2046
@srt2046 3 года назад
Ещё один шикарный ролик!💪
@lomeat
@lomeat 3 года назад
Хотелось бы еще больше таких кейсов
@it-sin9k
@it-sin9k 3 года назад
Завтра утром планируется публикация следующего видео :)
@dmitriibo458
@dmitriibo458 3 года назад
Польза тут
@zooyotz
@zooyotz Год назад
Почему у этого канала еще не миллион подписчиков?)
@it-sin9k
@it-sin9k Год назад
Для этого React-у надо хотя бы 1млрд скачек в неделю)
@srt2046
@srt2046 3 года назад
Бро, ты реально крут. Делай дальше и чаще) Я от Арчакоаа. Подписался, нажал колокольчик
@it-sin9k
@it-sin9k 3 года назад
Спасибо!) делать дальше это без проблем) а вот с чаще немного сложно. Сам контент, каждый выпуск это как статью на хабре написать (по некоторым выпускам мы и публикуем статьи), выматываем достаточно, а еще и видео ряд нужно придумать и смонтировать) Поэтому текущая наша скорость 1 видео раз в 2 недели
@srt2046
@srt2046 3 года назад
@@it-sin9k Успехов желаю) буду ждать каждый выпуск 💪
@lomeat
@lomeat 3 года назад
Внезапно правда хороший видос. Про этот "нюанс" знал, но уровень подачи материала на уровне. Разве что в какой-то момент объяснение кажется сверх-монотонным, а в какой-то слишком быстро проматывающим основные моменты. Например зачитывание на экране того, что я могу поставить на паузу и сам быстро прочитать. А потом скип, когда пишется функция useCallback.
@it-sin9k
@it-sin9k 3 года назад
Спасибо за фидбек! а можете уточнить что вы подразумеваете под "скип, когда пишется функция useCallback?" что именно хотелось бы добавить?
@lomeat
@lomeat 3 года назад
@@it-sin9k когда показывалась реализация функции вместе с ее условиями, то например, мне хотелось самому же прочитать эти условия, так сказать зафиксировать их у себя в голове, а не просто пробежаться по ним. Как бы там не было ничего сложного, но хочется большой остановки на этом. Смотрю сейчас доклад, как же бодро ты рассказываешь, хочу с тобой работать)
@it-sin9k
@it-sin9k 3 года назад
Я просмотрел заново видос) понял о чем ты говоришь, я специально не останавливался особо на реализации useCallback, потому что через пару видео планирую эксперементальное видео, рассмотреть исходники реакта. Т.е. все смогут подробно увидеть, что примерно происходит под капотом. Конечно всю кодовую базу не получится раскрыть, но что-то получится
@edgarmkrtchyan9607
@edgarmkrtchyan9607 6 месяцев назад
завтра буду смотреть,брат советовал
@it-sin9k
@it-sin9k 6 месяцев назад
привет передавай брату!)
@koreikin
@koreikin 2 года назад
крутой контент, почему так мало подписчиков и просмотров. Не понимаю, почему только сейчас спустя можно сказать 2х лет ютьюб предложил ваши видео. Очень четкая и поставленная речь(только благодаря ей уже включаешься в осмысление темы) , продуманный текст, столько трудов.
@it-sin9k
@it-sin9k 2 года назад
Спасибо! Трудов действительно много) а алгоритмы ютуба не исповедимы))
@yulia_kotlyar
@yulia_kotlyar 3 года назад
Спасибо, было полезно и понятно!
@agfasgasasgasgas
@agfasgasasgasgas 2 года назад
Приятно, что хоть кто-то делает контент не для начинающих )
@it-sin9k
@it-sin9k 2 года назад
сам страдал, что не хватает контента для себя. Вот решил его сам создать)
@user-bt9hx3ik6e
@user-bt9hx3ik6e 2 года назад
блин, какой же офигенный материал. уже несколько дней смотрю по чуть-чуть. очень грамотно даешь информацию, еще и докуху разжевываешь. спасибо!
@it-sin9k
@it-sin9k 2 года назад
Ради таких бесценных комментариев мы и стараемся)
@user-bt9hx3ik6e
@user-bt9hx3ik6e 2 года назад
@@it-sin9k планируются ли какие-то курсы по реакту?
@it-sin9k
@it-sin9k 2 года назад
@@user-bt9hx3ik6e что то подобное планируется, но будет думаю еще не скоро, платформу решили свою запилить для этого. Там много идей, что на ней можно запилить
@user-bt9hx3ik6e
@user-bt9hx3ik6e 2 года назад
@@it-sin9k думаю такой курс был бы один из лучших в ру-регионе.ждем запуска платформы тогда)
@it-sin9k
@it-sin9k 2 года назад
@@user-bt9hx3ik6e очень на это надеюсь) но надо набраться терпения)
@rib0385
@rib0385 28 дней назад
Привет, тут небольшая ошибка 3:55. Eсли произойдет перерендер родительского компонента Test, тем самым Test сам начнет свой перерендер, даже если его пропсы не поменялись. В этом случае функция useCallback вернет закешированный callback, а в примере без useMemo произойдет пересоздание функции. И также в примере компонент Car нужно обернуть в memo, чтобы от мемоизированного коллбека была оптимизация
@it-sin9k
@it-sin9k 27 дней назад
да, я так не добавил обертку в memo(). Пропустил этот моментик)
@MrGreen-zs7on
@MrGreen-zs7on 3 года назад
Спасибо за такой контент, канал просто бомба! Главное только что бы выход контента не пострадал из за переезда в другую страну :)
@it-sin9k
@it-sin9k 3 года назад
Спасибо) Новое видео уже залито на канал) завтра утром запланирована публикация) так что пока все успеваем в дедлайны))
@hihoho1578
@hihoho1578 3 года назад
👍
@vitaliydrapkin3748
@vitaliydrapkin3748 Год назад
Я просто в шоке насколько крутой контент и как хорошо и просто ты объясняешь) спасибо тебе огромное)
@it-sin9k
@it-sin9k Год назад
Спасибо!
@user-kz7lw2yl3w
@user-kz7lw2yl3w 3 года назад
Не совсем понял мысль на 8:50 минуте - почему в этом случае нет смысла использования useCallback? Про оборачивание какой функции идет речь: onClick в или onCarClick в ?
@it-sin9k
@it-sin9k 3 года назад
Идея в том чтобы оборачивать в useCallback метод onCarClick, который находится в компоненте Cars. Это нужно для того чтобы компонент Car получал одну и туже ссылку на функцию, тогда компонент Car можно обернуть в memo и благодаря тому что ссылка на функцию будет одна и таже, компонент Car не будет заново рендериться, на каждый чих родителя. С другой стороны внутри компонента Car нет смысла оборачивать onClick. useCallback(() => onCarClick(car), [onCarClick, car]). Потому что нам нет нужды в одной и той же ссылке, пусть на каждый render функция новая передается в
@user-kz7lw2yl3w
@user-kz7lw2yl3w 3 года назад
@@it-sin9k да, я про это и спрашивал - какая функция имеется в виду в этом моменте (ппросто там явно не озвучено), в таком варианте - да, все ясно
@GreenTech1256
@GreenTech1256 3 года назад
@@it-sin9k > компонент Car не будет заново рендериться, на каждый чих родителя. На сколько я знаю компонент рендериться при новых пропсах или стейте и получается при новых пропсах ({cars}) компонент будет рендериться и за счет этого его потомки тоже Т е useCallback в тоже не имеет смысла?
@it-sin9k
@it-sin9k 3 года назад
Если компонент Car не обернут в memo, тогда Car будет рендериться абсолютно при любом рендере родителя. В данном примере я подразумевал, что компонент Car обернут в memo. Это значит, что компонент Car будет рендериться, только в случае, если хотя бы один из props изменится. Одним из таких props может быть функция onCarClick. Если мы не обернем ее в Cars в useCallback, тогда мы будет передавать новую ссылку на функцию, при каждом рендере Cars, а это значит что абсолютно все компоненты Car будут рендериться. Поэтому и оборачивается в useCallback, для того чтобы мемоизировать функцию, и каждый раз в props передавать одну и ту же ссылку на функцию onCarsClick
@maxvas7267
@maxvas7267 2 года назад
Жииииирный лайк! Супер простое и наглядное объяснение
@denichi872
@denichi872 Год назад
Привет видео класс. Хочу попросить вставлять в описание к видео ссылку на статью, твои же многие видео имеют статью на хабре. Полезно после просмотра еще и почитать то же самое, лучше закрепляется)
@it-sin9k
@it-sin9k Год назад
Тут 2 проблемки :) - Не хочу трафик с ютуба на хабр отправлять, идея была скорее наоборот) - ну и статьи давно перестал выпускать новые, что то комменты на хабре иногда меня очень расстраивали. Комменты на ютубе куда более приятно читать и отвечать людям Есть мысли сделать свой ресурс, куда расшифровки публиковать, тогда точно буду постить)
@denichi872
@denichi872 Год назад
@@it-sin9k логично, я и не подумал об этом)
@AlexanderEmashev
@AlexanderEmashev 3 года назад
Мое почтение! Отличная анимация и подача!
@it-sin9k
@it-sin9k 3 года назад
спасибо!) мы работаем над ее улучшением)
@mayday4977
@mayday4977 Год назад
Благодарю за труды и годнейший контент!
@Mark-wn4op
@Mark-wn4op Год назад
Смех, смехом, но буквально вчера делал тестовое где примеры с useCalback были точь в точь как в твоём видосе;)
@it-sin9k
@it-sin9k Год назад
ахах) возможно по видео и составляли тестовое)
@_ivanoleksiuk
@_ivanoleksiuk 2 года назад
1. Немного не понял зачем нам создавать новую функцию из пропа в компоненте , почему мы не можем в return сам проп функции передать? 2. А если бы нам нужен был ивент, можем ли мы просто сделать onCarClick(car, event) }> ? 3. Видел что снизу в коментах про мемо речь ишла. Так нужно ещё и саму функцию в useMemo hook? Или компонент в memo HOC? Видосы топ! Качество огонь. Подача для джунов - на высоте! Побольше контента, спасибо! Будем лайкать и коментировать, а также ДОНАТИТЬ)))
@it-sin9k
@it-sin9k 2 года назад
1. Дело в том что компонент Car обернут в memo(). Соответственно чтобы избежать лишних рендеров, нужно передавать ссылку на одну и ту же функцию, а если создавать функцию снаружи, то вы каждый раз передаете новую ссылку на функцию. Да и саму функцию создаете, на каждый рендер листа, а если он в компоненте, то функция создавалась бы только при перерендоре 2. Так и сделано же 3. Для функции есть useCallback, а не useMemo. Да при работе с листами, чтобы передавать одну и ту же ссылку на функцию лучше обернуть ее в useCallback
@_ivanoleksiuk
@_ivanoleksiuk 2 года назад
​@@it-sin9k, спасибо большое за ответ, но все же, либо я туплю, либо вы не совсем поняли вопрос 1. У меня ситуация идентичная как у вас в примере, за исключением того, что функция onCarClick принимает кроме car, ещё и event. Так вот. 1. В обернул объявление функции в useCallback, чтобы ссылка оставалась прежней. 2. Обернул компоненту в memo-HOC. 3. Но в я НЕ создаю по новой "const onClick = () => onCarClick(car, event)", по тому что, в return нужно ивент "поймать". Тоесть получается "return ( onCarClick(car, event)} />)" - каждый раз анонимная функция передается. Если бы я объявил ранее, то как бы переданая ссылка ивент поймала? Либо я просто не знаю как правильно сделать :( Как тогда оптимизировать?
@it-sin9k
@it-sin9k 2 года назад
​@@_ivanoleksiukНе вижу в этом никакой сложности, вы вполне можете написать следующий код: const onClick = (event) => onCarClick(event, car) return click me
@_ivanoleksiuk
@_ivanoleksiuk 2 года назад
@@it-sin9k спасибо большое! Не знал что так работать будет. У меня два аргумента в функции, один из них ивент. Я думал будет работать если только два передавать. Думал всегда нужно анонимную с указанием двух. Не понимаю откуда берет второй (указываю "const onClick = (event) => onCarClick(event);" и работает). Но ничего - разберемся!
@virginia_dj
@virginia_dj 3 года назад
Суть useCallback в том, что someFunction будет мемоизирована И react не будет ререндерить атрибут onClick тега button, потому что someFunction мемоизирована (если конечно title не изменился) Поэтому данное видео для понимания useCallback под копотом хорошее, но неверное Поправьте если не прав
@it-sin9k
@it-sin9k 3 года назад
Похожая дискуссия происходила на хабре, если интересна выжимка (я придерживаюсь того же мнения), то склонялись к тому что onClick пере присвоить (addEventLister / removeEventListener) дешевле чем прогонять данные через useCallback. И читабельность ухудшается. Вот ссылка на тред, более подробно почитать можно мысли разных людей habr.com/en/post/529950/#comment_22379830
@vidjentukvidjentuk8644
@vidjentukvidjentuk8644 Год назад
Рад ,что нашёл твой канал бро, очень сильно все преподносишь!!
@it-sin9k
@it-sin9k Год назад
спасибо! Мы рады что ты нас нашел))
@user-cu1zr5zj1e
@user-cu1zr5zj1e 2 года назад
Отличная подача материла. Большое спасибо!)
@vladthorenco2675
@vladthorenco2675 2 года назад
Очень круто сделано, мультики про React это новое) Поделился с коллегами ссылкой
@it-sin9k
@it-sin9k 2 года назад
За "Поделился с коллегами ссылкой" огромное спасибо!)
@user-vm2db5cq1g
@user-vm2db5cq1g Год назад
Это лучшее видео и самое понятное по этому хуку! спасибо!
@it-sin9k
@it-sin9k Год назад
Спасибо! Надеюсь найдете себе еще что-то полезное на канале)
@VeaceslavBARBARII
@VeaceslavBARBARII 8 месяцев назад
Спасибо
@Quentinrei
@Quentinrei Год назад
Круто, очень круто 🎉🎉🎉🎉
@artempavlenko5147
@artempavlenko5147 3 года назад
Отличная подача полезного контента.
@it-sin9k
@it-sin9k 3 года назад
Спасибо :) мы очень старались)
@rudinandrey
@rudinandrey Год назад
бросилось в глаза: даже если недавно пришли в React из другого языка программирования )))
@irinal7766
@irinal7766 Год назад
Согласна, что подача материала крутая!
@ivanp7697
@ivanp7697 2 года назад
Я скажу коротко, но искренне: спасибо тебе огромное за твои ролики!
@user-nd5zd5kc5k
@user-nd5zd5kc5k Год назад
Я долго размышлял и понял, что в последнем примере ошибка, если я неправ, поправьте меня. Компонент Car все равно будет рендерится. То есть функция будет все равно отрабатывать, единственное, не будет removeEventListenet и addEventListenet . Чтобы действительно не было лишних срабатываний, нужно компонент car обвернуть в memo
@it-sin9k
@it-sin9k Год назад
да, все верно. Я не показал явно, что компонент обернут в React.memo. Без этого не будет работать
@MrKu39
@MrKu39 Год назад
Обработчики событий также будут обновляться при каждом рендере, так как при перерендере родителя перендеривается Car полностью, соответсвенно функция запускается полностью по новой
@user-nd5zd5kc5k
@user-nd5zd5kc5k Год назад
@@MrKu39 Если функция в `useMemo` и обработчик в `useCallback`, то функция не будут срабатывать без изменения пропсов сверху или стейтов внутри
@MrKu39
@MrKu39 Год назад
@@user-nd5zd5kc5k Да , все верно. Но только компонент в React.memo. Не совсем понял про removeEventListener и addEventListener. Почему они не будут срабатывать? Да и операция простейшая , имхо она легче чем useCallback
@user-nd5zd5kc5k
@user-nd5zd5kc5k Год назад
@@MrKu39 если добавить useCallback, но не добавлять React.memo, как в примере из видео, то оптимизация сведется к тому, что компонент (функция) все равно будет полностью срабатывать, будет видеть, что обработчик функции не изменился и не будет лишнего removeEventListenet и addEventListenet, которые были бы без useCallback
@Andrew-fq2ts
@Andrew-fq2ts Год назад
Хорошее видео В бета доке реакта указано, что useCallback можно представить в следующем виде: // Simplified implementation (inside React) function useCallback(fn, dependencies) { return useMemo(() => fn, dependencies); } В таком случае мы создаём целых две функции на каждый рендер вместо одной
@kostyapolishko6282
@kostyapolishko6282 3 года назад
Ты вообще 🔥!!!! Все четко, понятно, анимации просто крутые. 100 % лайк и подписка!!!
@it-sin9k
@it-sin9k 3 года назад
Спасибо!) Добро пожаловать!)
@victorkulyabin3219
@victorkulyabin3219 3 года назад
Очень круто, спасибо!
@fedor_U
@fedor_U 2 года назад
Крутое видео и отличное объяснение. Спасибо!
@it-sin9k
@it-sin9k 2 года назад
Спасибо!)
@armensargsyan8981
@armensargsyan8981 Год назад
топ спасибо за труды. Можно вопрос про часть (Таким образом все компоненты Car не будут рендериться лишний раз, т.к. ссылка на функцию останется прежней.) это утверждение верно если Car обернут в memo так? 8:35 минута.
@it-sin9k
@it-sin9k Год назад
Абсолютно верно :)
@art7653
@art7653 Год назад
Круто
@unknownunknown1113
@unknownunknown1113 2 года назад
Ты очень нужен нам, приятель)
@it-sin9k
@it-sin9k 2 года назад
чего сразу пропал) неделю назад вышло последнее видео) такой контент так часто не опубликуешь)
@Infrantos
@Infrantos 2 года назад
Очень доходчиво и понятно, спасибо!
@it-sin9k
@it-sin9k 2 года назад
Очень рад!)
@maksrygaev657
@maksrygaev657 2 года назад
Крутой видос спасибо коммент в поддержку канала!!
@it-sin9k
@it-sin9k 2 года назад
Продвигаем канал!))
@ruslankarimov6490
@ruslankarimov6490 Год назад
суууууууууууупер! Спасибо!
@it-sin9k
@it-sin9k Год назад
спасиииииибо!
@artykovdaniyar
@artykovdaniyar 8 месяцев назад
Что если мы используем функцию внутри useEffect или useMemo и она передаётся в качестве зависимости в массив зависимостей, даст-ли нам пользу в производительности если мы эту функцию обернем в useCallback?
@it-sin9k
@it-sin9k 8 месяцев назад
набросайте лучше код) так будет понятнее)
@Sylar7891
@Sylar7891 2 года назад
8:54 почему ьы сращу не передать onCarClick (car) в Button а создавать специально функцию?
@it-sin9k
@it-sin9k 2 года назад
В конкретно этом видео, для наглядности. А в реальных проектах, мы обычно на 100% разделяем логику и отображение. Поэтому этот код у меня был бы в хуке кастомном, где я подготавливаю все данные для компонента
@aksenovkirill5191
@aksenovkirill5191 Год назад
Спасибо! Очень круто и понятно! Есть только один вопрос: зачем в компоненте с кнопкой, при передаче props ссылки на функцию - создаётся новая функция, которая связывает эти функции?
@it-sin9k
@it-sin9k Год назад
чтобы сделать замыкание на конкретную машину в onClick
@aksenovkirill5191
@aksenovkirill5191 Год назад
@@it-sin9k спасибо! Очень круто!
@user-nh4yp4fi9m
@user-nh4yp4fi9m 2 года назад
Спасибо большое, ты крут !
@it-sin9k
@it-sin9k 2 года назад
Спасибо!) Мы очень стараемся!
@jenerly-liasinjuaru2643
@jenerly-liasinjuaru2643 6 месяцев назад
То, что useCallback не кеширует функцию компонента между рендерами того же компонента (поскольку сам он обновляется полностью) - звучит очевидно да, но в таком контексте как озарение. Но вот почему при обычной передаче пропса нескольким дочерним компонентам передаются будто разные функции, хотя по логике ссылка должна быть даже, ведь сам родительский компонент за этот период пересоздаваться не должен, не понятно… Извините, пока сильно туплю в React.
@avisalon4730
@avisalon4730 2 года назад
Очень крутые уроки!
@it-sin9k
@it-sin9k 2 года назад
спасибо!)
@kanstantsinhrytsuk7901
@kanstantsinhrytsuk7901 Год назад
Респект 👍
@arman-6172
@arman-6172 Год назад
Большое спасибо за труд, какой день изучаю этот useCallback =) немного не понял в конце 8:45 когда сам дочерний компонент обвернул в свою функцию. что изменилось что не нужно родителю использовать useCallback ? какие признаки должны быть когда точно нужно юзать useCallback?
@it-sin9k
@it-sin9k Год назад
то что делается на 8:45 работает вместе с useCallback. А как еще передать параметры?
@arman-6172
@arman-6172 Год назад
​@@it-sin9k А если заглянуть внутрь компонента Car. там мы создадим еще одну функцию, которая свяжет onCarClick и объект car. В этом случае нет никакой пользы оборачивать метод в useCallback, т.к. нам не важно, ссылка это на функцию с прошлого рендера или с текущего рендера... тут наверно про использование нового useCallback уже для Car? Наверно я не так понял, думал что продолжаете говорить про родительский useCallback, что в нем теперь нет необходимости. Спасибо!)
@it-sin9k
@it-sin9k Год назад
useCallback у родительского компонента нужен был, чтобы при рендере списка машин, все компоненты Car не обновлялись, чтобы все получали одну и ту же ссылку. А внутри Car там уже не важно, что мы передаем в onClick. На уровне DOM дерева можно и разную ссылку передавать, это дешевая операция
@arman-6172
@arman-6172 Год назад
@@it-sin9k благодарю. Я затупил 🤷‍♂️
@user-fu3zv6bc9p
@user-fu3zv6bc9p 2 года назад
очень круто, респект
@it-sin9k
@it-sin9k 2 года назад
Спасибо!
@ukostin123
@ukostin123 7 месяцев назад
Данный пример работать не будет! Компоненты Car будут по-прежнему перерисовываться вместе с родительским компонентом.
@it-sin9k
@it-sin9k 7 месяцев назад
Все верно) React.memo забыл в видео добавить))
@awakeupcall5336
@awakeupcall5336 Год назад
8:52 - не совсем понял, почему в данном случае неважно, почему не юзать useCallback на этом уровне - какой критерий, на каком уровне остановиться? Можете объяснить другими словами подробнее?
@it-sin9k
@it-sin9k Год назад
Привет :) давайте попробуем пойти от обратного, а почему здесь нужен useCallback? После вашего ответа, мне будет проще понять, ход ваших мыслей)
@awakeupcall5336
@awakeupcall5336 Год назад
@@it-sin9k ход моих мыслей - полный хаос с этой меморизацией в голове, вроде много лет продакшн опыта, но никто в командах никогда не уделял этому такое внимание и писали почти везде useCallbak на каждый хендлер. Но тут возможно имеет место быть и атомарность данного компонента, так что тут useCallback бессмысленен, button не может обновиться без обновления внешнего Button по идее
@it-sin9k
@it-sin9k Год назад
@@awakeupcall5336 "тут useCallback бессмысленен, button не может обновиться без обновления внешнего Button по идее" (с) А даже если компонент обновится по другой причине и onClick создастся заново. Какой вред это причин по вашей версии?
@user-fo8zl6iw9u
@user-fo8zl6iw9u 10 месяцев назад
Чем больше таких видео про "тонкости" работы хуков, тем больше понимания, какое же это говно. Ребята из команды реакта хотели упростить работу с компонентами и состоянием, но в итоге все эти правила и рекомендации работы с хуками вносят больше непонимания, вреда и сложности.
@user-nd5zd5kc5k
@user-nd5zd5kc5k Год назад
Есть вопрос. Я не понимаю, что значит не происходит повторных рендеров? Вот функция с компонентом ведь отработает в любом случае, если в родителе изменились state?
@user-nd5zd5kc5k
@user-nd5zd5kc5k Год назад
Если я правильно понимаю, то есть смысл использовать useCallback только в 2 ситуациях, если у нас мемоизирован компонент, либо если функция в зависимостях у useEffect или типа того
@it-sin9k
@it-sin9k Год назад
@@user-nd5zd5kc5k Абсолютно верно :)
@ilikecola378
@ilikecola378 2 года назад
Спасибо за труды! Я так понял если не указывать deps, то useCallback будет рендериться каждый раз и толка от нее не будет, т.е. указывать deps обязательно, даже если это просто [] который будет создавать callback только в момент монтирования. Поправьте если я не прав
@it-sin9k
@it-sin9k 2 года назад
Да, вы абсолютно правы)
@testwebdevelopment4287
@testwebdevelopment4287 2 года назад
привет! хороший контент. как для вас удобнее отправлять чашку кофе, на патреоне или как спонсор в ютубе? Ваши видео стоят того. Возможно и я смогу вам чем-то помочь кроме спонсорства :)
@it-sin9k
@it-sin9k 2 года назад
Честно говоря мы еще сами не разобрались, что лучше подписка на патреон или спонсорство на youtube) поэтому где вам удобнее) А по поводу последнего предложения, мы рады любой помощи) Поэтому напишите на почту blue.sin9k@gmail.com, а там обсудим)
@TheGuck111
@TheGuck111 3 года назад
инфа супер!
@it-sin9k
@it-sin9k 3 года назад
все для вас)
@sergiogusto
@sergiogusto 2 года назад
8:34 А что на счет функции высшего порядка в данном случае? А вообще, красавчик. Очень хороший разбор
@it-sin9k
@it-sin9k 2 года назад
Спасибо :) не уловил суть вопроса про функцию высшего порядка
@sergiogusto
@sergiogusto 2 года назад
​@@it-sin9k вместо юсКолбэк можно использовать функцию высшего порядка и в первом аргументе получаем результат функции вызванной в мапере на обработчик онКарКлик={функция(car)}. Не могу написать код, потому что ютюб его удаляет (((
@sergiogusto
@sergiogusto 2 года назад
@@it-sin9k надеюсь доступно объяснил
@it-sin9k
@it-sin9k 2 года назад
@@sergiogusto Так функция высшего порядка вернет всегда новую ссылку в onCarClick. Что ломает memo. А useCallback занимается именно кешированием старой функции
@krystynakoryagina356
@krystynakoryagina356 Год назад
Получается, если мы передаем функцию someFunc как пропс, а в дочернем компоненте создаем функцию Func, которая будет вызывать someFunc -> в этом случае в useCallback можно не оборачивать someFunc?
@it-sin9k
@it-sin9k Год назад
Если вы используете React.memo() то лучше использовать useCallback
@krystynakoryagina356
@krystynakoryagina356 Год назад
Спасибо ❤
@user-xq9jm8pe5l
@user-xq9jm8pe5l 3 года назад
кто поставил дизлайк??? школа программирование?)))
@it-sin9k
@it-sin9k 3 года назад
ахахах) хороший вопрос)
@tutnichegonet
@tutnichegonet 3 года назад
это лайк из Австралии
@user-hq8wt2pc5w
@user-hq8wt2pc5w 3 года назад
1:17 - 9 строка - this лишнее.
@it-sin9k
@it-sin9k 3 года назад
Да, все верно. К сожалению не заметили эту проблему перед публикацией видео :(
@trueman8413
@trueman8413 2 года назад
Привет! Немного не понял момент с собственным написанием useCallback. Вначале ставишь условие, что при отсутствии массива зависимостей (в prevState или переданный ) приравнять оба поля и вернуть коллбек, но точно такие же действия ставишь и в конце ф-ии, в чем заключается смысл, можно ведь просто убрать начальное условие и оставить условие с сверкой массива зависимостей?
@it-sin9k
@it-sin9k 2 года назад
Пришлось даже пересмотреть все видео, чтобы понять вопрос) На будущее бросайте тайм код, чтобы не искать)) А так ваши рассуждения абсолютно верные. По идее можно было бы просто сравнить на shallowEqual() и все тут. Почему же я поступил иначе. Я не выдумал этот код, я лишь упростил реальные исходники useCallback. Поэтому вышло немного не очевидно. Но как вы понимаете не в этом суть видео :)
@trueman8413
@trueman8413 2 года назад
@@it-sin9k да, точно, извини, что без таймкода 😄
@MrKu39
@MrKu39 Год назад
Вы в корне не правы и вводите в заблуждение ! Без React.memo в дочернем компоненте не имеет смысла оборачивать функцию , переданную в пропсах ,в useCallback! Так как при перерендере родителя ВСЕГДА запускается перерендер дочерних компонентов. Хоть бы написали верно на Хабре или закрепили здесь под видео.
@isaabazov3700
@isaabazov3700 9 месяцев назад
А без React.memo имеет смысл юзать useCallback??? Нет... верно?
@it-sin9k
@it-sin9k 9 месяцев назад
да, не имеет смысла. Я не указал React.memo по ошибке в примере
@kostyakozlov5289
@kostyakozlov5289 2 года назад
Вопрос - Можно ли в данном случае onClick вынести за пределы компонента? Или это ошибочно с архитектурной точки зрения
@it-sin9k
@it-sin9k 2 года назад
В данной реализации не очень эффективно выносить вверх. Так во всем компоненты мы передаем одну и ту же ссылку на функцию. И благодаря этому React.memo, помогает нам предотвращать рендеры. А если вынесем на уровень map создание функции, то всегда будет новая ссылка на функцию и тогда React.memo не будет никогда работать
@artemii9960
@artemii9960 2 года назад
Спасибо большое за крутой контент! Есть один вопрос по поводу ответа на 3:41: разве ф-я "someFunction" не будет создаваться реже в случае useCallback? К примеру если у нас компонент Test отрисовывается в родителе Parent и причиной отрисовки Parent является не смена "title", а что-то другое - то компонент Test все равно будет перерисовываться. А в случае useCallback ф-я "someFunction" будет создаваться только когда меняется "title". Это если бы у нас ф-я Test была обернута в React.memo - тогда да, отвел был бы "ни в каком". Но да, цена использования useCallback в этом случае намного дороже нежели цена создания ф-ии "someFunction". UPD: и также на 8:35 все компоненты Car будут перерисовываться если компонент Cars будет перерисовываться (потому что Car не обернут в React.memo), хоть и ф-я "onCarClick" обернута в useCallback.
@it-sin9k
@it-sin9k 2 года назад
нет, не будет. функция создается всегда. useCallback лишь может принимать решение. Вернуть вам функцию только что созданную или мемоизированную. А история про Test и useMemo это уже другая тема
@artemii9960
@artemii9960 2 года назад
@@it-sin9k А, спасибо, да, это я затупил - ф-я будет создаваться на каждый рендер, а вот ссылка на ф-ю будет меняться реже.
@MrCortc
@MrCortc 2 года назад
Конечно будет! Используйте useCallback и получайте профит!
@it-sin9k
@it-sin9k 2 года назад
@@MrCortc почему будет?
@MrCortc
@MrCortc 2 года назад
@@it-sin9k Хм, я писал подробный комментарий к этому видео, но сейчас его нет. Хочешь сказать youtube удалил? Сохрани в массив все someFunction после объявления и сравни. В обычном случае они всегда разные. В случае использования useCallback только в первый будет отличаться. Видимо реакт создает какую-то заглушку функции.
@romanmed9035
@romanmed9035 2 года назад
все же как-то расплывчато когда использовать юзколлбэк, а когда нет. правильно ли я понял, что полезно только когда многократно используется то что мы в него завернем?
@it-sin9k
@it-sin9k 2 года назад
нет, useCallback нужен, только если вам важно, чтобы получать каждый рендер одну и ту же ссылку в памяти на функцию.А причины могут быть разные, зачем вам это нужно. Самая популярная, если вы передаете эту функцию в компонент обернутый в memo.
@romanmed9035
@romanmed9035 2 года назад
@@it-sin9k спасибо за еще более сложный и неоднозначный ответ. не каждый же раз мы компоненты оборачиваем. а вот юзколлбэки практически везде лепят.
@it-sin9k
@it-sin9k 2 года назад
@@romanmed9035 Вбил в поиск у себя в проекте useCallback, у меня их 7 на весь проект)) Почти не используем)
@romanmed9035
@romanmed9035 2 года назад
@@it-sin9k спасибо. теперь понятно что это специфический зверь и не надо всегда и везде его использовать не подумав.
@it-sin9k
@it-sin9k 2 года назад
Верно) его лучше использовать, когда ты знаешь точно, что без него будет плохо)
@alexr0v
@alexr0v 3 года назад
Ну все, я запутался...
@alexandrchazov6185
@alexandrchazov6185 2 года назад
useCallback
@ivanMoldovanu
@ivanMoldovanu Год назад
Хотел бы спросить: Правильно ли я понимаю - если есть дочерний компонент, ререндеры которого очень дорогостоящие, то, в таком случае, мы оборачиваем функцию, которую передаем в него, в useCallback. Вопрос вот в чем - допустим, в этот дочерний компонент мы передаем 5 функций. Если я не оберну хотя бы одну функцию в useCallback, то обернутые остальные 4 функции не имеют смысла(т к при ререндере родительского компонента, из которого мы эти функции передаем в дочерний, ререндерится эта одна единственная необернутая функция, что заставляет ререндерится дочерний компонент)? Заранее спасибо за ответ!
@it-sin9k
@it-sin9k Год назад
Да, все правильно :) либо можно в React.memo вторым параметром передать функцию сравнения props.
@ivanMoldovanu
@ivanMoldovanu Год назад
@@it-sin9k вы имеете ввиду, что во втором параметре мемо все обрабатывать как обычно, кроме конкретно этой, необернутой функции. Именно ее обработать таким образом, что если меняется ссылка на нее, то все равно не вызывать ререндер?
@it-sin9k
@it-sin9k Год назад
@@ivanMoldovanu есть такая возможность, если вам нужен рендер, только например когда 1 из 5 props иеняется, мы можем написать проверку в react.memo, чтобы только его сравнивать и в таком случае не важно, новая ссылка на функцию пришла или старая
@ivanMoldovanu
@ivanMoldovanu Год назад
@@it-sin9k спасибо!!!
@user-cm9nm5qn6z
@user-cm9nm5qn6z 2 года назад
Скиньте, пожалуйста, ссылку, где разработчики реакт так сказали: И конечно, доверяйте реакту, если они сказали лучше создавать функцию на каждый рендер, так и делайте, ведь они заинтересованы только в улучшении перформанса вашего проекта
@it-sin9k
@it-sin9k 2 года назад
Выбора у нас особо нет. Если используешь хуки, значит создаешь функцию на каждый рендер. Вопрос тогда сводится к следующему: классы или функциональные компоненты? Ответ здесь: ru.reactjs.org/docs/hooks-faq.html#are-hooks-slow-because-of-creating-functions-in-render
@user-cm9nm5qn6z
@user-cm9nm5qn6z 2 года назад
@@it-sin9k спасибо за оперативный ответ) Уточню, а то я немного запуталась. Под "лучше создавать фун-ию на каждый рендер" подразумевается использование хуков? Или речь о том, чтобы не используя хуки, позволить пересоздавать функцию (которую пытаешься передать в колбэк хука)?
@it-sin9k
@it-sin9k 2 года назад
Честно говорю я уже теряю суть вопроса)) В видео я пытался показать, не пишите классовые компоненты, а пишите функциональные компоненты. Но в функциональных компонентах может показаться, излишним создание функции например const onClick = {} на каждый рендер. Так вот это не проблема, просто смириться с этим надо))
@user-cm9nm5qn6z
@user-cm9nm5qn6z 2 года назад
@@it-sin9k Поняла, спасибо!
@_GyG_
@_GyG_ 2 года назад
А мне, кажется, вы не учли тот факт, что мемоизированную функцию нужно передавать именно в Оптимизированный дочерний компонент, и это значит, что в вашем случае компонент внутри должен быть обернут в React.memo, а иначе это не имеет слмысла
@it-sin9k
@it-sin9k 2 года назад
Да, все верно. Я в видео явно не показал, что оборачиваю компонент в React.memo. Но это имелось ввиду, я не помню уже честно говоря, проговаривал ли я словами это
@dmitry9463
@dmitry9463 3 года назад
Интересно, в чем основное отличие между useMemo и useCallback?
@it-sin9k
@it-sin9k 3 года назад
Смотрите дальше) там есть целый ряд видео про исходники этих хуков
@user-ge2qk4cm1j
@user-ge2qk4cm1j 3 года назад
+
@yuragrivicki5272
@yuragrivicki5272 3 года назад
React. useCallback, каждое видео вызывает восхищение, за дизлайк руки оторвать))
@Inkognit123
@Inkognit123 Год назад
useCallback не работает без React.memo
@it-sin9k
@it-sin9k Год назад
верно :)
@Inkognit123
@Inkognit123 Год назад
@@it-sin9k так а почему не сказал об этом в видео?)
@it-sin9k
@it-sin9k Год назад
@@Inkognit123 хз, пропустил просто)) уже порядка 20 комментов под видео на эту тему) но видео поправить уже не получится)
@chikenmacnugget
@chikenmacnugget Год назад
Почему бы просто не вынести функци, которые не нужно пересоздавать за компонент
@it-sin9k
@it-sin9k Год назад
в функциях, чаще всего используются props, т.е. нужно замыкание делать
@chikenmacnugget
@chikenmacnugget Год назад
@@it-sin9k так и в чем проблема?
@it-sin9k
@it-sin9k Год назад
если вынести onClick например из самого компонента, то как потом получить доступ к props?
@chikenmacnugget
@chikenmacnugget Год назад
@@it-sin9k передать в качестве аргументов в функцию, которая вернет уже функцию для он клика. Зачем каждый рендер пересоздавать одни и теже функции и окружения, если их можно создать один раз?
@user-fo8zl6iw9u
@user-fo8zl6iw9u 10 месяцев назад
Какое-то странное объяснение работы useCallback. Понятно, что мемоизация не бесплатная, но при некотором большом числе зависимостей становится выгодно мемоизировать функцию. Об этом не было ни слова. Что опять может внести неправильное представление в головы разработчикам. Так сказать, другая крайность.
@it-sin9k
@it-sin9k 10 месяцев назад
А какая разница сколько зависимостей у useCallback? на результат это вроде как не влияет
@user-fo8zl6iw9u
@user-fo8zl6iw9u 10 месяцев назад
@@it-sin9k я про те зависимости, которые идут вторым аргументом (deps). И чем реже меняются эти зависимости, тем больше попаданий в кэш. Соответственно выгодней использовать useCallback.
Далее
Все ли вы знаете о React key?
8:47
Просмотров 37 тыс.
C’est qui le plus fort 😂
00:18
Просмотров 11 млн
Reforged | Update 0.30.0 Trailer | Standoff 2
02:05
Просмотров 410 тыс.
Полный курс по useId за 10 минут!
13:01
Голливудский конвейер звёзд
29:20