const [todoList, setTodoList] = useState<string[]>([]);
// todo 들을 저장하는 상태
const [doneList, setDoneList] = useState<string[]>([]);
// 완료된 todo 들을 저장하는 상태
todoList
와 doneList
는 App 컴포넌트에서 상태로 저장된다.{
status : done, // or todo
content : 비타민챙겨먹기
}
todoList
상태와 그 갱신함수인 setTodoList
함수를 props 로 전달받는다.onChange
이벤트를 통해 변경될때마다 inputValue
라는 상태에 저장한다.<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
addTodo
함수를 실행시키고, 갱신함수를 통해 기존 todoList
상태에 저장된 값들 뒤에 현재 inputValue
를 추가하고, inputValue
를 초기화한다.const addTodo = (
e:
| React.FormEvent<HTMLFormElement>
| React.MouseEvent<HTMLButtonElement, MouseEvent>
) => {
e.preventDefault();
if (!inputValue) return;
setTodoList([...todoList, inputValue]);
setInputValue('');
};
e
에 지정된 타입들은 작성한 이벤트 핸들러의 매개변수
에 커서를 올려보면 표시된다.TodoList
라는 상위 컴포넌트에서 Todo
, Done
이라는 하위 컴포넌트로 props를 전달하고, 위의 사진처럼 각각을 나누어 렌더링하는 방식을 취하고 있다.interface IProps {
todoList: string[];
setTodoList: Dispatch<SetStateAction<string[]>>;
doneList: string[];
setDoneList: Dispatch<SetStateAction<string[]>>;
}
todoList
와 doneList
를 map
을 이용하여 컨텐츠들을 렌더링 시켜주었다.Todo
, Done
컴포넌트{todoList.map((content, idx) => {
return (
<Todo key={idx}
//이외의 props 생략
/>
);
→ Done
도 동일한 형태로 렌더링해주었다.
{todoList.length === 0 && <div className="empty">비어 있습니다.</div>}
TodoList
에서 전달받는 props는 다음과 같다.interface IProps {
content: string;
idx: number;
todoList: string[];
setTodoList: Dispatch<SetStateAction<string[]>>;
doneList: string[];
setDoneList: Dispatch<SetStateAction<string[]>>;
}
const deleteTodo = () => {
setTodoList(
todoList.filter((todo, todoIdx) => {
return idx !== todoIdx;
})
);
};
doneList
에 해당 데이터를 추가하는 과정을 추가했다.const completeTodo = () => {
setDoneList([...doneList, todoList[idx]]); // 요기
setTodoList(
todoList.filter((todo, todoIdx) => {
return idx !== todoIdx;
})
);
};
TodoList
에서 전달받는 props는 다음과 같다.interface IProps {
content: string;
idx: number;
doneList: string[];
setDoneList: Dispatch<SetStateAction<string[]>>;
}
Todo
컴포넌트와 동일하게 구현해주었다.const deleteDone = () => {
setDoneList(
doneList.filter((done, doneIdx) => {
return idx !== doneIdx;
})
);
};
TodoList
컴포넌트에 아래와 같이 함수를 작성하여 전체삭제를 추가해주었다.const clearDoneList = () => {
setDoneList([]);
};
저장되는 형식 수정 → Redux 적용 → 로컬 스토리지 적용 → 새 기능 추가
가 되지 않을까 싶다.