내일배움캠프 6주차 TIL

내일배움캠프 6주차 6-5 TIL (너무어려운 리엑트..)투두리스트만들기

YOOYOUNGJAE 2022. 12. 12. 09:21
728x90

살려주세요... 진도가너무빨라용

유즈스테이트를 활용한 투두리스트를 만들어봣다

클론코딩이지만 상당한 난이도를 가지고있는거같다

 

조금더 공부를열심히해야할거같다

import React from 'react';
import { useState } from 'react';
import { v4 as uuid } from 'uuid';

export default function AddForm({ setTodos }) {
    const [todoValue, setTodoValue] = useState('');

    //input값이 바뀔대 값을 업데이트하는곳
    const handleChange = (event) => {
        setTodoValue(event.target.value);  //event의 target.value값을 가져옴
    };

    //form이 submit되면 실행되a면서 요소를 추가함
    const addTodo = (event) => {
        event.preventDefault(); // 새로고침을 막음
        const todo = todoValue.trim(); // 앞뒤 공백을 제거한다
        if (!todo) {
            setTodoValue('');  //만약 input값이 없으면 초기화후 리턴한다
            return;
        }

        //todo리스트 추가
        setTodos((prev) => [...prev, { todo, isDone: false, id: uuid() }]);
        setTodoValues('')
    }
    return (
        <div className='addform-container'>
            <form className='addform' onSubmit={addTodo}>
                <label className='addform_label' htmlFor="New-Todo">
                    ToDo{''}
                </label>
                <input
                    className='addform-input'
                    id='newTodo'
                    name='newTodo'
                    type="text"
                    onChange={handleChange}
                    autoFocus={true}
                    value={todoValue}
                />
                <Button value="생성" />
            </form>

        </div>
    );
}
import React from "react";

export default function TodoList({ name, todos, setTodos }) {
  const isActiveList = name === "active" ? true : false;
  return (
    <div className="todo-list">
      {/* 할일과 완료 리스트에 따라서 텍스트들 표시 */}
      <h2 className="todo-list-title">{isActiveList ? "할일🔥" : "완료✅"}</h2>
      {todos
        .filter((t) => isActiveList === !t.isDone)
        .map((t) => (
          <Todo
            todo={t.todo}
            isDone={t.isDone}
            setTodos={t.setTodos}
            key={t.id}
            id={t.id}
          />
        ))}
    </div>
  );
}
import React, { Children } from 'react';

export default function Title({ children }) {
    return (
        <h1 className='title'>{children}</h1>
    );
}

// Title 의 children 요소를 타이틀 제목으로 사용
// porps가 아닌 구조분해할당으로 요소를 보냄
import React from 'react';

export default function button({ handleClick, value }) {
    // 구조분해할당으로 handleClick, value값을 가져와서 할당해줌
    return (
        <button className='btn' onClick={handleClick}>
            {value}
        </button>
    );
}
import "./App.css";
import Title from "./components/Title/Title";
import AddForm from "./components/AddForm/AddForm";
import TodoList from "./components/TodoList/TodoList";
import { useState } from "react";

export default function App() {
  const [todos, setTodos] = useState[initialTodos];

  return (
    <div className="container">
      {/* title */}
      {/* components에서 프롬프트를 가져옴 */}
      <Title>Sparta Todo</Title>
      {/* 내용을 추가하는 FORM */}
      <AddForm setTodos={setTodos} />
      <div className="todo-list">
        <TodoList name="active" todos={todos} setTodos={setTodos} />
        <TodoList name="done" todos={todos} setTodos={setTodos} />
      </div>
    </div>
  );
}
728x90