Учимся использовать useMemo, useCallback и React.memo | подводные камни | JavaScript, React

Учимся использовать useMemo, useCallback и React.memo | подводные камни | JavaScript, React

24,361 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

Владимир
Владимир - 30.10.2022 17:29

Крутая тема, крутое видео!
Хуки и реакт вообще больная тема для меня, слишком много ошибок в них делают разработчики, причем любого уровня.
Есть еще проблема про меморизацию компонента с children, про это многие забывают. Если передать обычный jsx в children компонента обернутого в memo, то на каждый рендер будет вызываться createElement для этого children, а createElement каждый раз создает новый объект, из-за чего меморизация ломается и добавляет лишний вред для производительности вычислениями меморизации. Еще в контекст многие любят передавать объект, ломая перф всего приложения одной строчкой.
Очень круто, что вы поднимаете такие темы.

Ответить
Muslim M
Muslim M - 22.11.2023 02:06

Спасибо Елена, заслуженный лайк и подписка)) просмотрел кучу видео на эту тему, но так доходчиво еще никто не объснял

Ответить
angelic octahedron
angelic octahedron - 17.11.2023 11:46

Если не хотите перерендеривать компонент не имеющих пропсов вообще (или же они не меняются по ходу программы) - вместо memo лучше вытащить в константу:
function FHome() {}
export const FhomeComponent = <Fhome/>;
И соответственно везде использовать {FhomeComponent} вместо <Fhome/>.
useCallback и useMemo можно зачастую тоже избегать, просто вытаскивая объявление функции в родительский компонент. Например, есть Child, который часто перерендеривается:
function Child(props) {
const time = useInterval(100); //типо кастомный хук, из-за которого этот комопент будет перендериваться каждые 100мс.
const heavyResult = useCallback(() => heavyCalc(props.foo), [props.foo]);
}
Вместо useCallback можно разбить его на два компонента:
function Parent(props) {
const heavyResult = heavyCalc(props.foo);
return <Child heavyResult={heavyResult} {...props}>
}

Ответить
The Deadman
The Deadman - 05.11.2023 15:42

Спасибо за видео! Первое видео, в котором наглядно и понятно объяснили в чём разница между useMemo, useCallback и React.memo. Особенно между useMemo, useCallback.

Ответить
Эльнара Гайнанова
Эльнара Гайнанова - 30.10.2023 13:12

Жалко, что нельзя поставить млн лайков ❤

Ответить
Volha Valaskevich
Volha Valaskevich - 30.10.2023 10:06

Спасибо большое!!! Супер!

Ответить
awesome
awesome - 28.10.2023 22:25

Обалденный контент. Спасибо! Жаль раньше вас не нашел

Ответить
Island
Island - 21.10.2023 14:15

Рекурсия - тяжелая функция🤡🤡 завязывай

Ответить
Rasul
Rasul - 18.09.2023 17:40

Спасибо большое, наконец то я понял эти два хука

Ответить
NTH-PROG
NTH-PROG - 05.08.2023 18:16

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

Ответить
Сергей Шевляков
Сергей Шевляков - 05.08.2023 16:56

Лена, спасибо за разбор работы мемоизации! Я благодаря ему смог разобрался в реальном проекте с проблемой переключения двух компонентов в табах. У тебя такой ситуации не показано и поэтому я долго исследовал исходник либы Antd и код кастомных табов, у нас на проекте, и не мог понять, почему useMemo не работало. Я и пропсы в компоненты отключил и в useMemo обернул, но они перерисовываются при каждом переключении табов и все тут. Но они же, и спропсами, в ANT'e прекрасно мемоизировались. Т.е. отрабатывали по первому разу, а потом брались из кэша. А проблема была в том, что эти компоненты заменяли друг друга в ДОМ при каждом переключении кастомных табов, т.к. брались из пропса (но это не важно в целом). И решение здесь только одно - монтировать в ДОМ сразу оба компонента (при этом они инициализируются тоже оба), а потом переключать их табами через смену стилей: display: none/block. И тогда они рендерятся заново только при реальной смене их собственных пропсов. Твой же компонент FactorialCalculation один раз монтируется в шаблоне и по нажатию на кнопку не удаляется, и поэтому useMemo для него работает. Но результат для меня очень радостный по итогу :))

Ответить
Max Shilov
Max Shilov - 28.07.2023 08:25

Очень доходчиво объяснила 🔥
Елена, огромная тебе благодарность 🤟🏻

