169 похожих чатов

Всем привет. Второй день плотно пытаюсь понять смысл useCallback и

не понимаю. useMemo - понимаю, useCallback - нет. Закешировать значение функции для последующей быстрой выдачи, если аргументы не изменялись - понятно, а закешировать функцию-коллбек... извиняюсь, зачем? Во всякой доке пишут, чтобы ссылка на функцию не менялась, если не изменялось ничего из массива, что во втором аргументе. А зачем надо, чтобы ссылка на функцию не менялась, чтобы что? А если она изменится, что плохого произойдет?

На скриншоте код, скопированный мною из одного примера. Там два инпута, в первом из них значение переменной событием onChange устанавливается через useCallback, во втором - напрямую. Никакой разницы в работе двух этих инпутов нет от слова "вообще". Введенное значение одинаково бодренько отображается в <p> и в том, и в другом случае.
Если кому не лень пофилософствовать, помогите понять, плиз!

17 ответов

14 просмотров

Чтобы не ререндерился какой-нибудь memo компонент, как вариант Либо если этот коллбэк - зависимость в юзэффекте каком-нибудь

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

Vladimir-Samoilenko Автор вопроса
Vetro
Чтобы не ререндерился какой-нибудь memo компонент,...

В смысле, если я пульну значение напрямую, то ререндериться будет все?

Vladimir-Samoilenko Автор вопроса
Nikolay Tolochnyy
"А зачем надо, чтобы ссылка на функцию не менялась...

Ты про то, что при каждом новом рендере обработчики событий будут новыми функциями?

Vladimir Samoilenko
В смысле, если я пульну значение напрямую, то рере...

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

Vladimir-Samoilenko Автор вопроса
Nikolay Tolochnyy
по идеи да, новые ссылки будут

ну как бы и ладно, что плохого? Мусор в памяти?

Vladimir Samoilenko
ну как бы и ладно, что плохого? Мусор в памяти?

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

Vladimir-Samoilenko Автор вопроса
Nikolay Tolochnyy
ну если брать сообщение выше, то будет каждый раз ...

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

Vladimir Samoilenko
то есть, получается, что все обработчики ченджей, ...

Да, это первая мысль, которая возникает, но на это обычно следующие ответы - 1) не стоит заниматься преждевременной оптимизацией 2) Реально это стоит делать, когда ты точно знаешь, что нижелещащий компонент мемоизирован, например

Vladimir-Samoilenko Автор вопроса
Danila
Да, это первая мысль, которая возникает, но на это...

а как можно мемоизировать целый компонент?

Vladimir-Samoilenko Автор вопроса
Danila
React.memo(component)

а, это что-то устаревшее классовое?

Vladimir-Samoilenko Автор вопроса
Danila
Неть

ок, значит, надо почитать.

Danila
Неть

ну есть же примерно React.PureComponent

Nikolay Tolochnyy
ну есть же примерно React.PureComponent

Нууу, это как раз для классовых

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта