Size: a a a

React — русскоговорящее сообщество

2021 March 05

AG

Adel Gilyazeev in React — русскоговорящее сообщество
Yarik Pesochenski
На официальном сайте реакта есть туториал
Там про то как пользоваться им, и как писать свои хуки и концепция хуков, а мне именно как устроены сам виртуальный дом, как устроена useState... В том видео показывали как примерно устроен этот хук, поэтапно начиная с того что хотим получить и как мы это примерно получаем
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
А ещё у меня трабл, страничка бесконечно жрёт память и падает, успевая лишь один рендер сделать
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
Весь день потратил на нахождение проблемы... Она появилась когда я к данным регулярное выражение как фильтрацию прикреплял и изменял его через другой компонент
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
При этом если компонент с отображением данных не рендерить, то всё норм
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
Может ли быть циклическая зависимость? Типа эффект один меняет Стейт номер два, а из за изменения второго стейта вызывается эффект номер два который меняет первый Стейт из за изменения которого срабатывает первый эффект... Разве между ними не должен происходить рендер? Разве изменение стейтов не отложенные операции?
И ведь трабл в том что профилировщики всякие не запустишь с такой проблемой
источник

JT

John Travolta in React — русскоговорящее сообщество
ну ты создал вечный цикл, судя по тому, что описал
источник

SB

Sergey Bekharsky in React — русскоговорящее сообщество
Adel Gilyazeev
Может ли быть циклическая зависимость? Типа эффект один меняет Стейт номер два, а из за изменения второго стейта вызывается эффект номер два который меняет первый Стейт из за изменения которого срабатывает первый эффект... Разве между ними не должен происходить рендер? Разве изменение стейтов не отложенные операции?
И ведь трабл в том что профилировщики всякие не запустишь с такой проблемой
может
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
John Travolta
ну ты создал вечный цикл, судя по тому, что описал
Ну я подозреваю что там что-то такое есть, но это не точно, ибо там такого не должно быть, отображающий данные компонент, никак не меняет свои пропсы, и не вызывает их... Но если его рендерить то всё плохо, а если не рендерить (закоментить) то всё норм, фильтры работают, регулярка меняется, ничего не зависает и память не выжирает
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
Данные фильтруются но не уходят на рендер
источник

JT

John Travolta in React — русскоговорящее сообщество
setState работает асинхронно, подозреваю, что из-за твоего вечного цикла забивается стек браузера
источник

JT

John Travolta in React — русскоговорящее сообщество
и память выжирается, потом все падает
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
Но useEffect вызывается же только после рендера, и при монтировании/размонтировании...
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
John Travolta
setState работает асинхронно, подозреваю, что из-за твоего вечного цикла забивается стек браузера
Вот именно что асинхронно и он сам по себе не вызывает эффект, он откладывает изменение стейтов до конца рендера, и после рендера уже эффекты проверяют изменились ли зависимости и исполняется если они изменились и опять же изменение стейтов должны откладываться на след рендер
источник

SB

Sergey Bekharsky in React — русскоговорящее сообщество
Adel Gilyazeev
Но useEffect вызывается же только после рендера, и при монтировании/размонтировании...
https://overreacted.io/a-complete-guide-to-useeffect/

где-то есть перевод на русский. читать там минут 40.
источник

SB

Sergey Bekharsky in React — русскоговорящее сообщество
добро пожаловать в мир хуков и мемо
источник

JT

John Travolta in React — русскоговорящее сообщество
Adel Gilyazeev
Но useEffect вызывается же только после рендера, и при монтировании/размонтировании...
Если нужно вызвать хук эффекта только один раз, то надо передать вторым параметром пустой массив, если я правильно понял вопрос

useEffect(() => {
console.log('useEffect');
}, []);
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
У меня как минимум должны были бы хоть как-то данные отрендериться и показаться, а в итоге только кадр с пустыми данным и всё..
источник

JT

John Travolta in React — русскоговорящее сообщество
Adel Gilyazeev
Вот именно что асинхронно и он сам по себе не вызывает эффект, он откладывает изменение стейтов до конца рендера, и после рендера уже эффекты проверяют изменились ли зависимости и исполняется если они изменились и опять же изменение стейтов должны откладываться на след рендер
так изменение стейта тоже вызывает ререндер компонента, а у тебя они циклические
источник

AG

Adel Gilyazeev in React — русскоговорящее сообщество
John Travolta
так изменение стейта тоже вызывает ререндер компонента, а у тебя они циклические
Мгновенное?
источник

JT

John Travolta in React — русскоговорящее сообщество
Adel Gilyazeev
Мгновенное?
нет, не прям мгновенное
в доке даже написано, что если после setState() сделать еще что-то, то реакт не гарантирует, что оно выполнится после или до изменения стейта, т.к. функция setState подготавливает данные перед их изменением и там есть задержка в миллисекундах
источник