Ответить
Dev Account
Dev Account - 27.07.2023 20:03

Супер классное понятное объяснение!! Елена спасибо огромное, крутая подача, продолжайте в том же духе 🔥

Ответить
Пожилой Фронтендер
Пожилой Фронтендер - 11.07.2023 00:43

Спасибо Елена, все круто и понятно, мне понравилось, подписка! Успехов и удачи!!)

Ответить
Валерка Ферум
Валерка Ферум - 04.07.2023 02:03

Какая же ты крутая, Лена!

Ответить
Саша Жегулов
Саша Жегулов - 07.06.2023 17:55

Огромное спасибо! Я сидел с этими темами 4 часа.

Ответить
Олег Костиков
Олег Костиков - 03.06.2023 12:30

Спасибо за информацию
Но режет слух слово проПСЫ
Что ещё за псы)
Хотя судя по наличию видео урока про галерею с волками, видимо человек как раз любит псов)
А я говорю прОпсы

Ответить
TERRA TIM
TERRA TIM - 27.05.2023 13:24

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

Ответить
Rama Rama
Rama Rama - 05.05.2023 09:39

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

Ответить
Слава Україні!!
Слава Україні!! - 30.04.2023 13:19

Спасибо за объяснение нюансов, ни у кого такого не слышал. Сам не сильно люблю использовать useMemo, так как сложно понять где он нужен а где нет. Но после видео теперь понял, где его можно юзать и как.

Ответить
Custer Custer
Custer Custer - 28.04.2023 20:55

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

Ответить
Vasily Pavlov
Vasily Pavlov - 24.04.2023 20:29

после слов будем использовать хуки useMemo, useCallback и REACT.MEMO...... REACT.MEMO Карл, реакт мемо - это хук , Карл... захотелось выключить) надеюсь оговорка, щас посмотрим дальше

Ответить
Sharkman
Sharkman - 06.04.2023 20:20

Проходил тестовое и была задачка оптимизировать ререндер в 3 компоненте чтоб при вводе в инпут не происходил ререндер, нужно было обернуть ончейнж в 1 компоненте юзколлбеком и 1 компонент обернуть реакт мемо хоком

Ответить
Vasilika Klimova
Vasilika Klimova - 03.04.2023 01:16

Хороший урок! Очень позитивно и полезно, про злободневные штуки при React разработке.

Ответить
Сергей Шевляков
Сергей Шевляков - 27.03.2023 19:46

Подача, как всегда - волшебно! :)))

Ответить
asatur hakhverdyan
asatur hakhverdyan - 10.03.2023 17:14

накуренная ?😀😀😀😀 класс видео

Ответить
Olesya Pastushenko
Olesya Pastushenko - 07.03.2023 19:41

Как мне не хватало девочек тьюторов! : ***

Ответить
Бесконченость Не придел
Бесконченость Не придел - 02.03.2023 13:18

Спасибо большое Елена, вчера из-за этой оптимизации провалил свой первый собес, а нужно было всего лишь раньше посмотреть ваш ролик и ответить правильно на собеседовании :(

Ответить
SAKO
SAKO - 20.02.2023 14:12

Спасибо за такое видео, я сколько видео посмотрел по useMemo и по useCallback не понял, а тут прям все понятно, и весь ролик я так кайфовал, как будто АСМР смотрю)))

Ответить
Wizard of lightnings
Wizard of lightnings - 11.02.2023 05:48

React Forget - будет настолько крут, что получит возможности, которые есть во Vue2 :)

Документация Vue2

Усилия для оптимизации
В React когда состояние компонента изменяется, оно запускает повторную отрисовку всего поддерева компонента, начиная с себя. Чтобы избежать ненужной повторной отрисовки дочерних компонентов, вам нужно либо использовать PureComponent, либо реализовывать shouldComponentUpdate везде где это возможно. Вам также может потребоваться использовать неизменяемые (immutable) структуры данных, чтобы сделать изменения вашего состояния более удобными к оптимизации. Однако, в некоторых случаях вы не можете рассчитывать на такую оптимизацию, потому что PureComponent/shouldComponentUpdate предполагают, что отображение всего поддерева определяется данными текущего компонента. Если это не так, то такая оптимизация может привести к несогласованному состоянию DOM.

Во Vue зависимости компонента автоматически отслеживаются во время отрисовки, поэтому система точно знает, какие компоненты действительно необходимо повторно отрисовывать при изменении состояния. Каждый компонент можно рассматривать как имеющий shouldComponentUpdate, автоматически реализованный для вас, без ограничений для вложенных компонентов.

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

