ํฐ์คํ ๋ฆฌ ๋ทฐ
[React] onKeyDown ์ฌ์ฉ์ผ๋ก ์ธํ ์ค๋ฅ์ ๋ํด
stable_sound 2023. 5. 16. 20:42๊ฐ์ธ ํ๋ก์ ํธ (์ค์ฌ์ ๋งํฌ์ฌ)๋ฅผ ์งํํ๋๋ฐ ํฌ๋๋ฅผ ๋ฑ๋กํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.

๋ถ๋ช
ํ๋์ ํฌ๋๋ง ์
๋ ฅํ๋๋ฐ ๋งจ ๋ท ๊ธ์๊ฐ ์ถ๊ฐ๋ก ๋ฑ๋ก๋๋ ๋ฌธ์ ์๋ค.
onKeyDown ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ๋ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋๋ก ์ฝ๋๋ฅผ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ถ๋ถ์ ๋ณด๊ธฐ๋ก ํ๋ค.
// ๋ฑ๋ก ๋ฒํผ ํด๋ฆญ
const onClickAddTodo = (e) => {
if (inputValue && e.key === "Enter") {
setTodoData((prev) => [
...prev,
{
id: Date.now(),
content: inputValue,
isEdit: false,
isDone: false,
},
]);
setInputValue("");
}
};
<Input
placeholder="ํ ์ผ ๋ฑ๋ก"
value={inputValue}
onChange={onChangeInput}
onKeyDown={(e) => onClickAddTodo(e)}
/>
์๋ฌด๋ฆฌ๋ด๋ ๋ฑ๋ก ํจ์๋ถ๋ถ์์๋ ์ด์ํ ์ ์ด ์๋ ๊ฒ ๊ฐ์๋ค.
์ค๋ง onKeyDown์ด ๋ฌธ์ ์ผ๊น? ์ถ์ด์ ์ข ์ฐพ์๋ดค๋๋ onKeyDown ์ด๋ฒคํธ์ ๋์๋ฐฉ์๊ณผ ํ๊ธ ์ ๋ ฅ๋ฐฉ์์ด ๊ด๋ จ์ด ์์๋ค.
onKeyDown
onKeyDown์ ํค๋ฅผ ๋๋ ์ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ํค๋ณด๋ ์ด๋ฒคํธ ํจ์์ด๋ค.
'ํฌ๋'๋ฅผ ์
๋ ฅํ๋ค๊ณ ๊ฐ์ ํด๋ณด์์ ๋,
'ใ
' ํค ์
๋ ฅ -> ์ด๋ฒคํธ ๋ฐ์ -> ๋๋ฅผ ๋น์ input์ value ๊ฐ์ ๊ณต๋ฐฑ์ด๋ฏ๋ก ''
'ใ
' ํค ์
๋ ฅ -> ์ด๋ฒคํธ ๋ฐ์ -> ใ
'ใท' ํค ์
๋ ฅ -> ์ด๋ฒคํธ ๋ฐ์ -> ํฌ
'ใ
' ํค ์
๋ ฅ -> ์ด๋ฒคํธ ๋ฐ์ -> ํณ
'enter' ํค ์
๋ ฅ -> ์ด๋ฒคํธ ๋ฐ์ -> 'ํฌ๋' ๋ฐ์ดํฐ๊ฐ ์ ์ฅ
์ด๋ฐ ์์๋ก ์งํ์ด ๋๋ค.
๊ทธ๋ผ '๋'๋ ๋๋์ฒด ์ด๋์ ์๊ฒจ๋์ ์ ์ฅ์ด ๋๋๊ฑธ๊น?
์์์ฝ๋๋ฅผ ๋ง๋ค์ด์ ํ ์คํธํด๋ณด์!

