#4: React Hooks — useMemo + React.memo

preview_player
Показать описание

❤️ Поддержка:

Советую сначала посмотреть, как работает useEffect, чтобы понять принцип работы хука useMemo.

📢 О чём я буду рассказывать?

Видео по остальным хукам:

❓ Кому подойдёт этот курс?
Для начинающих, которые только начали изучать ReactJS и для тех, кто изучает более 3-х месяцев.

На каждый хук, есть отдельная ветка в репозитории ниже. Просто кликаете по "Branch" и выбираете нужный хук.

0:00 - Начало
0:39 - Что такое мемоизация?
2:34 - Что такое хук useMemo?
3:42 - Пример приложения с проблемой
7:45 - Решаем проблему с зависанием приложения с помощью useMemo
16:41 - Контролируем сами ререндер компонента с помощью своей проверочной функции
21:10 - Резюмирую

🔗 Следите за обновлениями и информацией в:
Рекомендации по теме
Комментарии
Автор

Что мы можем сказать исходя из этого видео?
То, что Archakov красавчик.

bur
Автор

Изначально поставленная проблема в первом примере - счётчик 1 работает медленно из-за сложных вычеслений счётчика 2. Сразу возникает вопрос а почему вообще рендеры счётчика 1 зависят от счётчика 2. И ответ находится в компоненте App, который почему-то отвечает за то, чтобы хранить состояние счётчиков. А если счётчиков будет 10? Тут сразу должно бросаться в глаза дублирование кода. Чтобы добавить новый счётчик нам надо написать новый вызов useState и скопировать разметку. Здесь это сделано 2 раза, а если счетчиков будет 10, то сделать это надо будет 10 раз. Соответсвенно и проблема здесь не в том, что не используется мемоизация, а в том, что App занимается тем, что он не должен делать. Каждое изменение будет перерендеривать все счетчики, даже когда изменился только один. Если вынести useState и разметку в отдельный компонент скажем CountContainer, который сам будет хранить состояние своего счётчика и передать через пропсы id и isFiveCheckRequired, то проблема медленного счётчика 1 уходит и без мемоизации. Проблема счётчика 2 с медленным вычеслением остаётся, такое решение пока что еще не закроет это. Но здесь у меня уже вопрос по тому, как разделена логика. Я не знаю как вы, но я обычно разделяю компоненты на те, кто отвечает за представление, логику и загрузку данных или любые другие побочные эффекты. Здесь, в компонент, который отвечает за то, чтобы отобразить разметку, почему-то попала какая-то логика. Если еще раз взглянуть, то этот компонент получает пропс, проверяет 5 ли это и отображает разметку в зависимости от условия. Но это уже детали, допустим вместо while здесь какая-то полезная логика, допустим сетевой запрос. Как мемоизция оптимизирует компонент без стейта и с одним пропсом?

Если нам нужна мемоизация для того, чтобы оптимизировать другой компонент, который не является самим компонентом или дочерним компонентом, то проблема не в отсуствии мемоизации, а в неправильном разделении логики. Если представить, что вместо while выполняется какая-то логика и она действительно занимает скажем секунду, то в таком случае мы можем только показать красивый лоудер, что происходит вычисление или ожидается ответ сервера. И если это логика зависит от value, то это будет useEffect с зависимостью value, а не useMemo. useMemo в этом примере вообще бесполезен. Он нужен только тогда, если вам нужно оптимизировать рендеры дочерних компонентов, при передачи результатов через пропсы, либо оптимизировать вычисления самого компонента в случае, если он имеет несколько причин, по которым может быть рендер. Пример из реакт документации - у нас есть три пропса, один из них задаёт тему компонента, два других учавствую в каком-то вычислении. В таком случае мы можем обернуть в useMemo эту функцию вычеслений с зависимостью этих двух пропсов и в таком случае, если мы снаружи поменяем тему, то вычесление не будет произведено, а мы просто отобразим значение из кеша с новой темой.

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

Alequez
Автор

Шикарное объяснение, большое вам спасибо

lalathealter
Автор

Этот канал- находка для меня! Спасибо за труды🤗

botino-k
Автор

Настолько понятно объяснить нужно иметь талант. Спасибо!!

qjvtfyg
Автор

Чисто человеческое Спасибо тебе, настолько прекрасно объяснил всё прям по полочкам разложил, по сути все делают такие видео, но настолько глубоко и в чистом виде не делает ни кто, так что Удачи тебе и Рад всем твоим новым подачам

kerimkerimli
Автор

Оромное спасибо!, подача информации настолько понятная и прозрачна, с актуальными и граматными примерами!, Респект!

iliyabrook
Автор

спасибо большое за материал!!! все доходчиво и наглядно объяснил.

duce
Автор

Очень понятно и доступно объяснили! Перешел на выше видео, так как у другого блогера вообще не понял что к чему и куда, с вашей помощью все встало на полочки

bugaga
Автор

Я ждал продолжение реакт хуков уже 10000 лет!

elzaizrivii
Автор

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

dmitrykarpovich
Автор

Я дождался! Спасибо! Жду про юз колбэк)

andrTaylor
Автор

Шикарно объяснил! Кратко, наглядно. Лайк

rwrybdl
Автор

спасибо! писал в телеге и пповтрю тут - по части хуков у тебя самые толковые видео в русском тытубе

devorer
Автор

Блин, как же понятно, Антон, спасибо тебе огромнейшееееее!!!

gritsienkooleg
Автор

Лайки не забываем ставить, отличные видео! все четко и понятно.

ivanegorov
Автор

Прекрасное объяснение!!! Благодарствую!!

murcha
Автор

Еще один божественный лайк божественному видео

vitaliyyasinskiy
Автор

О, огонь, лайк вперёд! З наступающим!

oleksiik
Автор

Спасибо, это было реально очень полезно.

EvgenyT