๐ form ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ state ๊ด๋ฆฌํ๊ธฐ
TS
๋ฅผ ์ด์ฉํ์ฌ Todo-list
๋ฅผ ๋ง๋ค๋ฉด์ ์ด์ ๊น์ง๋ button
์ onClick
์ ์ด์ฉํ์ฌ input
๊ฐ์ ๋ณด๋๋๋ฐ ์ด๋ฒ์๋ form
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ๋ณด๋ด๋ดค๋ค. form
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด input
์ฐฝ์ ๊ฐ์ ๋ณด๋ผ ๋ onKeyPress(enter)
ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์ง ์์๋ ๋ผ์ ์ ์ฉํ๋ค. ์ฌ๋งํ๋ฉด useState
, useRef
๊ฐ ์ด๋ค ํ์
์ธ์ง๋ ๋ช
์ํ์.
๋, ํจ์๋ด์์ event
๋ฅผ ๋ฐ์์ฌ๋ eventType
์ด ๋ฌด์์ธ์ง ์๊ณ ์ถ์ผ๋ฉด event
๋ฅผ ์ฒ๋ฆฌํ๋ ํ๊ทธ์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ํ์
์ ์ด๋ป๊ฒ ์ ์ฉํด์ผ ํ๋์ง ๋ค์ ์ฌ์ง์ฒ๋ผ ํ์
์ฐฝ์ด ๋ฌ๋ค.
ํ์ผ๋ก 14๋ฒ ๋ผ์ธ
์ฒ๋ผ ํจ์๋ด์์ ํจ์๋ฅผ ์ ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ ๊ฐ๋
์ฑ์ ๋์ด๊ธฐ ์ํด utility
ํด๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ์ ์ฅํ๊ณ import
ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
interface Todo {
id: string;
text: string;
done: boolean;
}
const App = () => {
const [todos, setTodos] = useState<Todo[]>(TODO_CONSTANT);
const nextId = useRef<number>(todos.length + 1);
const [title, setTitle] = useState<string>("");
const handleOnSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
const submitTodo: Todo = getSubmitTodo(nextCurrentId.current, title);
setTodos(todos.concat(submitTodo));
setTitle("");
nextId.current += 1;
};
const handleEvent = (e: React.ChangeEvent<HTMLInputElement>) => {
setTitle(e.target.value);
};
return(
<>
<form onSubmit={handleOnSubmit}>
<li>
<input
placeholder="๊ฐ์ ์
๋ ฅํ์ธ์."
onChange={handleEvent}
value={title}
/>
<button>์ถ๊ฐ!</button>
</li>
</form>
</>
)
}
// utility/getSubmitTodo/index.tsx
const getSubmitTodo = (nextId: number, title: string) => {
const submitTodo = {
id: String(nextId),
text: title,
done: false,
};
return submitTodo;
};
export default getSubmitTodo;
๋๊ธ