To-Do List
학습 목표
React
, TypeScript
로 To-Do List 를 만들며 React
와 TypeScript
를 더 공부한다.
useRecoilValue
와 useSetRecoilState
를 제외한 새로운 Recoil
함수(훅) 들을 배워본다.
React Hook Form
을 새로 배워본다.
- 개인적으로
React
에서 form
으로 작업하기에 가장 좋은 방법이라고 생각합니다. 모든 걸 너무나 쉽게 만들어 주기 때문에
- 정말 큰 form 을 가지고 있을 때 매우 좋습니다. 또는 엄청 큰
form validation(검증)
을 가지고 있을 때에도
form validation
: 데이터 타입을 체크하고, 조건을 확인합니다.
- 이번에는 To-Do List 이기 때문에
input
이 많이 필요 없지만 회원가입
이라고 생각하면 inpu
태그가 엄청 많이 있습니다.
- React와 TypeScript 만으로 간단한 To-Do List 를 만들어보고 추가로
Recoil
과 React-Hook-Form
을 사용하는 코드로 마이그레이션 해보면 공부해보겠습니다.
- React로만 만든 간단한 To-Do List
// ToDoList.tsx
import React, { useState } from "react";
function ToDoList() {
const [toDo, setToDo] = useState("");
const [toDoError, setToDoError] = useState("");
const onChange = (event: React.FormEvent<HTMLInputElement>) => {
const {
currentTarget: { value },
} = event;
setToDoError("");
setToDo(value);
};
const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
if (toDo.length < 10) {
return setToDoError("To-Do should be longer");
}
console.log("submit");
};
return (
<div>
<form onSubmit={onSubmit}>
<input onChange={onChange} value={toDo} placeholder="Write a to do" />
<button>Add</button>
{toDoError !== "" ? toDoError : null}
</form>
</div>
);
}
export default ToDoList;
useForm
이라는 hook
을 import
합니다.
// ToDoList.tsx
import { useForm } from "react-hook-form";
ToDoList
컴포넌트에 useForm
함수의 register
함수를 선언해 줍니다.
register 함수
: onChange 이벤트 핸들러, props, useState 전부 대체 해줍니다.
// ToDoList.tsx
...
function ToDoList() {
const { register } = useForm();
return (
<div>
<form>
<input placeholder="Write a to do" />
<button>Add</button<
</form>
</div>
);
}
export default ToDoList;
resister
함수를 호출하면 어떤 일이 벌어지는 지 console.log(resister("toDo"));
하여 확인해봅시다.
// ToDoList.tsx
...
function ToDoList() {
const { register } = useForm();
console.log(register("toDo"));
...
- 위와 같은 객체를 생성합니다.
onBlur
: onClick
과 반대의 이벤트입니다, ```input```` 태그 밖의 화면 클릭
- 보기에
onChange
외에 특별할 것이 부족해 보이는 데 어떻게 활용될지 더 지켜보도록 합시다.
register
함수를 input
태그에 활용하기 위해 spread syntax(...)
를 input
태그 내에서 활용해줍니다.
// ToDoList.tsx
<input {...register("toDo")} placeholder="Write a to do" />
register.name
은 value
가 되고, register.onChage
는 onChange
로 react-hook-form
사용하기 전 value
, onChange
, useState
를 register
함수로 대체했습니다.
form
의 입력값 변화를 보기 위해서 useForm
의 watch
함수를 불러옵니다. 마찬가지로 console.log
를 활용하여 watch
함수를 확인해줍니다.
// ToDoList.tsx
...
function ToDoList() {
const { register, watch } = useForm();
console.log(watch())
...
- 객체로 해당
input
태그에 있는 register
의 이름값을 key
로 태그 내의 value
를 확인할 수 있게 해줍니다.
key
값과 함께 객체로 반환해 주는 것이 후에 input
태그가 여러개 있을때 보다 편리함과 가독성을 제공할 것입니다.