์ด ๋ฒ๊ทธ๋ ๋งค์ฐ ํผ๋ ์ค๋ฝ์ต๋๋ค.
https://twitter.com/kentcdodds/status/1102659818660102145
setInterval(fn, 0)
์ํด ์์ ๋ fn
์ด setRunning(false)
์ ์ํด ๋ฐ์ํ [running]
ํจ๊ณผ ์ ๋ฆฌ ์์์ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๊ฒฉ์ ์ฌ์ ํ โโ๋ฐ์ํ๊ณ ์ด๋ฒคํธ ์ค์ ๋ฐ์ํ setLapse(0)
๋ฅผ setLapse(someValue)
๋ฎ์ด ์๋๋ค.
์ด๊ฒ์ https://github.com/facebook/react/issues/14750#issuecomment -460409609 ๋๋ ์ ์ด๋ ์ผ๋ถ์ ์ค๋ช ๋ ๋ฌธ์ ๋ฅผ ์๊ธฐ์ํต๋๋ค.
์ค์ ๋ก์ด ๋ฌธ์ ๋ ์ผ๋ฐ React ํค ์ ๋ ฅ (๋ฐ ๊ธฐํ "์ด์ฐ"์ด๋ฒคํธ)์๋ ์กด์ฌํฉ๋๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ถ์ฐ์์ ์ธ ์ฌ๊ฑด์ ์ป๊ธฐ ์ ์ ์๋์ ํจ๊ณผ๋ฅผ ํ๋ฌ์ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์์๋ ํจ๊ณผ๊ฐ ํด๋ฆญ ์ ์ด ์๋๋ผ ํด๋ฆญ setState
๋ ์๋ ํจ๊ณผ๋ฅผ ํ๋ฌ์ํด์ผํฉ๋๊น? ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. (๊ทธ๊ฒ์ ๊ทธ๋ค์ ์ง์ฐ์ํค๋ ๋ชฉ์ ์ ๋ฌด๋ ๋จ๋ฆด ๊ฒ์
๋๋ค.)
๊ทธ๋์ ์ด๊ฒ์ ์ค๊ณ๋๋๋ก ์๋ํ๋ฉฐ ํ์ด๋ฐ์ด ์ค์ ํ ๋ ์์ ์ useLayoutEffect
. ์๋๋ฉด rAF ์๋ฃจ์
?
๋ฌธ์ ๋ ํ์ด๋จธ ์์ฒด๊ฐ ๊ฐ๋ณ ์ด๋ฒคํธ๊ฐ ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ์ด์ฐ ์ด๋ฒคํธ๋ ๋ค๋ฅธ ์ด์ฐ ์ด๋ฒคํธ์ ๊ด๋ จํด์ ๋ง ๋ณด์ฅ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ด ์ฌ๊ธฐ์ ์ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
ํ์ด๋จธ ์ค์ง๋ ๋ชจ๋ ์ค์ ์ํ๊ฐ ๋น๋๊ธฐ์ด๋ฏ๋ก ๋น๋๊ธฐ ์์ ์ ๋๋ค. ๋ฐ๋ผ์ ํ๋ฌ์๋๊ธฐ ์ ์ ๋ค๋ฅธ ๊ฒ์ด ๋ค์ด์ฌ ์ ์์ต๋๋ค.
์ด๊ฒ์ 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
๋๊ธฐ์ด์ ์ถ๊ฐ๋๋ ์์์ ๊ดํ ๊ฒ์ ๋๋ค.
ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ด๋จธ๊ฐ ์ค์ ๋ก ์ค์ง ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ค์ ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ๋์ผํ ํ๋ ์์์ ํญ์ 0์ ํ์ํ๋ ค๋ฉด running์ด false ์ผ ๋ ํญ์ 0์ ํ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฑฐ์ ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ฐ์๊ธฐ๋ก ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ๊ฐ์๊ธฐ๋ ์ค์ง ์ํ๋ผ๊ณ ์๊ฐํ ๋ ์ฝ๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ๊ฑฐ๋ถ ํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก ์ฌ์ค์ ํ๋ ๋ ผ๋ฆฌ๋ฅผ ์ํ ํ ์๋ ์์ต๋๋ค.
์ด์ ์ดํด๊ฐ๋๋ค. ๊ฐ์ฌ.
https://mobile.twitter.com/dan_abramov/status/1104069236132057089
https://codesandbox.io/s/23m1659rlp
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ํ์ด๋จธ๊ฐ ์ค์ ๋ก ์ค์ง ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ค์ ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค. ๋์ผํ ํ๋ ์์์ ํญ์ 0์ ํ์ํ๋ ค๋ฉด running์ด false ์ผ ๋ ํญ์ 0์ ํ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฑฐ์ ํญ์ ๊ทธ๋ ๋ฏ์ด ๊ฐ์๊ธฐ๋ก ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ๊ฐ์๊ธฐ๋ ์ค์ง ์ํ๋ผ๊ณ ์๊ฐํ ๋ ์ฝ๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ๊ฑฐ๋ถ ํ ์ ์์ผ๋ฉฐ ์ค์ ๋ก ์ฌ์ค์ ํ๋ ๋ ผ๋ฆฌ๋ฅผ ์ํ ํ ์๋ ์์ต๋๋ค.