Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import { atom, atomFamily, selector } from 'recoil';
// id 값 관리를 위한 Atom
export const idsAtom = atom({
key: 'idsAtom',
default: []
});
// 개별 Todo 항목을 별도의 Atom으로 관리하기
export const todoAtom = atomFamily({
key: 'todoAtom',
default: null
});
// 할 일 항목을 목록으로 묶어 조작할 수 있는 선택기
export const todoListSelector = selector({
key: 'todoListSelector',
// 현재 할 일 목록 가져오기
get: ({ get }) => {
const ids = get(idsAtom);
return ids.map(id => get(todoAtom(id)));
},
// 할 일 목록에 추가 / 완료 / 삭제 작업
set: ({ set, reset }, { type, id, newItem }) => {
switch (type) {
// 새로운 Todo 항목(todoAtom)을 생성한다.
case 'add' :
set(todoAtom(newItem.id), newItem);
set(idsAtom, ids => [...ids, newItem.id]);
break;
// 기존 Todo 항목(id가 todoAtom인 Todo 항목)의 isDone 속성을 true로 설정한다.
case 'done' :
set(todoAtom(id), todo => ({ ...todo, isDone: true }));
break;
// 기존 Todo 항목(id인 todoAtom) 삭제 및
// id군(idsAtom)에서 해당 id 값을 삭제한다.
case 'remove' :
reset(todoAtom(id));
set(idsAtom, ids => ids.filter(e => e !== id));
break;
default :
throw new Error('Type is invalid.');
}
}
}); |