Я провел два часа, читая SO и другие статьи, и у меня все еще есть вопросы.Я хотел бы лучше понять вещи и заверить их в правильности моего понимания.
Все началось с изучения хуков и размышлений о разнице между useEffect
и useLayoutEffect
.Я узнал, что useEffect
следует использовать, когда то, что не влияет на то, что показано пользователю (некоторая фоновая работа), и useLayoutEffect
запускается «синхронно перед рисованием» - так, например, его следует использовать, когда яхотите показать список на экране и данные для него извлекаются из другого места.Таким образом, если я получу данные в useLayoutEffect
, он сначала получит данные, и только после этого состояния обновления, и покажет экран с этими данными пользователю.Если бы я использовал useEffect
, он сначала показал бы пользователю пустой список (потому что он асинхронный и не останавливал рисование), а затем перекрасил его после получения данных.Смущает то, что в нем говорится, что useLayoutEffect
, так же как и useEffect
, вызывается после завершения рендеринга.Я объясняю, почему это не имеет никакого смысла для меня в последнем абзаце.
Еще одна запутанная вещь заключается в том, что в нем говорится, что useEffect
следует использовать в том же месте, где методы cDM
или cDU
называются.Но я получаю данные в методе cDM
с тех пор, как начал использовать реакцию.Значит ли это, что я все время делал неправильно?Потому что я должен был сделать это там, где уволен useLayoutEffect
.И это подводит меня к следующему абзацу.
Самая запутанная вещь - связь между рендерингом, рисованием и cDM
методом.Он говорит, что cDM
вызывается после окончания рендеринга.В нем также говорится, что «рендеринг завершен» означает, что DOM, макет, размеры, стили - все рассчитано и готово для рисования браузером.Я понимаю это таким образом, что на данный момент нет смысла делать что-либо, что изменило бы то, что показано пользователю - потому что все это уже рассчитано!Разве не должно быть хука, который вызывается перед рендерингом?Например, я вызываю этот хук, чтобы получить данные для некоторого списка, который отображается на экране.Только после того, как данные извлечены, рендеринг должен произойти, потому что теперь ответ знает, сколько элементов в списке и сколько места он займет и так далее.Я имею в виду, какой смысл делать рендеринг, прежде чем вы узнаете все свои данные?Не заставляет ли реакция пересчитать все после получения данных?
Я действительно надеюсь, что вы поможете мне понять эти вещи.Спасибо.