Ответить
Wizard of lightnings
Wizard of lightnings - 11.02.2023 05:46

Елена, а Вы просто Software Engineer или Mistress Software Engineer? 🙂 (Senior)

Ответить
Ledof
Ledof - 30.01.2023 18:16

Спасибо за разъяснение, помогло!

Ответить
Cats of the world
Cats of the world - 29.01.2023 21:59

Умничка! Спасибо за видео❤

Ответить
Алексей Филиппов
Алексей Филиппов - 28.01.2023 13:33

у сайта loveholidays огромные проблемы с версткой)

Ответить
Артур Цебаев
Артур Цебаев - 12.01.2023 21:29

memo же можно также, как и хуки имортить и писать без React

Ответить
jam jam
jam jam - 21.12.2022 11:39

💥💥💥

Ответить
Сергей Солдатов
Сергей Солдатов - 18.12.2022 13:24

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

Ответить
karoche-tv
karoche-tv - 08.12.2022 01:05

Здрасте, у меня не работает memo в реактнатив. Короче есть Parent.js
внутри есть передающее это состояние в дочерний
function SearcResult (){
const typeState= useState (null);
const root = useRoute()

const {from, destination} = props.params

//props.params приходит из useRoute.

return (
<RoutMap from={from} destination={destination}/>
<UberTypes typeState={typeState}>
)
}

function UberTypes({typeState, }){
//import types from './assets/types.js

const [type,setType]= typeState
const onClick = (){
setType(type)
}
//
return (
<UberTypesRow type={type} onPress={onClick}/>
)
}
Ну здесь я обернул React.memo( RuoteMap.js )потому что он неизменяется просто показывает картка и какую то анимацию после загрузки один раз и просп Стейт нечего не меняет. А тот UberTypes меняет тип при нажатии на на каждый UberTypesRow. Что я не правильно делаю? Но

Ответить
viktor gusev
viktor gusev - 06.12.2022 16:00

Круто, смотрю третье видео перед подготовкой к собесам.
Спасибо )

Ответить
Welleman Grey
Welleman Grey - 29.11.2022 14:06

Я может глупость спрошу, но почему бы не использовать эти хуки для запросов на сервер (fetch, или axios) ? Для некоторых данных не обязательно каждую секунду отправлять запрос на сервер, узнавать как там дела, не изменилось ли что-нибудь. Я к тому, что отправил запрос в бекэнд, получил данные, записал в стейт, и уже с этим стейтом работаешь, не перевызывая запросы на сервер (не говоря уже о том, что от сервера нужно ещё дождаться этих данных). Чем не ресурсоёмкое занимающее время выполнение? Почему для этих нужд не используется useMemo ?

Ответить
Игорь Агаларов
Игорь Агаларов - 20.11.2022 16:30

Пришёл посмотреть МЕМЫ, в итоге изучил хуки)

Ответить
Евгений Нагаев
Евгений Нагаев - 20.11.2022 00:33

Учу реакт, но ещё не дошёл до этих хуков, изучаю useState, useEffect, use Context. Не смотря на это Лена рассказала очень понятно про useMemo, useCallback и reactMemo. Спасибо за ценную информацию)

Ответить
Volselon Games
Volselon Games - 12.11.2022 10:17

Привет, а не подскажешь как правильно именовать css модули при импорте их в jsx:
import вЭтомМестеКакПравильноИменовать from './КакойТоМодуль.module.css';

Ответить
Mukhammad Akilov
Mukhammad Akilov - 11.11.2022 08:51

Спасибо за видео, все круто и информативно! Единственное, в некоторых местах советуют не класть компоненты в служебную папку pages в Next.js)

Ответить
Ravshan Xalimov
Ravshan Xalimov - 07.11.2022 16:38

useMemo - я использовал когда создавал свой кастомный хук связанный с пагинацией (usePagination) т.к. там велись расчёты и возвращались 4 разные значения

Ответить
Владимир Полозов
Владимир Полозов - 04.11.2022 00:35

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

Ответить
Михаил Алексеевич
Михаил Алексеевич - 02.11.2022 22:33

Классно развиваетесь

Ответить
Михаил Алексеевич
Михаил Алексеевич - 02.11.2022 22:32

Что по RoadMap?

Ответить
Albina Dankina
Albina Dankina - 01.11.2022 23:31

Елена, спасибо огромное! Лучшие видео-лекции про веб ❤

Ответить