๐Ÿš€React ์ฑŒ๋ฆฐ์ง€ Day7

westZeroยท2023๋…„ 6์›” 23์ผ
0

JS & ๋ฆฌ์•กํŠธ ์ฑŒ๋ฆฐ์ง€

๋ชฉ๋ก ๋ณด๊ธฐ
7/10

TIL day7 ๐Ÿšฉ

์•ผ ๋„ˆ๋‘ todolist๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด!.. (๊ทผ๋ฐ ์ด์ œ db์—ฐ๊ฒฐ๋„ ๊ฐ€๋Šฅํ•ด์•ผ...)

์˜ค๋Š˜๋„ ์—ญ์‹œ๋‚˜ ๋…ธ๋งˆ๋“œ์ฝ”๋”์˜ react์˜ํ™”์›น์„ ๋“ค์—ˆ๋Š”๋ฐ..
์ด๋ฒˆํšŒ์ฐจ๋Š” todolist ๋งŒ๋“ค๊ธฐ..
์•„๋‹ˆ ๋ชจ๋“  ๊ฐœ๋ฐœ์˜ ๊ธฐ๋ณธ์€ todolist์ธ๊ฑธ๊นŒ๋‚˜...
์•„๋ฌดํŠผ...

์—ด์‹ฌํžˆ ๋‹ค ๋“ฃ๊ณ  ์ด์ œ TIL๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋! ์ด๋žฌ๋Š”๋ฐ...
์—ฌ๊น€์—†์ด ๋‹ค๋ฅธ ์ˆ˜๊ฐ•์ƒ ๋Œ“๊ธ€์„ ๋ณด๋‹ค๊ฐ€...

kingoxpo๋‹˜ ๋‹น์‹ ์„ ์ฐพ์•„๋‚ด์„œ!!
๊ฐ์‚ฌํ•˜๋‹ค๊ณ  ํ•˜๊ณ ์‹ถ๋‹ค..
๋‚˜๋„ ์‚ญ์ œ๊ธฐ๋Šฅ ํ•˜๋Ÿฌ๊ฐ„๋‹ค..
์ผ๋‹จ ๊ฐ„๋‹ค..

์ผ๋‹จ ์ด์ „์— ๋งŒ๋“ค์—ˆ๋˜ todolist ์ฐธ๊ณ ํ•˜๊ธฐ

์ผ๋‹จ ์ „์— ์“ฐ๋˜ ์‚ญ์ œ๊ธฐ๋Šฅ ๋„๋ฌด์ง€ ๋ชจ๋ฅด๊ฒ ์Œ ,,,
๊ทธ๊ฑฐ ์ฝ”๋“œ ๋ถ„์„๋งŒ ๋งŒ ํ•˜๋ฃจ๋ฅผ ํ–ˆ๋Š”๋ฐ ์กฐ๋˜ ๋ชจ๋ฅด๊ฒ ์–ด์š”,,
์‚ด๋ ค์ฃผ์„ธ์š”,,,

๋ฐฑ๋‚  ์ฒœ๋‚  ๋ด๋„ ๋ชจ๋ฅด๊ฒ ์–ด์š”...
์‚ด๋ ค์ค˜,,,

import React, { useState, useEffect } from "react";