ํฌ๋๋ฅผ ํ๊ธ๊ณผ ์์ด๋ก ๊ฐ๊ฐ ์
๋ ฅํ ํ ์ํฐ๋ฅผ ๋๋ฌ๋ณด์๋ค.
'ํฌ๋'๋ฅผ ์
๋ ฅํ์ ๊ฒฝ์ฐ, ์ํฐ๋ฅผ ๋๋ ์ ๋ ์
๋ ฅ๊ธฐ ์์ผ๋ก ์์ง ์์ฑ๋ ๋จ์ด๋ก ์ธ์์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ํฐ๋ฅผ ๋๋ ๋ค๊ฐ ๋ ๊ฒฝ์ฐ์๋ ์ถ๊ฐ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
ํ์ง๋ง 'grape'๋ฅผ ์
๋ ฅํ์ ๊ฒฝ์ฐ, ์์ด ํน์ฑ ์ ํ ๊ธ์๊ฐ ๋จ์ผ ํค ์
๋ ฅ์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ํฐ๋ฅผ ๋๋ ์ ๋ ๋จ์ด๋ ์ด๋ฏธ ์์ฑ๋ ์ํ๋ก ์ธ์๋๋ค.
์ด ํ์์ isComposing์ด๋ผ๋ ์์ฑ๊ณผ๋ ์ฐ๊ด์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ๋ ํจ๊ป ์์๋ณด์.
isComposing
isComposing์ ํ์ฌ ๊ฐ์ด ์
๋ ฅ์ด ์๋ฃ๋ ์ํ์ธ์ง ์๋์ง๋ฅผ ๋ํ๋ด์ฃผ๋ ์์ฑ์ด๋ค.
(isComposing์ด true์ด๋ฉด ์
๋ ฅ ์ค์ด๋ผ๋ ์๋ฏธ, false์ด๋ฉด ์
๋ ฅ์ด ์๋ฃ๋์๋ค๋ ์๋ฏธ!)
์์ ์์์ ๋์
ํด๋ณด๋ฉด ํ๊ธ๋ก 'ํฌ๋'๋ฅผ ์
๋ ฅํ์ ๊ฒฝ์ฐ, ์ํฐ๋ฅผ ๋๋ฅธ ์๊ฐ์ isComposing์ด true์ธ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ์์์๋ ์ธ๊ธํ๋ฏ์ด ์์ง ์์ฑ๋ ๋จ์ด๋ก ์ธ์์ด ๋์ง ์์๋จ ๋ป์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํฐ๋ฅผ ๋๋ ๋ค๊ฐ ๋ผ๋ ์๊ฐ์๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ฒ ๋๋ค.
๊ทธ์ ๋ฐํด 'grape'๋ฅผ ์
๋ ฅํ์ ๊ฒฝ์ฐ, ์ํฐ๋ฅผ ๋๋ฅธ ์๊ฐ์ isComposing์ด false์ธ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ์ญ์ ์์์ ์ธ๊ธํ๋ฏ์ด ์์ฑ๋ ๋จ์ด๋ก ์ธ์ํ๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค.
์ถ๊ฐ๋ก ์ด ์์ฑ์ ์ด์์ฒด์ ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ์ง์ํ๊ณ ํด์ํ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๊ธฐ๋ ํ๋ค.

์ ์ฌ์ง๊ณผ ๊ฐ์ด window ์ด์์ฒด์ ์์๋ ํ๊ธ ์
๋ ฅ ์์๋ 'isComposing' ๊ฐ์ด false๋ก ์ค์ ๋๋ ๊ฒฝํฅ์ด ์๊ณ

๋งฅ๋ถ์์๋ ํ๊ธ ์ ๋ ฅ ์ isComposing ๊ฐ์ด true๋ก ์ค์ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋์ ๋๋์ฒด '๋'๋ ์ ๋์ค๋๊ฑธ๊น?๐ค
ํ๊ธ๋ก ์์ฑํ ๊ฒฝ์ฐ์๋ '์ด์ฑ -> ์ค์ฑ -> ์ข
์ฑ' ์ ์กฐํฉ์ผ๋ก ํ๊ธ ๊ธ์ ํ๋๋ฅผ ์์ฑ์ํค๊ฒ ๋๋๋ฐ
์ฐ๋ฆฌ๋ 'ํฌ๋'๋ฅผ ์
๋ ฅํ๊ณ ๊ทธ๊ฒ ์ด๋ฏธ ์์ฑ๋ ๊ธ์๋ผ๊ณ ์๊ฐํ์ง๋ง,
์
๋ ฅ๊ธฐ ์
์ฅ์์๋ ใ
(์ด์ฑ) + ใ
(์ค์ฑ) + ใท(์ข
์ฑ) + ใ
(??)
์ผ๋ก ์๊ฐํ๊ธฐ ๋๋ฌธ์
ํฌ๋๋ผ๋ ๊ธ์๋ ์์ฑ๋ ๊ธ์๊ฐ ์๋๋ผ๊ณ ํ๋จํ๊ฒ ๋๋ค.
์ด ๊ณผ์ ์์ e.target.value๋ 'ํฌ๋'
์ด๊ธฐ ๋๋ฌธ์ data ๋ฐฐ์ด์ ์ ์ฅ๋๋ค.
์์ ๊ฐ์ ์ด์ ๋๋ฌธ์ ์ํฐ๋ฅผ ๋๋ ๋ค๊ฐ ๋ผ๋ ์๊ฐ์ ํ๋ฒ ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ฒ ๋๊ณ ,
์ด์ฑ๊ณผ ์ค์ฑ๋ง์ผ๋ก ์ด๋ฃจ์ด์ง '๋'๋ฅผ ์์ ํ ๊ธ์๋ก ์ธ์ํ๊ฒ ๋์ด data์ ์ ์ฅ๋๋ ๊ฒ์ด๋ค.
๊ทธ ํ ์
๋ ฅ์ด ์๋ฃ ๋์๋ค๊ณ ํ๋จํ๊ณ isComposing์ false๋ก ๋ณ๊ฒฝ์ํจ๋ค.
๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
isComposing ์์ฑ ์ด์ฉํ๊ธฐ
// ๋ฑ๋ก ๋ฒํผ ํด๋ฆญ
const onClickAddTodo = (e) => {
if (
inputValue &&
e.key === "Enter" &&
e.nativeEvent.isComposing === false // <- โจ ์ด๋ถ๋ถ ์ถ๊ฐ
) {
setTodoData((prev) => [
...prev,
{
id: Date.now(),
content: inputValue,
isEdit: false,
isDone: false,
},
]);
setInputValue("");
}
};

์์์ ๊ณ์ ์ดํด๋ดค๋ isComposing ์์ฑ์ ์ด์ฉํด์ ์ํฐ๋ฅผ ๋๋ ๋ค ๋ผ๋ ์๊ฐ์ isComposing = false
๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋๋ก ์ฝ๋๋ฅผ ์์ ํด์ฃผ์๋ค.
onKeyUp ์ฌ์ฉํ๊ธฐ
์ฌ์ค ์ฐพ์๋ณด๋ฉด ๋ค onKeyPress๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ํ์ง๋ง.. ์ด์ ๋ onKeyPress๋ฅผ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ onKeyUp์ ์ฌ์ฉํด๋ณด์๋๋ฐ ์ด๊ฒ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋์๋ค!
onKeyUp์ ํค๋ฅผ ๋๋ ๋ค๊ฐ ๋ ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ํค๋ณด๋ ์ด๋ฒคํธ ํจ์์ด๋ค.

์ด ๊ฒฝ์ฐ๋ onKeyDown์ด๋ ๊ฒฐ๊ตญ ๋๊ฐ์๊ฑฐ ์๋๊น? ์๊ฐํ๋๋ฐ ํค๋ฅผ ๋๋ ๋ค๊ฐ ๋ผ๋ ์๊ฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด์ ๊ทธ ์์ ์ ์ ๋ ฅ๊ฐ์ ์ ๋ ฅ์ด ์๋ฃ๋ ์ํ๋ก ์ธ์์ด ๋๋ค.
๐ฉ๐ป๐ป ๋๋์
๊ทธ์ 'ํค๋ฅผ ์ ๋ ฅํ ๋ ์ผ์ด๋๋ ์ด๋ฒคํธ๋ค์ด๋ค, onKeyDown์ ํค๋ฅผ ๋๋ฅธ ์๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ onKeyUp์ ํค๋ฅผ ๋๋ ๋ค๊ฐ ๋ผ๋ ์๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค
' ์ด์ ๋๋ก๋ง ์์์ง ์ด๋ ๊ฒ ์์ธํ๊ฒ ํ๋ณธ ์ ์ด ์์ด์ ํท๊ฐ๋ฆฌ๊ณ ์ด๋ ค์ ์ง๋ง ๊ต์ฅํ ์ฌ๋ฏธ์์๋ค.
์ด์์ฒด์ ๋ ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅด๊ฒ ๋์ํ๋ ๊ฒ๋ ์ ๊ธฐํ๊ณ ํ๊ธ๊ณผ ์์ด์ ์ ๋ ฅ๋ฐฉ์ ์ฐจ์ด๊ฐ ๋์๋ฐฉ์์ ์ด๋ ๊ฒ๋ ํฐ ์ํฅ์ ์ฃผ๋์ง ๋ชฐ๋์ด์ ์ ๊ธฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ด์์ฒด์ ๋ง๋ค ๋ค๋ฅด๊ฒ ๋์ํ๋์ง๋ ๊ถ๊ธํด์ก๋ค. (๋งฅ๋ถ์ ๋ฏธ๊ตญ๊บผ๋ผ ๊ทธ๋ฐ๊ฐ?๐ค)
๊ฑฐ์ 5์๊ฐ์ ์ด๊ฒ๋ง ์ฐพ์๋ณด๊ณ ์์ ์ฝ๋ ์จ๋ณด๊ณ ์์ผ๋ก ์จ๋ณด๊ณ ๊ทธ๋ ค๋ณด๊ณ ํ ๊ฒ ๊ฐ์๋ฐ 1๋ ๋์ ๋งํ '์?๋๋์ฒด ์?'๋ผ๋ ๋ง์ ์ค๋ ๋คํ ๊ฒ ๊ฐ๋ค. ๋น๋ถ๊ฐ ํฌ๋์ ํฌ์๋ ๋ณด๊ธฐ ์ซ์ ์์ (?)๐คฃ๐คฃ
์ฐธ๊ณ ๋งํฌ
keydown ์ด๋ฒคํธ ํ๊ธ ์ค๋ณต ์
๋ ฅ ํ์
[JS] keydown/keyup์์ ํ๊ธ ์
๋ ฅ ์ ํจ์๊ฐ ๋ ๋ฒ ์คํ๋๋ ๊ฒฝ์ฐ
'Front-end ๐ฅ๐ค > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- ์กธ์ ์ํ
- ๋ฐฑ์ค
- ํ์ฅ์ค์ต
- ์กธ์ ์ํ์ค๋น
- MySQL
- ๋ ธ๋ง๋์ฝ๋
- C์ธ์ด
- ๋ฆฌ์กํธ
- HTML
- css grid
- CSS
- php๊ฒ์ํ๋ง๋ค๊ธฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ ์ฒ๊ธฐ ์ค๊ธฐ
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ์ค๊ธฐ ์ ๋ฆฌ
- indexOf()
- ํํ์ด์ง ๋ง๋ค๊ธฐ
- set ๊ฐ์ฒด
- JavaScript
- DAPP
- ํ์ฅ์ค์ต ๊ธฐ๋ก
- ์ด๋๋ฆฌ์
- ๋ธ๋ก์ฒด์ธ
- ์ ์ฒ๊ธฐ ์ค๊ธฐ ์ ๋ฆฌ
- php ๋ฌ๋ ฅ๋ง๋ค๊ธฐ ์์ฉ
- ๊ฐค๋ฌ๋ฆฌ๋์ฐ๊ธฐ
- php
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ ์ค๊ธฐ
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ
- ์ค๋งํธ์ปจํธ๋ํธ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |