728x90
๋ฐ์ํ
๐ฅ ๋ฐ์ํ ๋ฌธ์
ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ํฐ(Enter) ํค๋ฅผ ๋๋ฅด๋ฉด ๋ชฉ๋ก์ ์๋กญ๊ฒ ์ถ๊ฐ๋๊ณ input ์ฐฝ์ ๋น์์ง๋๋ก ๊ตฌํํ๋๋ฐ ์ ์ง ๋ชจ๋ฅด๊ฒ ํจ์๊ฐ ๋ ๋ฒ ์คํ๋๋ฉด์ ๊ธฐ์กด ํ ์คํธ์ ๋ง์ง๋ง ๊ธ์๊ฐ ๋ชฉ๋ก์ ์ถ๊ฐ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋คโ๏ธ
์์ธ ๋ถ์
- ๊ฒ์ํด๋ณธ ๊ฒฐ๊ณผ ์ด๋ฌํ ๋ฌธ์ ๋ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ ํ๊ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. (์์ด๋ก ์ ๋ ฅํ๋ฉด ํค ์ด๋ฒคํธ๊ฐ ์ค๋ณต์ผ๋ก ๋ฐ์ํ์ง โ)
- ๊ตฌ์ฒด์ ์ผ๋ก ์ GIF๋ฅผ ๋ณด๋ฉด ํ๊ธ ์ ๋ ฅ ์ ์ ๋ ฅ ์ค์ธ ๊ธ์ ์๋ ๊ฒ์ ๋ฐ์ค์ด ์๊ธฐ๋๋ฐ ํด๋น ๋ฐ์ค์ด ์๋ ์ํฉ์์ ํค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํจ์๊ฐ ๋ ๋ฒ ์คํ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ํ๊ธ์ ๊ฒฝ์ฐ ์์๊ณผ ๋ชจ์์ ์กฐํฉ์ผ๋ก ๋ง๋ค์ด์ง๋ ์กฐํฉ ๋ฌธ์์ด๊ธฐ ๋๋ฌธ์ ๊ธ์๊ฐ ์กฐํฉ ์ค์ธ์ง ์กฐํฉ์ด ๋๋ ์ํ์ธ์ง๋ฅผ ์ ์ ์์ด ์๊ธฐ๋ ๋ฌธ์ ์ด๋ค.
๐งฏ ํด๊ฒฐ ๋ฐฉ๋ฒ
nativeEvent ๋ฐ React์์ ์ ๊ณตํ๋ CompositionEvent๋ฅผ ์ฌ์ฉํด์ ๋ฌธ์ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
1๏ธโฃ nativeEvent ์ฌ์ฉ
import React, { useRef, useState } from 'react';
export default function ToDoList() {
const [todos, setTodos] = useState(initialValue);
const textRef = useRef('');
const handleClick = () => {
handleAdd();
};
// ์ํฐ(Enter) ํค๋ฅผ ๋๋ฆ๊ณผ ๋์์ isComposing ํ๋กํผํฐ์ ๊ฐ์ด false์ธ ๊ฒฝ์ฐ์๋ง ํจ์ ์คํ
const handleKeyDown = (e) => {
if (e.key === 'Enter' && e.nativeEvent.isComposing === false) handleAdd();
};
const handleAdd = () => {
const text = textRef.current.value.trim();
if (text === '') {
alert('๊ณต๋ฐฑ์ ์ ์ธํ๊ณ ํ ๊ธ์ ์ด์ ์
๋ ฅํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.');
textRef.current.value = '';
return;
}
setTodos([...todos, { id: new Date(), text, status: 'active' }]);
textRef.current.value = '';
};
return (
<section>
<ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
<input
type='text'
ref={textRef}
placeholder='Add Todo'
onKeyDown={handleKeyDown}
/>
<button onClick={handleClick}>Add</button>
</section>
);
}
const initialValue = [
{ id: '123', text: '์ฅ๋ณด๊ธฐ', status: 'active' },
{ id: '124', text: '๊ณต๋ถํ๊ธฐ', status: 'active' },
];
2๏ธโฃ CompositionEvent ์ฌ์ฉ
CompositionEvent ํธ๋ค๋ฌ ํจ์(onCompositionStart, onCompositionEnd)๋ฅผ ์ฌ์ฉํ์ฌ isComposing ์ํ๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํจ์ผ๋ก์จ ์ปดํฌ์ง์ ์ธ์ ๋ด์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ ํ ์ ์๋ค.
import React, { useRef, useState } from 'react';
export default function ToDoList() {
const [todos, setTodos] = useState(initialValue);
// isComposing ์ํ๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌ
const [isComposing, setIsComposing] = useState(false);
const textRef = useRef('');
const handleClick = () => {
handleAdd();
};
// ์ํฐ(Enter) ํค๋ฅผ ๋๋ฆ๊ณผ ๋์์ isComposing ์ํ๊ฐ false์ธ ๊ฒฝ์ฐ์๋ง ํจ์ ์คํ
const handleKeyDown = (e) => {
if (e.key === 'Enter' && !isComposing) handleAdd();
};
const handleAdd = () => {
const text = textRef.current.value.trim();
if (text === '') {
alert('๊ณต๋ฐฑ์ ์ ์ธํ๊ณ ํ ๊ธ์ ์ด์ ์
๋ ฅํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.');
textRef.current.value = '';
return;
}
setTodos([...todos, { id: new Date(), text, status: 'active' }]);
textRef.current.value = '';
};
return (
<section>
<ul>
{todos.map((todo) => (
<li key={todo.id}>{todo.text}</li>
))}
</ul>
<input
type='text'
ref={textRef}
placeholder='Add Todo'
onKeyDown={handleKeyDown}
onCompositionStart={() => setIsComposing(true)}
onCompositionEnd={() => setIsComposing(false)}
/>
<button onClick={handleClick}>Add</button>
</section>
);
}
const initialValue = [
{ id: '123', text: '์ฅ๋ณด๊ธฐ', status: 'active' },
{ id: '124', text: '๊ณต๋ถํ๊ธฐ', status: 'active' },
];