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

Всем доброго времени суток! Тупой вопрос, наверно, но мб тут есть

какой-то содержательный ответ.

Зачем при мемоизации колбэков через реф делать присваивание значения рефу в useLayoutEffect или useInsertionEffect?
https://github.com/scottrippey/react-use-event-hook/blob/main/src/useEvent.ts

Можно же сделать просто так

function useEvent(callback) {
const latestRef = React.useRef();
const stableRef = React.useRef(null);

if (latestRef.current !== callback) {
latestRef.current = callback;
}

if (!stableRef.current) {
stableRef.current = function () {
return latestRef.current.apply(this, arguments);
};
}

return stableRef.current;
}

Кажется, как будто оборачивание latestRef.current = callback; в use*Effect тут лишняя конструкция, которая ничего важного не делает.

Я что-то упускаю, да? )

17 ответов

14 просмотров

с первого взгляда ощущеие что в https://github.com/scottrippey/react-use-event-hook/blob/main/src/useEvent.ts весь смысл useEvent теряется 🤔 так useInsertionEffect будет на каждый рендер подменять колбек на новый…

Alexandr- Автор вопроса
Ilya Agarkov
с первого взгляда ощущеие что в https://github.com...

Не, там меняется cb в latestRef, а возвращается stableRef.

Alexandr
Не, там меняется cb в latestRef, а возвращается st...

а) ну да… ну тогда в этом есть смысл. У тебя сама ссылка внешняя будет всегда одна, но внутри будет всегда вызываться разная функция

Alexandr- Автор вопроса
Ilya Agarkov
а) ну да… ну тогда в этом есть смысл. У тебя сама ...

Аналогично будет работать и если выкинуть из цепочки use*Effect, вопрос в этом, зачем оно тут )))

Alexandr
Аналогично будет работать и если выкинуть из цепоч...

есть подозрение что есть какие-то edge кейсы, которые не очевидны на первый взгляд… я думаю стоит задать вопрос автору)

а в твоем кейсе есть смыл в проверке? if (latestRef.current !== callback) { latestRef.current = callback; } с чего бы при ререндере колбеку быть не другим? То если в callback пришла мемоизированая функция? Но такой кейс как будто бы бессмысленный (я еще не проснулся - могу тупить)

Alexandr
Аналогично будет работать и если выкинуть из цепоч...

вот этот тест упадет при твоей реализации https://github.com/scottrippey/react-use-event-hook/blob/main/src/useEvent.test.ts#L62 в чем смысл его я не знаю, возможно эта была просто реализация предлагаймого useEvent в самом реакте, и у него было такое поведение

Alexandr- Автор вопроса
Ilya Agarkov
а в твоем кейсе есть смыл в проверке? if (lates...

В кейсе с use*Effect присваивание коллбэка будет происходить только если он поменялся. Добавил сюда такую проверку только, чтобы сохранить это поведение. Сходу не вижу, чтобы тут могли быть какие-то проблемы, если её убрать и прямо в рендере написать latestRef.current = callback;

if (latestRef.current !== callback) { latestRef.current = callback; } === latestRef.current = callback;

Dmitry Remezov
if (latestRef.current !== callback) { latestRe...

вот мне тоже так показалось

Alexandr- Автор вопроса
Dmitry Remezov
if (latestRef.current !== callback) { latestRe...

А, ну да, чёт туплю, получается, что эта проверка вообще ничего не делает по факту XD

Dmitry Remezov
if (latestRef.current !== callback) { latestRe...

if (latestRef.current !== callback) { latestRef.current = callback; } else if (latestRef.current = callback) { latestRef.current = callback } Поправил

Dmitry Remezov
if (latestRef.current !== callback) { latestRe...

В useEvent прикол, что состояния компонента при рендере и триггере события теоретически могут разъехаться (детали не помню, там rfc читать надо) Поэтому колбек синкается в эффекте, чтобы гарантировать единый контекст

Alexandr- Автор вопроса
Dmitry Remezov
В useEvent прикол, что состояния компонента при ре...

мы пока нашли другой ответ) Render methods should be pure, especially when concurrency is used, so we will throw this error if the callback is called while rendering.

Ilya Agarkov
мы пока нашли другой ответ) Render methods shoul...

хотя опять же такое решение не гаратирует ничего) if(notFirstRender) { callback() } 😏

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта