์๋
ํ์ธ์, ์
๋ ฅ ์ ์ด ๋ชจ๋๋ฅผ ์ฌ์ฉํ๊ณ onKeyDown
๋ฐ onChange
์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ณต๊ฐ์ ๋ค์ด๊ฐ ๋ ํจ๊ณผ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณต๊ฐ์ ํ๋ฉด์ ํ์๋์ง ์์ต๋๋ค. ์ด๊ฒ์ React์ ๋ฒ๊ทธ์
๋๊น ์๋๋ฉด ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ๊ทธ๋ฌ๋ onKeyUp
๊ตฌ๋
์ ์ ์์
๋๋ค. ์ด๊ฒ์ ํผ๋ ์ค๋ฝ์ต๋๋ค.
React ๋ฒ์ : 16.13.1 ๋ฐ ์ด์
์ฝ๋ ์์ ๋งํฌ :
import React, { useState,useEffect } from 'react'
const App = () => {
const [count, setCount] = useState(0)
const [value, setValue] = useState('')
const [code, setCode] = useState('add')
useEffect(() => {
if (code === 'add') {
setCount(c => c + 1)
} else {
setCount(c => c - 1)
}
}, [code, setCount])
const keyDown = e => {
if (e.keyCode === 32) {
console.log('space~')
if (code === 'add') {
setCode('minus')
} else {
setCode('add')
}
}
}
const handleChange = e => {
setValue(e.target.value)
}
return (
<div>
<div>{count}</div>
<br />
<input onKeyDown={keyDown} value={value} onChange={handleChange} />
</div>
)
}
export default App
์ ๋ ฅ ์์๊ฐ ๊ณต๋ฐฑ์๋ฐ์ ์ ์์ต๋๋ค.
์ ๋ ฅ ์์๋ ๊ณต๊ฐ์๋ฐ์ ์ ์์ต๋๋ค.
onKeyDown
์ฒ๋ฆฌ๊ธฐ์ ์ํ ์
๋ฐ์ดํธ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ค๋จํ๊ณ onChange
์ฒ๋ฆฌ๊ธฐ๊ฐ ํธ์ถ๋์ง ์๋๋กํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ ์ด ๋ ๊ตฌ์ฑ ์์๋ ์ฌ์ฉ์๊ฐ ์ง์ ํ ๋ด์ฉ ๋ง ํ์ํ๊ธฐ ๋๋ฌธ์ (์์ ์์๋ value
์ํ) ๊ณต๋ฐฑ ๋ฌธ์๊ฐ ๋ํ๋์ง ์์ต๋๋ค.
์ด ๋ ์ด๋ฒคํธ๊ฐ ์ํธ ์์ฉํ๋ ๋ฐฉ์์์ ์ด๊ฒ์ ๋์๊ฒ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ ๋๋ค.
cc @trueadm @gaearon ์ ์ด๋ฒคํธ ์์คํ ์ ๋ฌธ์ฑ
์๋ ํ์ธ์, ์ ๋ ์ฌ๊ธฐ ์๋ก ์์ผ๋ฉฐ React ์ํคํ ์ฒ๋ฅผ ๋ฐฐ์ฐ๋ ค๊ณ ํฉ๋๋ค.
@bvaughn ์ฌ๊ธฐ์ ๋ฌธ์ ์ ๋ํด ์ฐพ์ ๊ฒ์ด ์์ต๋๋ค.
onKeyDown
์ด๋ฒคํธ๋ ์
๋ ฅ์ด ์์ ๋๊ธฐ ์ ์ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒ์ด ์๋๋ผ onChange
์ฐจ๋จํ์ง ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก onKeyDown
๋ onChange
๋ณด๋ค onKeyUp
์์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด ํน๋ณํ ๊ฒฝ์ฐ ๋ฌธ์ ๋ keyDown
์์ setCode
ํธ์ถ์ ์ฒซ dispatchAction
_Fiber_์ ์ ๋ฌธ์์์ด memoizedState
๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค (๋ถ๋ช
ํ) ๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ ๋ e
. ๊ฒฐ๊ตญ ์ ๋ฌธ์๋ฅผ ์
๋ ฅ์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ useEffect()
_same queue_ ๋ด์์ dispatchAction
๋ค์ ํธ๋ฆฌ๊ฑฐํ์ง๋ง (ํ์ธ์ง ํ์คํ์ง ์์) ์
๋ฐ์ดํธ ๋ prop์ ๋ํด ์์ง ๋ชปํฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ๊ทธ ๋ commitRoot
, ๊ทธ๊ฒ์ด ๋ณต์ pendingProps
๊ฐ ์์๋ค ๋์ผํ๋ค memoizedState
. ์์ปจ๋, ๋ฌธ์ (์ด ์์์๋ ๊ณต๋ฐฑ)๊ฐ ์ถ๊ฐ๋๊ณ ์ฆ์ ์ด์ ์ํ๊ฐ ์ ๋ฌธ์ (๊ณต๋ฐฑ)์์ด ๋ณต์๋๋ฏ๋ก ์๋ฌด๊ฒ๋ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
_same queue_ (?)๋ฅผ ์ฌ์ฉํ์ง ์๋ ์๋ก์์ด ํน์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
useEffect(() => {
if (code === 'add') {
setCount(c => c + 1)
} else {
setCount(c => c - 1)
}
}, [code, setCount])
๋ค์๊ณผ ๊ฐ์ด ์์ ํ ์ ์์ต๋๋ค.
useEffect(() => {
if (code === 'add') {
setTimeout(() => setCount(c => c + 1), 0)
} else {
setTimeout(() => setCount(c => c - 1), 0)
}
}, [code, setCount])
์๋ํฉ๋๋ค.
๋ง์ด ๋๊ธธ ๋ฐ๋๋๋ค.
์ด ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ keydown ํธ๋ค๋ฌ์ setTimeout์์ setState ํธ์ถ์ ๋ํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ด๊ฒ์ด React์ ๋ด๋ถ์์ ๋ค๋ฅด๊ฒ ์๋ํด์ผํ๋ ๊ฒ์ธ์ง ์๋๋ฉด์ด ์ค๋ฅ๊ฐ ๊ฐ๋ฐ์ ์ธก์์ ๋ ํฐ ์ค์ ๋ ๋์ ํจํด์ ๊ฐ๋ฆฌํค๋ ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค.