All files / src/chap07 RecoilTodoUp.js

0% Statements 0/14
0% Branches 0/4
0% Functions 0/6
0% Lines 0/13

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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71                                                                                                                                             
import { useRecoilState } from 'recoil';
import { useState } from 'react';
import { idsAtom, todoListSelector } from '../store/atomUp';
import '../chap04/StateTodo.css';
 
export default function RecoilTodoUp() {
  const [title, setTitle] = useState('');
  // Atom/Selector에서 값, 세터를 가져온다.
  const [todo, setTodo] = useRecoilState(todoListSelector);
  const [ids, setIds] = useRecoilState(idsAtom);
 
  // 텍스트 상자에 입력한 내용을 State에 반영
  const handleChangeTitle = e => {setTitle(e.target.value)};
 
  // [추가] 버튼 클릭으로 할 일 항목 추가하기
  const handleAdd = () => {
    // id군의 최대값에서 다음 id값(+1)을 가져온다.
    const newId = Math.max(...(ids.length ? ids : [0])) + 1;
    setTodo({
      type: 'add',
      newItem: {
        id: newId,
        title,
        isDone: false
      }
    });
  };
 
  // [완료] 버튼 클릭으로 해당 ToDo 항목을 작업 완료로 표시
  const handleDone = e => {
    setTodo({
      type: 'done',
      id: Number(e.target.dataset.id)
    });
  };
 
  // [삭제] 버튼 클릭으로 해당 Todo 항목 삭제하기
  const handleRemove = e => {
    setTodo({
      type: 'remove',
      id: Number(e.target.dataset.id)
    });
  };
 
  return (
    <div>
      <label>
        할 일:
        <input type="text" name="todo"
          value={title} onChange={handleChangeTitle} />
      </label>
      <button type="button"
        onClick={handleAdd}>추가</button>
      <hr />
      <ul>
        {todo.map(item => (
          <li key={item.id}
            className={item.isDone ? 'done' : ''}>
            {item.title}
            <button type="button"
              onClick={handleDone} data-id={item.id}>완료
            </button>
            <button type="button"
              onClick={handleRemove} data-id={item.id}>삭제
            </button>
          </li>
        ))}
      </ul>
    </div>
  );
}