const onSubmit = (e) => {
e.preventDefault();
const nextTodo = [...todo, { id: ref.current++, title: newTodo, completed: false }]
setTodo(nextTodo);
console.log(todo); // 여기서는 바뀐 todo가 바로 반영되지 않는다. (비동기가 아닌 batch 문제!)
}
...
useEffect(() => {
// 여기서 todo가 바뀌었는지 확인할 수 있다.
}, [todo])
batch란 무엇?
state)로 만들자todoForm)props로 만들자 // 예시
<TodoItem key={1} index={0} item={item} onRemove={onRemove} setTodo={setTodo} />
<TodoItem key={2} index={1} item={item} onRemove={onRemove} setTodo={setTodo} />
<TodoItem key={3} index={2} item={item} onRemove={onRemove} setTodo={setTodo} />부모가 자식의 데이터를 바꾸고 싶으면?
: 데이터를 처음부터 부모의 state로 만들어서 자식에게 props로 내려준다.
자식이 부모의 데이터를 바꾸고 싶으면?
: 부모의 데이터를 props로 받아온 뒤, 부모의 데이터를 바꾸는 set함수도 같이 받아온다.
함수! 이지, 함수형이 아니다. 순수함수가 아니다.
라이프 사이클
useEffect(() => {
console.log("mount");
}, []); // mount될 때만 실행
useEffect(() => {
console.log("re-render");
}); // 리 렌더링 될 때 마다 실행
useEffect(() => {
console.log("todo");
}, [todo]);
useEffect(() => {
// todo가 바뀔 때마다 실행됨
return () => {
// todo가 바뀌기 직전에 실행됨
};
}, [todo]);
// 만약 todo가 a -> b로 바뀐다면,
// a useEffect -> a clean up -> b useEffect
state가 바뀔 때props가 바뀔 때immer 같은 라이브러리로 극복하면 된다.
useEffect()에서 같이 deps에 넣는 객체가 참조가 완전히 끊겨야 리렌더링이 되므로~