๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/TypeScript

[ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) ] form ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ state ๊ด€๋ฆฌํ•˜๊ธฐ

by YWTechIT 2021. 7. 20.
728x90

๐Ÿ“ 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;
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€