function useTodoList() {
  const [todoList, setTodoList] = useState([]);
  //todolist ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜

  function addTodo(content) {
    if (!todoList.every((todo) => todo.content !== content)) {
      //์ถ”๊ฐ€์ „์— ์ค‘๋ณต๊ฐ’ ์ฒดํฌํ•˜๋Š” ๋ถ€๋ถ„
      alert("๋˜‘๊ฐ™์€ ํ•  ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
      return;
    }
    setTodoList((oldTodos) => [...oldTodos, { content, done: false }]);
    //์œ„์— if๋ฌธ์—์„œ ์ค‘๋ณต๊ฐ’ ํ™•์ธ
  }

  function checkTodo(targetContent) {
    //check๋œ ๋ถ€๋ถ„์€ ์ƒํƒœ๊ฐ’ ์™„๋ฃŒ๋กœ ๊ฐ€์ ธ๊ฐ€๊ธฐ
    setTodoList((oldTodos) =>
      oldTodos.map((todo) =>
        todo.content === targetContent ? { ...todo, done: !todo.done } : todo
      )
    );
  }

  function deleteTodo(targetContent) {
    //์‚ญ์ œ๊ธฐ๋Šฅ
    //deleteTodo ํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ targetContent๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ด ์ธ์ž๋Š” ์‚ญ์ œ๋ฅผ ํ•˜๋ ค๋Š” ํ•  ์ผ ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
    setTodoList(
      (oldTodos) =>
        //๊ธฐ์กด๊บผ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค
        oldTodos.filter((todo) => todo.content !== targetContent)
      //oldTodos.filter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด์˜ todoList ๋ฐฐ์—ด์—์„œ ์‚ญ์ œํ•˜๊ณ ์ž ํ•˜๋Š” ํ•  ์ผ ํ•ญ๋ชฉ์„ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
      //filter ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ, ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ todo.content !== targetContent์ธ์ง€ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.
      //๋งŒ์•ฝ todo.content(ํ•  ์ผ ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ)๊ณผ targetContent(์‚ญ์ œํ•˜๋ ค๋Š” ํ•ญ๋ชฉ์˜ ๋‚ด์šฉ)์ด ๋‹ค๋ฅด๋‹ค๋ฉด, ํ•ด๋‹น todo ํ•ญ๋ชฉ์„ ํฌํ•จํ•˜๊ณ ,
      //๊ฐ™๋‹ค๋ฉด ํ•ด๋‹น todoํ•ญ๋ชฉ์„ ๋ฐฐ์ œํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    );
  }

  return {
    todoList,
    addTodo,
    checkTodo,
    deleteTodo,
  };
}

function App() {
  const { todoList, addTodo, checkTodo, deleteTodo } = useTodoList();
  //๋ณ€์ˆ˜๋กœ ์•ž์— ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•จuseTodoList๋กœ ํ˜ธ์ถœํ•จ

  const [todoInput, setTodoInput] = useState("");

  function handleChange(e) {
    setTodoInput(e.target.value);
  }

  function handleSubmit(e) {
    e.preventDefault();
    addTodo(todoInput);
    setTodoInput("");
  }
  //submit๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด addtodo๊ฐ€ ๋œ๋‹ค
  const [selected, setSelected] = useState("all");
  //์ „์ œ์ƒํƒœ ์ง€์ •ํ•˜๋Š” ํ•จ์ˆ˜
  function handleSelect(e) {
    setSelected(e.target.value);
  }

  const [filteredList, setFilteredList] = useState(todoList);

  useEffect(() => {
    if (selected === "all") {
      setFilteredList(todoList);
    } else if (selected === "done") {
      setFilteredList(todoList.filter((todo) => todo.done === true));
    } else if (selected === "active") {
      setFilteredList(todoList.filter((todo) => todo.done === false));
    }
  }, [selected, todoList]);

  return (
    <div className="todo">
      <div className="top"></div>

      <form onSubmit={handleSubmit} className="form">
        <label>
          <h2>to do list</h2>
          <input
            type="text"
            name="newTodo"
            onChange={handleChange}
            className="input"
            value={todoInput}
          ></input>
        </label>

        <button type="submit">โž•</button>
      </form>

      <div className="list">
        {filteredList.map((todo, i) => (
          <li key={todo.content}>
            <input
              type="checkbox"
              checked={todo.done}
              onClick={() => checkTodo(todo.content)}
            />
            {todo.content}
            <button onClick={() => deleteTodo(todo.content)}>x</button>
          </li>
        ))}
      </div>

      <select className="w150" onChange={handleSelect}>
        <option value="all">์ „์ฒด</option>
        <option value="active">์ง„ํ–‰ ์ค‘</option>
        <option value="done">์™„๋ฃŒ</option>
      </select>
    </div>
  );
}

export default App;

์•„๋ฌด๋ฆฌ ์ฃผ์„์„ ๋‹ฌ๊ณ  ๋‹จ์œ„๋ณ„๋กœ ๋ถ„์„ํ•ด๋„ ๋ชจ๋ฅด๊ฒ ๋‹จ๋ง์•ผ...
์ผ๋‹จ ๋ฆฌ์•กํŠธ๋Š” ๋ฐ›๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋„ˆ๋ฌด ๋งŽ์–ด์š”...

argument๋ฉฐ props๋ฉฐ ํ•˜
์ฃฝ๊ตฌ์‹ถ๋‹ค,

๋‹ค๋ฅธ ์ˆ˜๊ฐ•์ƒ๊บผ savageํ•ด์„œ ์‚ญ์ œ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

์•„๋ฌดํŠผ๊ฐ„์— ์–ด์ฉ” ์ˆ˜ ์—†์ด ๊ธฐ์กด์— ์žˆ๋˜ ๊ฐ•์˜์ƒ์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋Š”๋ฐ์š”,,,

const deleteBtn = (index) => {
    setToDos(toDos.filter((item, todoIndex) => index !== todoIndex));
  };
  const onSubmit = (event) => {
    event.preventDefault();
    if (toDo === "") {
      return;
    }

์ž๊พธ

export default App; Line 8:5:   'setTodos' is not defined  no-undef
                    Line 8:14:  'todos' is not defined     no-undef

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค,,
ํ•˜ ๋ฏธ์น˜๊ฒŸ๋‚ด,,, ์ด๋ฏธ ์ •์˜ ๋˜์–ด์žˆ๋Š”๋ฐ...

์™œ ๊ทธ๋Ÿฌ๋Š”๊ฑฐ์•ผ...

์•— ๋‚ด ์‹ค์ˆ˜,,

๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„๋ชปํ•˜๋Š” ๋‚˜๋ž€ ๋…€์„ ;ใ…‹

์ผ๋‹จ

์‚ญ์ œ ๊ฐ€๋Šฅํ•œ์ž…๋‹ˆ๋‹ค...

๋“ฑ๋ก์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๊ฒŒ ์ˆ˜์ •

๊ทธ๋Ÿฐ๋ฐ๋ง์ž…๋‹ˆ๋‹ค,,,
์ „ ๋“ฑ๋กํ•œ ์ˆœ์„œ๋Œ€๋กœ to do list๊ฐ€ ๋“ฑ๋ก๋˜๊ธธ ์›ํ–ˆ๋Š”๋ฐ..
์ด์ƒํ•œ ์ˆœ์„œ๋ผ๋‹ˆ,,,

๊ทธ๋ž˜์„œ

์ด ๊ธ€์„๋ณด๊ณ 

 <ul>
          {toDos.reverse().map((item, index) => (
            <li key={index}>
              {item}
              <button onClick={() => deleteBtn(index)}>โŒ</button>
            </li>
          ))}
        </ul>

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ๋”๋‹ˆ ๊ทธ๋ƒฅ ๊ฐ’์ด ์ž‘์€ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜ค๋Š”๊ฑฐ๋”๋ผ๊ณ ์š”...

์ด๋ ‡๊ฒŒ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Œ๋‹ค..
ํ•˜..

import { useState } from "react";

function App() {
  const [toDo, setToDo] = useState("");
  const [toDos, setToDos] = useState([]);
  const onChange = (event) => setToDo(event.target.value);
  const deleteBtn = (index) => {
    setToDos(toDos.filter((item, todoIndex) => index !== todoIndex));
  };
  const onSubmit = (event) => {
    event.preventDefault();
    if (toDo === "") {
      return;
    }
    //toDo = "" state๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์–ด์„œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•จ์ˆ˜๋กœ ์ˆ˜์ •ํ•จ ์ ˆ๋Œ€ ์ด๋Ÿฐ์‹์œผ๋กœ ์ง์ ‘์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ๋Œ
    setToDos((currentArray) => [...currentArray, toDo]); // ์ง์ ‘์ ์œผ๋กœ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ /๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์„ ํ•จ์ˆ˜๋กœ ๋ฐ›์„๊บผ์ž„
    //array [] ์—ฌ๊ธฐ์— ๊ธฐ์กด์— ์žˆ๋Š” ์–ด๋ ˆ์ด๋ฅผ [new(์ƒˆ๋กœ์šด๊ฐ’,) ์–ด๋ ˆ์ด๋ช… ]์ด๋ ‡๊ฒŒํ•˜๋ฉด ๊ฑ ์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ„ ์–ด๋ ˆ์ด๋Œ
    setToDo(""); // setTodo๋Š” value๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๊ณ  todoinput์ด๋ž‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์„œ input์ฐฝ ์ดˆ๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค "" ๋นˆ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์ค˜์•ผ ์ธํ’‹์ฐฝ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅํ•œ.
  };

  console.log(toDo);
  console.log(toDos);

  return (
    <div>
      <h1>my to dos ({toDos.length})</h1>
      {/* js์ฝ”๋“œ๋ฅผ ์“ฐ๊ธฐ์œ„ํ•ด์„œ๋Š” ์ด ์ฃผ์„์ฒ˜๋Ÿผ {} ๊ผญ ํ•„์ˆ˜ํ…œ */}
      <form onSubmit={onSubmit}>
        <input
          onChange={onChange}
          value={toDo}
          type="Text"
          placeholder="write your to do."
        />
        <button>Add To Do</button>
        <hr />
        <ul>
          {toDos.map((item, index) => (
            <li key={index}>
              {item}
              <button onClick={() => deleteBtn(index)}>โŒ</button>
            </li>
          ))}
        </ul>
        {/* JS์—์„œ์˜ map๊ธฐ๋Šฅ  ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด์˜ ๊ฐ๊ฐ์˜ elements๋“ค์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค. */}
        {/* map์€ [apple,banana, habana, oh nana].map(()์ด๋ถ€๋ถ„์— ์ฒซ๋ฒˆ์งธ argument๋กœ ํ˜„์žฌ์˜ item์„ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ์Œ=> "hello")) 
        ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฐฐ์—ด์˜ ๋ชจ๋“  elements๋“ค์ด hello๋กœ ๋ฐ”๋€œ  */}

        {/* map์€ [apple,banana, habana, oh nana].map((item)=> item.toUpperCase())) 
        ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋ฐฐ์—ด์˜ ๋ชจ๋“  elements๋“ค์˜ ์ฒซ๋ฒˆ์งธ ๊ธ€์ž๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๋€œ */}
      </form>
    </div>
  );
}
//  react.js๋Š” component๊ฐ€ ์ฃฝ์„ ๋•Œ๋„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์šฉ
export default App;

์ด์ƒ! ์™„๋ฃŒํ–ˆ๋Š”๋ฐ ๊ธ€์Ž„..

hsecode๋‹˜์˜ velog

์ด๋ ‡๊ฒŒ css๋„ ์ด์˜๊ณ  velog๋„ ์ž˜ ์“ฐ์‹œ๋‹ค๋‹ˆ..
์ž๊ทน๋ฐ›์•„์„œ ์ €๋„ ์ €๋Ÿฟ์บ ์จ๋ณผ๋ ต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ด์ƒ.

profile
mi carro es bonito

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด