๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Wanted-pre-onboarding-7

์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ์‚ฌ์ „๊ณผ์ œ todos.js ๋ฆฌํŒฉํ† ๋ง

by ์€์ง€:) 2022. 10. 24.
728x90
๋ฐ˜์‘ํ˜•

 

 

 

 

 

๐Ÿ‘† ๊ตฌํ˜„ํ•œ auth ํŽ˜์ด์ง€ ์›€์งค

 

 

 

 

 

 

๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ

 

TodoList ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

Todo ์ถ”๊ฐ€ / ์‚ญ์ œ / ์ˆ˜์ • / ์ˆ˜์ • ์ทจ์†Œ ๊ธฐ๋Šฅ

 

 

 

 

 


 

 

 

 

 

๐Ÿ‘‡ src ํด๋” ๊ตฌ์กฐ

 

 

 

 

 

 

todo ํด๋” ์•ˆ์—

 

Todos.js - TodoList.js - Todo.js ๋กœ ๋‚˜๋ˆ„์—ˆ๋˜ ์ปดํฌ๋„ŒํŠธ ์ค‘์—์„œ ๋ฆฌํŒฉํ† ๋งํ•˜๋ฉฐ TodoList.js ๋ฅผ ์ง€์› ๋‹ค. ๋Š˜ List๋ฅผ ์ด์šฉํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ๋ฒˆ ๋” ๋‚˜๋ˆ„์—ˆ์—ˆ๋Š”๋ฐ ๋‹จ์ˆœ props๋งŒ ๋„˜๊ฒจ์ฃผ๋Š” ์—ญํ• ์€ ๊ตณ์ด ํ•„์š”์—†๋‹ค๋Š” ๋™๊ธฐ์˜ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ!

 

๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด todos.js์˜ axios๋งŒ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด API ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ์•ˆ์— TodoAxios.js ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค

 

 

 

 

 

 

 

 

 

 

 

๐Ÿ‘‡ ๋ฆฌํŒฉํ† ๋งํ•œ ์ฝ”๋“œ

 

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ

const Todos = () => {
  // todo ์ถ”๊ฐ€ํ•  ๋•Œ ์“ฐ์ด๋Š” Input value state
  const [todoInput, setTodoInput] = useState('');
  
  // todo ๋ฐ์ดํ„ฐ ๋ฐ›๋Š” state
  const [todos, setTodos] = useState([]);

  const navigate = useNavigate();

  const onChangeTodo = e => setTodoInput(e.target.value);

// todo ์ถ”๊ฐ€์‹œ
  const plusTodo = async e => {
    e.preventDefault();
    const data = await TodoAxios.ADD(todoInput);
    setTodos(pre => [...pre, data]);
    setTodoInput('');
  };
  
// ์ฒดํฌ๋ฐ•์Šค value
  const checkboxHandler = checkedId => {
    setTodos(pre =>
      pre.map(({ id, isCompleted, todo, userId }) => {
        if (id === checkedId) {
          isCompleted = !isCompleted;
        }

        return { id, isCompleted, todo, userId };
      })
    );
  };

// todo ์ˆ˜์ • ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ˆ˜์ •๋ชจ๋“œ๋กœ ์ „ํ™˜, ํ•ด๋‹น todo id๋ฅผ checkedId ๋ผ๋Š” ์ธ์ž๋กœ ๋ฐ›์•„ id ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” todo์— ์ฒดํฌ๋ฐ•์Šค๋‚˜ input value๋ฅผ ๋ฐ”๊ฟˆ
(๋ฐ์ดํ„ฐ ํ†ต์‹  โŒ)

  const UpdateValue = (e, checkedId) => {
    setTodos(pre =>
      pre.map(({ id, isCompleted, todo, userId }) => {
        if (id === checkedId) {
          todo = e.target.value;
        }
        return { id, isCompleted, todo, userId };
      })
    );
  };

// todo ์ˆ˜์ •๋ชจ๋“œ์—์„œ ์ œ์ถœ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ์‹œ ์ž‘๋™, todos์—์„œ ํ•ด๋‹น id ๊ฐ’์„ ๋ฐ์ดํ„ฐ ํ†ต์‹ 
  const TodoModify = async (e, checkedId, setToogle) => {
    e.preventDefault();
    const [targetValue] = todos.filter(({ id }) => id === Number(checkedId));
    await TodoAxios.PUT(checkedId, targetValue.todo, targetValue.isCompleted);
    setToogle(pre => !pre);
  };


// todo ์ˆ˜์ •๋ชจ๋“œ ์•„๋‹ ๋•Œ ์‚ญ์ œ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ์‹œ ์ž‘๋™
  const TodoDelete = async (e, checkedId, setToogle) => {
    e.preventDefault();
    await TodoAxios.DELETE(checkedId);
    setTodos(prev => prev.filter(({ id }) => id !== Number(checkedId)));
    setToogle(pre => !pre);
    alert('์‚ญ์ œ ์™„๋ฃŒ');
  };

// todo ์ˆ˜์ •๋ชจ๋“œ์—์„œ ์ทจ์†Œ๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ ์ž…๋ ฅํ•œ ๊ฐ’ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๋Š” ํ•จ์ˆ˜
  const TodoChange = (e, checkedId, setToogle, Ref) => {
    e.preventDefault();
    setTodos(prev =>
      prev.map(({ id, userId, isCompleted, todo }) => {
        if (id === checkedId) {
          isCompleted = Ref.current[0];
          todo = Ref.current[1];
          Ref.current[1] = '';
        }
        return { id, userId, isCompleted, todo };
      })
    );
    setToogle(pre => !pre);
  };
  
  //todo ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๋Š” ํ•จ์ˆ˜
    useEffect(() => {
    TodoAxios.GET(navigate, setTodos);
  }, [navigate]);

 

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ

const Todo = ({
  todoItem,
  checkboxHandler,
  UpdateValue,
  TodoModify,
  TodoDelete,
  TodoChange,
}) => {
  
  // ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น
  const { id, todo, isCompleted } = todoItem;
  
  // ์ˆ˜์ •๋ชจ๋“œ (๊ธฐ๋ณธ๊ฐ’ false)
  const [toogle, setToogle] = useState(false);
  
  // ๊ฐ™์€ ๋ฒ„ํŠผ์„ toogle ๊ฐ’์„ ์ด์šฉํ•ด ์žฌ์‚ฌ์šฉ
  const statusModify = toogle ? '์ œ์ถœ' : '์ˆ˜์ •';
  const statusDelete = toogle ? '์ทจ์†Œ' : '์‚ญ์ œ';
  const Ref = useRef([]);

  // todo ์ž…๋ ฅ์ฐฝ (์ˆ˜์ •๋ชจ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด readOnly, ๋งž๋‹ค๋ฉด ์ˆ˜์ •๊ฐ€๋Šฅํ•˜๋„๋ก UpdateValue ํ•จ์ˆ˜๋กœ ๊ฐ)
  const inputProps = !toogle
    ? { readOnly: true }
    : { onChange: e => UpdateValue(e, id) };


  // ์ˆ˜์ •๋ชจ๋“œ ๊ฐ’์— ๋”ฐ๋ผ ์ˆ˜์ • / ์ œ์ถœ
  const TodoModifyProps = !toogle
    ? { // ์ˆ˜์ • ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ๋ถ€ํ„ฐ์˜ ๊ฐ’์„ ์ €์žฅ (ํ›„์— ๊ทธ ๊ฐ’๋งŒ ์ทจ์†Œํ•˜๊ธฐ ์œ„ํ•จ)
        onClick: () => {
          setToogle(true);
          Ref.current[0] = isCompleted;
          Ref.current[1] = todo;
        },
      } 
    : { // ์ˆ˜์ •ํ•œ ๊ฐ’ todo ์ „์ฒด๋ฅผ ๋ฐ›์•„์„œ TodoModify ํ•จ์ˆ˜๋กœ ์ธ์ž๋ฅผ ๋ณด๋ƒ„
        onClick: e => {
          TodoModify(e, id, setToogle, todo);
        },
      };
      
      
  // ์ˆ˜์ •๋ชจ๋“œ ๊ฐ’์— ๋”ฐ๋ผ ์‚ญ์ œ / ์ทจ์†Œ (์ˆ˜์ • ์ทจ์†Œ)
  const TodoDeleteProps = !toogle
    ? { onClick: e => TodoDelete(e, id, setToogle) }
    : {
        onClick: e => {
          TodoChange(e, id, setToogle, Ref);
        },
      };

 

 

 

์ด๋ฒˆ์— ์ œ์ถœํ•˜๋ฉด์„œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ๋ถ™๊ณ ์žํ•˜๋Š” ๋ชฉํ‘œ๋„ ์žˆ์—ˆ์ง€๋งŒ

์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ์— ์‹ ๊ฒฝ์“ฐ๊ณ ์ž state ์‚ฌ์šฉ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋ ค ๋…ธ๋ ฅํ–ˆ๋‹ค

๋ฐ์ดํ„ฐ ๋ฐ›๋Š” state ์™ธ์—” ์“ฐ์ง€ ์•Š๊ณ ์ž ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ์†์— ์ต๋‹ค๋ณด๋‹ˆ ์‚ฌ์‹ค ๋ฆฌํŒฉํ† ๋ง ์ „์—๋Š” ์ด์™ธ์—๋„ state ๊ฐ€ ๋งŽ์•˜๋‹ค ๐Ÿฅฒ

 

์ฒดํฌ๋ฐ•์Šค value ๋•Œ๋ฌธ์— ๊ณ ์ƒ์„ ๋งŽ์ดํ–ˆ๋Š”๋ฐ

์ˆ˜์ •๋ชจ๋“œ์—์„œ๋งŒ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ˆ˜์ •์ด ๋˜๊ณ  ์ œ์ถœ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ ๊ฐ’์ด ๋“ค์–ด๊ฐ€ ์กฐ๊ธˆ ์•„์‰ฝ๋‹ค

 

์ฒดํฌ ๋ฐ•์Šค ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณผ๊นŒ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ฐ€๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฑด 

๋น„ํšจ์œจ์ ์ด๋ผ ๋Š๊ปด ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค

 

์ด ์ž‘์—…์œผ๋กœ ๋ Œ๋”๋ง์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๊ณ  State ์‚ฌ์šฉ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๊ฐ์ด ์กฐ๊ธˆ์€ ์žกํžŒ ๊ฑฐ ๊ฐ™์•„ ๋งŽ์ด ๋ฐฐ์› ๋‹ค ์ƒ๊ฐํ•œ๋‹ค

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์žˆ๋Š” props๋ฅผ ์ƒ์œ„๋กœ ๋Œ์–ด ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ฒ˜์Œ์ด์—ˆ๋Š”๋ฐ ๊ฐ’์ง„ ๊ฒฝํ—˜์ด๋ผ ๋Š๋‚€๋‹ค

 

์•ž์œผ๋กœ ์žˆ์„ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ํ”„๋กœ์ ํŠธ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋ณด๋‹ค ์ข‹์€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด๋‚ด์–ด์„œ ๋ฟŒ๋“ฏํ•˜๋‹ค

์™„๋ฒฝํ•˜๊ณ  ์ž˜ ์“ฐ์—ฌ์ง„ ์ฝ”๋“œ๋ผ๊ณค ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ „๋ณด๋‹ค ๋ฐœ์ „๋œ, ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž์— ํ•œ ๋ฐœ์ง ๋” ๋‹ค๊ฐ€์„ฐ๋‹ค ๋Š๋‚€๋‹ค :)

 

 

 

 

 

๐Ÿ‘‡ ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ ๋งํฌ

 

https://github.com/Joeunji0119/wanted-pre-onboarding-frontend

 

GitHub - Joeunji0119/wanted-pre-onboarding-frontend

Contribute to Joeunji0119/wanted-pre-onboarding-frontend development by creating an account on GitHub.

github.com

 

 

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€