React: рдХреНрдпрд╛ рдЕрд╕рддрдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рд░рд╛рдЬреНрдп рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рдлрд╛рдИ рдЪрд▓ рд╕рдХрддреА рд╣реИ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 5 рдорд╛рд░реНрдЪ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдпрд╣ рдмрдЧ рдХрд╛рдлреА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ:

https://twitter.com/kentcdodds/status/1102659818660102145

рдореИрдВ рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fn рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╕реВрдЪрд┐рдд setInterval(fn, 0) рдХреЗ рд╕рд╛рдордиреЗ рдЫрд▓рд╛рдВрдЧ [running] рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рд╕рдлрд╛рдИ setRunning(false) ред рддреЛ рдЕрдВрддрд░рд╛рд▓ рдЕрднреА рднреА рдЖрдЧ рд▓рдЧрддреА рд╣реИ, setLapse(0) рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░ рд░рд╣реА рд╣реИ рдЬреЛ рдШрдЯрдирд╛ рдХреЗ рджреМрд░рд╛рди setLapse(someValue) ред

рдпрд╣ рдореБрдЭреЗ https://github.com/facebook/react/issues/14750#issuecomment -рекремрежрекрежрепремрежреп, рдпрд╛ рдЗрд╕рдХреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд┐рдпрдорд┐рдд рд░рд┐рдПрдХреНрдЯ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ (рдФрд░ рдЕрдиреНрдп "рдЕрд╕рддрдд" рдШрдЯрдирд╛рдУрдВ) рдХреЗ рд▓рд┐рдП рднреА рдореМрдЬреВрдж рд╣реИред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЕрд╕рддрдд рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рджреВрд░ рдХрд░ рджреЗрдВред

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд┐рдХ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рднрд╛рд╡ рдлрд╝реНрд▓рд┐рдк рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВред рддреЛ рдХреНрдпрд╛ setState рдПрдХ рдЕрд╕рддрдд рдШрдЯрдирд╛ рдХреЗ рдЕрдВрджрд░ рднреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рдкреНрд░рднрд╛рд╡ рдХреЛ рдлреНрд▓рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рд▓рдЧрддрд╛ рд╣реИ рдирд╣реАрдВред (рдЗрд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рджреЗрд░реА рдХрд░рдиреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред)

рддреЛ рдпрд╣ рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╕рдордп рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд┐рдХреНрд╕ рд╕рд┐рд░реНрдл useLayoutEffect рд╣реИ? рдпрд╛ рдЖрд░рдПрдПрдл рд╕рдорд╛рдзрд╛рди?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдорд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реБрдХрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд░реАрд╕реЗрдЯ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрд░реНрдерд╛рдд рдкреНрд░рднрд╛рд╡ рдореЗрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдлреНрд░реЗрдо рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ, рддреЛ рдЬрдм рдЖрдк рдЪрд▓ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣ рдПрдХ рд░реЗрдбреНрдпреВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд░реЗрдбреНрдпреВрд╕рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдбреЗрдЯ рдХреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реБрдХреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рднреА рдХрд░рддрд╛ рд╣реИред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдорд░ рд╕реНрд╡рдпрдВ рдПрдХ рдЕрд▓рдЧ рдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИред рдЕрд╕рддрдд рдШрдЯрдирд╛рдУрдВ рдХреА рдЧрд╛рд░рдВрдЯреА рдХреЗрд╡рд▓ рдЕрдиреНрдп рдЕрд╕рддрдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджреА рдЬрд╛рддреА рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдпрд╣рд╛рдВ рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЯрд╛рдЗрдорд░ рдХреЛ рд░реЛрдХрдирд╛ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рд╕реЗрдЯ рд╕реНрдЯреЗрдЯреНрд╕ рдПрд╕рд┐рдВрдХреНрд╕ рд╣реИрдВред рддреЛ рдлреНрд▓рд╢ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдФрд░ рдЖ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ useLayoutEffect рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╡рд░реНрддреА рдореЛрдб рдореЗрдВ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рдВрдХ рдореЛрдб рдореЗрдВ рднреА рд╕реНрдХреЗрдЪреА рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ рдЯрд╛рдЗрдорд░ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдлрд╝реЛрдХрд╕ рдИрд╡реЗрдВрдЯ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝реНрд▓рд╢ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмреИрдЪ рдХреЗ рднреАрддрд░ рдЖрдЧ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

setRunning(false); // I would like to add a stop of this timer to the queue to be performed later
setLapse(0); // I would like to add an operation to set lapse to zero later
// lots of random stuff that can happen before the batch flushes
// This might also queue an operation to set lapse to something else
// actual rendering
// If concurrent mode, lots of other random stuff that can happen while rendering
// This might also queue an operation to set lapse to something else
// Actually do all that work in order

рдпрд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдХрд┐ рдХрддрд╛рд░ рдореЗрдВ рдХрд┐рд╕ рдХреНрд░рдо рдХреА рдЪреАрдЬреЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВред

рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╣ рд╣реИ рдХрд┐ рдЯрд╛рдЗрдорд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░реБрдХрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд░реАрд╕реЗрдЯ рдХреЛ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЕрд░реНрдерд╛рдд рдкреНрд░рднрд╛рд╡ рдореЗрдВред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдлреНрд░реЗрдо рдореЗрдВ рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ, рддреЛ рдЬрдм рдЖрдк рдЪрд▓ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрд╣ рдПрдХ рд░реЗрдбреНрдпреВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд░реЗрдбреНрдпреВрд╕рд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдбреЗрдЯ рдХреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реБрдХреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рднреА рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрдм рд╕рдордЭ рдЖрдпрд╛ред рдзрдиреНрдпрд╡рд╛рджред

https://mobile.twitter.com/dan_abramov/status/1104069236132057089
https://codesandbox.io/s/23m1659rlp

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

UnbearableBear picture UnbearableBear  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jvorcak picture jvorcak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

trusktr picture trusktr  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

framerate picture framerate  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmullo picture jmullo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