아래와 같이 ToDo 리스트 출력을 위한 밑작업을 했다.
const toDoState = atom<IToDo[]>({
key: "toDo",
default: [],
});
interface IForm {
toDo: string;
}
interface IToDo {
text: string;
id: number;
category: "TO_DO" | "DOING" | "DONE";
}
function ToDoList() {
const [toDos, setToDos] = useRecoilState(toDoState);
const { register, handleSubmit, setValue } = useForm<IForm>();
const handleValid = ({ toDo }: IForm) => {
setToDos((oldToDos) => [
{ text: toDo, id: Date.now(), category: "TO_DO" },
...oldToDos,
]);
setValue("toDo", "");
};
console.log(toDos);
return (
<div>
<h1>To Dos</h1>
<hr />
<form onSubmit={handleSubmit(handleValid)}>
<input
{...register("toDo", {
required: "Please write a To do",
})}
placeholder="Write a to do"
/>
<button>add</button>
</form>
<ul>
{toDos.map((toDo) => (
<li key={toDo.id}>{toDo.text}</li>
))}
</ul>
</div>
);
}
첫 요소가 상태의 값이며, 두번째 요소가 호출되었을 때 주어진 값을 업데이트하는 setter 함수인 튜플을 리턴.
이 hook은 암묵적으로 주어진 상태에 컴포넌트를 구독한다.
const [tempF, setTempF] = useRecoilState(tempFahrenheit);
useRecoilValue: state값을 리턴 (값만 반환 / 함수 x)
useSetRecoilState: setter 함수를 리턴
useRecoilState: state, setter 함수를 모두 리턴
Array.prototype.findIndex()
findIndex() 메서드는 주어진 판별 함수를 만족하는 배열의 첫 번째 요소에 대한 인덱스를 반환한다.
만족하는 요소가 없으면 -1을 반환한다.
인덱스 대신 값을 반환하는 find() 메서드도 참고.
const array1 = [5, 12, 8, 130, 44];
const isLargeNumber = (element) => element > 13;
console.log(array1.findIndex(isLargeNumber));
// expected output: 3
Array.prototype.slice()
slice() 메서드는 어떤 배열의 begin부터 end까지(end 미포함)에 대한 얕은 복사본을 새로운 배열 객체로 반환한다. 원본 배열은 바뀌지 않는다.
end가 생략되면 slice()는 배열의 끝까지(arr.length) 추출
const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];
console.log(animals.slice(2)); // expected output: Array ["camel", "duck", "elephant"]
console.log(animals.slice(2, 4)); // expected output: Array ["camel", "duck"]
name as any대신
name as "TO_DO" | "DOING" | "DONE" 또는 name as IToDo['category']로도 가능하다.
Selector는 파생된 state(derived state)의 일부를 나타낸다.
즉, 기존 state를 가져와서, 기존 state를 이용해 새로운 state를 만들어서 반환할 수 있다. 기존 state를 이용만할 뿐 변형시키지 않는다. derived state는 다른 데이터에 의존하는 동적인 데이터를 만들 수 있기 때문에 강력한 개념이다.
const filteredTodoListState = selector({
key: 'filteredTodoListState',
get: ({get}) => {
const filter = get(todoListFilterState);
const list = get(todoListState);
switch (filter) {
case 'Show Completed':
return list.filter((item) => item.isComplete);
case 'Show Uncompleted':
return list.filter((item) => !item.isComplete);
default:
return list;
}
},
});
filteredTodoListState는 내부적으로 2개의 의존성 todoListFilterState와 todoListState을 추적한다. 그래서 둘 중 하나라도 변하면 filteredTodoListState는 재실행된다.
열거형은 TypeScript가 제공하는 기능 중 하나다.
enum은 열거형으로 이름이 있는 상수들의 집합을 정의할 수 있다.
열거형을 사용하면 의도를 문서화 하거나 구분되는 사례 집합을 더 쉽게 만들수 있다.
TypeScript는 숫자와 문자열-기반 열거형을 제공한다.
숫자 열거형 (Numeric enums)
enum Direction {
Up = 1,
Down,
Left,
Right,
}
문자열 열거형 (String enums)
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
등등..