Size: a a a

JavaScript.Ninja

2021 November 29

VK

Vladimir Klimov in JavaScript.Ninja
Не уверен про обновление состояния именно в useLayoutEffect, речь может быть о чем угодно, что вызовет новый ререндер
источник

МУ

Максим Усачёв... in JavaScript.Ninja
Ясно. Но тогда вопрос:


React update 1: render virtual DOM, schedule effects, update DOM
Call useLayoutEffect
Update state, schedule re-render
Call useEffect
React update 2
Call useLayoutEffect from update 2
React releases control, browser paints the new DOM
Call useEffect from update 2

Тут ясно, что на 4м шаге сработал useEffect (всё теперь логично, как опсудили выше, ведь в useLayoutEffect обновилось состояние, и вызвался новый ререндер). Потом тоже ок, произошёл ререндер. Но почему тогда снова вызывается useLayoutEffect? Ведь до этого и useLayoutEffect и useEffect уже отработали?
источник

VK

Vladimir Klimov in JavaScript.Ninja
Потому, что там есть reactUpdate1, reactupdate2
Все эффекты вызываются каждый ререндер, если обновились зависимости
источник

МУ

Максим Усачёв... in JavaScript.Ninja
аа, то есть в данном примере имеется ввиду, что обновились зависимости, которые находятся, к примеру, в массиве зависимостей useEffect, поэтому он снова сработал. да?
источник

VK

Vladimir Klimov in JavaScript.Ninja
Речь идет же не о конкретном коде
А о фазах и порядке, в котором выполняются разные хуки в разных ситуациях
источник

МУ

Максим Усачёв... in JavaScript.Ninja
да, но ведь в useLayoutEffect обновляется состояние, а значит при повторной фазе запуска этого самого useLayoutEffect снова будет обновление состояния, и снова ререндер? Бесконечный
источник

VK

Vladimir Klimov in JavaScript.Ninja
У вас есть конкретный код, о котором вы говорите?
источник

МУ

Максим Усачёв... in JavaScript.Ninja
увы( я же просто привожу примеры из статьи( Но там приводится некий код, но я не знаю, подходит ли он для нашего случая https://codesandbox.io/s/infallible-wildflower-127lv?file=/src/App.js?
источник

VK

Vladimir Klimov in JavaScript.Ninja
Еще раз: статья объясняет тонкости работы хуков без привязки к каким-то конкретным стуациям
источник

МУ

Максим Усачёв... in JavaScript.Ninja
ага, ясно, но просто логично же, что если снова вызовется useLayoutEffect, в который вызывает ререндер (он же и вызвал его в первом цикле), то по идее будет бесконечные рендеры?
источник

МУ

Максим Усачёв... in JavaScript.Ninja
Поэтому мне и кажется странным логиака выполнения
источник

VK

Vladimir Klimov in JavaScript.Ninja
Кто сказал, что ререндер был вызван useLayoutEffect?)
Я статью не читал, может там это сказано, конечно
Кто сказал, что в эффекте не стоит условие, которое запускает ререндер только в определенных случаях?)
источник

МУ

Максим Усачёв... in JavaScript.Ninja
Понял, думаю… ))
источник

VK

Vladimir Klimov in JavaScript.Ninja
Речь вообще сейчас не идет о лоогике, которая лежит внутри эффектов
источник

VK

Vladimir Klimov in JavaScript.Ninja
Речь только о том, когда и что реакт будет вызывать
источник

МУ

Максим Усачёв... in JavaScript.Ninja
Аа, я вот почему так подумал:

```
React update 1: render virtual DOM, schedule effects, update DOM
Call useLayoutEffect
Update state, schedule re-render
Call useEffect
React update 2
Call useLayoutEffect from update 2
React releases control, browser paints the new DOM
Call useEffect from update 2

```

Поскольку тут после первого Call useLayoutEffect произошло обновление состояния и ререндер, то я и подумал, что, значит, Call useLayoutEffect в данном случае что-то внутри делает, что делает ререндер)
источник

МУ

Максим Усачёв... in JavaScript.Ninja
Ну да, то есть тут просто показывается последовательность)
источник

VK

Vladimir Klimov in JavaScript.Ninja
Но почему в этот момент не мог обновиться родитель, к примеру? Короче, это не так важно, кто вызвал ререндер
источник

МУ

Максим Усачёв... in JavaScript.Ninja
ага, точно, думаю… )
источник

МУ

Максим Усачёв... in JavaScript.Ninja
Тут важно понимать, что useEffect гарантировано будут соблюдать порядок своих вызовов, которые происходят чётко перед каждым ререндером, к примру, Но либо после отрисовки, если всё идёт «как обычно»
источник