Size: a a a

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

2021 January 20

PF

Petr Filippov in React — русскоговорящее сообщество
Т Т
То есть не обязательно после завершения функции?
асинхронность ты не можешь предугадать в какой конкретно момент оно сработает, просто после какого то момента
источник

AL

Alexey Loi in React — русскоговорящее сообщество
Представь что каждый setState это как ты добавляешь что-то в очередь
источник

AL

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

ТТ

Т Т in React — русскоговорящее сообщество
Alexey Loi
Обязательно, ререндер не произойдет пока функция не отработает.
Имел ввиду что обязательно после функции, но не обязательно сразу после функции
источник

AL

Alexey Loi in React — русскоговорящее сообщество
Т Т
Имел ввиду что обязательно после функции, но не обязательно сразу после функции
Да
источник

AL

Alexey Loi in React — русскоговорящее сообщество
Именно, советую прочитать как react fiber и reconciler устроен
источник

RS

Roman Still in React — русскоговорящее сообщество
Т Т
Доброго времени суток, помогите пожалуйста разобраться!


Понятно как и при каких случаях происходит повторный рендеринг и как дочерние компоненты реагируют на это... Вопрос в другом! Вопрос: К примеру есть Component, в котором объявлена функция(ниже), которая вызывается снаружи!

 const doFetch = (options = {}) => {
   setOptions(options)
   setIsLoading(true)
 }

Понятно что при вызове этой функции из-за изменения state произойдет повторный рендеринг компонента. Но не понятно когда произойдет повт-ый рен-инг? То есть после завершения функции или при выполнении функции, например - после этого setOptions(options) произойдет повторный рендеринг, а потом после setIsLoading(true), хотя наверное такое не будет, так как после пов-го рен-га функция сама не вызовется! Остаётся думать что - при выполнении функции будет запланировано два рендеринга и после завершения выполнения функции произойдет два пов-ных ренг-га поочередно. Так оно и есть или по-другому? Объясните пожалуйста этот момент
2 рендера родителя и дочерних? или каждого по одному? не совсем понятно из контекста
источник

ТТ

Т Т in React — русскоговорящее сообщество
Roman Still
2 рендера родителя и дочерних? или каждого по одному? не совсем понятно из контекста
Я про сам компонент где функция объявлена
источник

RS

Roman Still in React — русскоговорящее сообщество
Т Т
Я про сам компонент где функция объявлена
не важно количество затронутых стейтов в рамках одного компонента, он их стакнет в 1 рендер
источник

RS

Roman Still in React — русскоговорящее сообщество
Иначе бы все делали объект в useState чтобы сократить количество рендеров, что противоречит самой концепции стейта в FC
источник

ТТ

Т Т in React — русскоговорящее сообщество
Alexey Loi
Именно, советую прочитать как react fiber и reconciler устроен
Спасибо понял)
источник

AL

Alexey Loi in React — русскоговорящее сообщество
Roman Still
не важно количество затронутых стейтов в рамках одного компонента, он их стакнет в 1 рендер
Нэт, если хуки тогда будет два ререндера
источник

AL

Alexey Loi in React — русскоговорящее сообщество
По крайней мере так было год назад, типо это оч плохая практика несколько изменений подряд делать. Но повторюсь это относится только к хукам
источник

ТТ

Т Т in React — русскоговорящее сообщество
Alexey Loi
Именно, советую прочитать как react fiber и reconciler устроен
Спасибо, это понял! Еще один вопрос. Если setState происходит внутри useEffect то сразу происходить рендеринг или так же планируется асинхронно? и самое ключевое что хочу понят - если все таки сразу происходит рендеринг то после рендеринга код продолжает выполняться с оставшегося места?
источник

ТТ

Т Т in React — русскоговорящее сообщество
Alexey Loi
Именно, советую прочитать как react fiber и reconciler устроен
Благодарю за совет! Скорее всего так и сделаю!
источник

PF

Petr Filippov in React — русскоговорящее сообщество
Т Т
Спасибо, это понял! Еще один вопрос. Если setState происходит внутри useEffect то сразу происходить рендеринг или так же планируется асинхронно? и самое ключевое что хочу понят - если все таки сразу происходит рендеринг то после рендеринга код продолжает выполняться с оставшегося места?
сначала отрендериться, потом хук сработает, так же сработает при каждом изменении, одной из зависимостей которые ты указал в массиве.
источник

PF

Petr Filippov in React — русскоговорящее сообщество
setstate асинхронны для оптимизации производительности, там есть свой шедулер, ReactFiberScheduler, он собирает изменения в батчи, создает виртуальную ветку DOM, производит все изменения и применяет диффы к Dom, это сделано так, потому что каждый setState вызывает ререндер, поэтому они складываются в батчи, чтобы лишний раз не рендерить
источник

PF

Petr Filippov in React — русскоговорящее сообщество
немного сумбурно, но надеюсь в общих чертах понятно
источник

PF

Petr Filippov in React — русскоговорящее сообщество
Т Т
Спасибо, это понял! Еще один вопрос. Если setState происходит внутри useEffect то сразу происходить рендеринг или так же планируется асинхронно? и самое ключевое что хочу понят - если все таки сразу происходит рендеринг то после рендеринга код продолжает выполняться с оставшегося места?
пока компонента не демонтируется, стейты сохранятся
источник

ТТ

Т Т in React — русскоговорящее сообщество
Petr Filippov
сначала отрендериться, потом хук сработает, так же сработает при каждом изменении, одной из зависимостей которые ты указал в массиве.
получаться Error в зависимостях нет! Если рассуждать - то когда выполнение дойдет до setError(...) рендеринга не будет и выполнение перейдет к setIsLoading  и тем самым эти два setState React соберет вместе их и в один прекрасный момет их подряд выполняет? Грубо говоря
источник