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

»»»»Почему в данном примере если засунуть increment функцию в

setInterval
то внутри increment запускаемый setInterval'ом
всегда имеет изначальное значение
Хотя оно уже должно инкрементиться
Странно очень...

let timer = null;
function Test()
{
const [count, setCount] = useState(0);

console.log('Здесь нормально, выходит 1 =>', count);

function increment()
{
console.log('А вот тут всегда 0 =>'+count);
setCount(count+1);
}

//конструктор, работает только один раз, так как в зависимость поставил нарочно пустой массив, чтоб много раз setInterval не создавать
useEffect(() => {
timer = setInterval(function(){
increment();
}, 1000);
}, []);

return count;
}

ReactDOM.render(
<Test />,
document.getElementById('root')
);

по вчерашнему я нашел ответ
Хотя в офиц доках странно что об этом не предупреждают
Функциональные и классовые компоненты реакта не идентичны
они имеют разницы
и одна большая разница которую я нашел и отняло два дня на понимание
отложенные вызванные функции "захватывают" "запоминают" те старые пропсы и стейты которые он имел на тот момент когда была вызвана отложенное исполнение setTimeout или setInterval

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

вот так.

очень странно конечно что в официальных доках Реакт не предупрждает об этом.
Ответ и разяснение нашел в хабрах

А вы знали об этом ??

13 ответов

13 просмотров

это просто javascript. твое "захватывание" называется замыканием

https://en.reactjs.org/docs/hooks-faq.html#what-can-i-do-if-my-effect-dependencies-change-too-often Тут как раз про setInterval в useEffect

Nurbek-Nurjanov Автор вопроса
no name
https://en.reactjs.org/docs/hooks-faq.html#what-ca...

Привет в документации написано так Пул событий События SyntheticEvent содержатся в пуле. Это означает, что объект SyntheticEvent будет повторно использован, а все его свойства будут очищены после вызова обработчика события. Это необходимо из соображений производительности. Именно поэтому нельзя использовать синтетические события асинхронно Вообще не вкуриваю Что такое пулл что тут пытается сказать документация ?? Может простым крестянским языком обясните ??

Nurbek Nurjanov
Привет в документации написано так Пул событий Со...

типа после выполнения события очистится объект SyntheticEvent и если в асинхронной функции работать с SyntheticEvent то на момент выполнения может быть такое, что event уже будет очищен, например target, может затеряться

Nurbek Nurjanov
спасибо, что то начинаю понимать

и всё это потеряет смысл, когда перейдёшь на react@17

𝖊𝖙𝖍𝖔𝖗𝖟 😈
а что там будет? Не слежу чето)

https://reactjs.org/blog/2020/08/10/react-v17-rc.html#no-event-pooling

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
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
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта