React

[React] To-do list ๋งŒ๋“ค๊ธฐ

๋ฒผ๋ฆฌ01 2024. 5. 27. 13:52

๐Ÿ“Œํ™˜๊ฒฝ

Mac

VSCode

 

 

๐Ÿ“Œ์ถ”๊ฐ€ํ•˜๊ธฐ

`input`์— ํ• ์ผ์„ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ์ž…๋ ฅ(๋˜๋Š” ์ถ”๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ)ํ• ์ผ ๋ชฉ๋ก์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.

 

function App() {
  return (
    <div>
      <h1>ํ• ์ผ ๋ชฉ๋ก</h1>
      <form>
        <input
          type="text"
          placeholder="ํ•  ์ผ"
        />
        <button>์ถ”๊ฐ€</button>
      </form>
    </div>
  );
}

export default App;

 

๊ธฐ๋ณธ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ `useState`์™€ `onChange` ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

  const [toDo, setTodo] = useState("");
  const [todoList, setTodoList] = useState([]);

  function onChange(e) {
    setTodo(e.target.value);
  }
  
  // ...
  
  <form onSubmit={onSubmit}>
        <input
          onChange={onChange}
          value={toDo}
          type="text"
          placeholder="ํ•  ์ผ"
        />
        <button>์ถ”๊ฐ€</button>
      </form>

 

์ด์ œ `input` ์ž…๋ ฅ ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๊ฐ์ง€๋˜๋ฉด `todo`๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. 

ํ• ์ผ์„ ์ž…๋ ฅํ•˜๋ฉด `input`์ด ๋ฆฌ์…‹๋˜์–ด์•ผํ•˜๊ณ , ์ž…๋ ฅ๋œ `todo`๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. `todoList`์™€ `onSubmit` ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

const [toDo, setTodo] = useState("");
const [todoList, setTodoList] = useState([]);

function onChange(e) {
	setTodo(e.target.value);
}

function onSubmit(e) {
    e.preventDefault();
    if (toDo === "") {
      return;
    }
    setTodoList((currentArray) => [toDo, ...currentArray]);
    setTodo("");
}
  
useEffect(() => console.log(todoList), [todoList]);
  
  // ...
  
  
<form onSubmit={onSubmit}>
    <input
      onChange={onChange}
      value={toDo}
      type="text"
      placeholder="ํ•  ์ผ"
    />
    <button>์ถ”๊ฐ€</button>
</form>

 

 

 

 

`setTodoList`์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. `todo`๋ฅผ ๋ถ™์ธ ์ƒˆ ๋ฐฐ์—ด๋กœ `todoList`๋ฅผ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ˜„์žฌ์˜ `todoList`๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ(์–•์€ ๋ณต์‚ฌ), `toDo`์™€ `todoList`๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค. ์ด๋•Œ ๋ฐฐ์—ด์ด `[toDo, currentArray]`๊ฐ€ ๋˜๋ฉด ๋ฐฐ์—ด ์•ˆ์— `currentArray` ๋ฐฐ์—ด์ด ๋“ค์–ด๊ฐ„ ์ด์ƒํ•œ ๋ชจ์–‘(ํ• ์ผ, [Array]) ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— spread ์—ฐ์‚ฐ์ž(...)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ๊บผ๋‚ด์™€์•ผ ํ•œ๋‹ค. 

`todoList`๋ฅผ ์–•์€ ๋ณต์‚ฌํ•œ `currentArray`๊ฐ€ ํ• ์ผ ๋ชฉ๋ก์„ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, `...currentArray`๋Š” `[์…‹, ๋‘˜, ํ•˜๋‚˜]` ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

* ์ตœ์‹  ํ• ์ผ์ด ํ•˜๋‹จ์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋ฉด `setTodoList((currentArray) => [toDo, ...currentArray]);`๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

๐Ÿ“Œ ์ถœ๋ ฅํ•˜๊ธฐ

ํ• ์ผ์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋‹ˆ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค˜์•ผํ•œ๋‹ค. ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ return๋ฌธ ์•ˆ์—๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์—ด์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ `map()` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ `todoList`์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด `<li>`ํƒœ๊ทธ์— ๋„ฃ์–ด ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑํ•œ๋‹ค.

* ํ• ์ผ ๋ชฉ๋ก์ด 0๊ฐœ๋ผ๋ฉด `n๊ฐœ`๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 return (
    <div>
      <h3>
        ํ• ์ผ ๋ชฉ๋ก {todoList.length == 0 ? null : "| " + todoList.length + "๊ฐœ"}
      </h3>
      <form onSubmit={onSubmit}>
        <input
          onChange={onChange}
          value={toDo}
          type="text"
          placeholder="ํ•  ์ผ"
        />
        <button>์ถ”๊ฐ€</button>
      </form>
      <hr />
      {todoList.map((item, index) => (
        <li key={index}>
          {index + 1}. {item}
        </li>
      ))}
    </div>
  );

 

 

 

 

๐Ÿ“Œ ์‚ญ์ œํ•˜๊ธฐ

๋ชฉ๋ก ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ์ถœ๋ ฅ ์‹œ ์‚ญ์ œ ๋ฒ„ํŠผ์„ ํ•จ๊ป˜ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค. `map()` ํ•จ์ˆ˜ ์•ˆ์— ์‚ญ์ œ ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ , `onClick` ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. `todoList`๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด์˜ `filter()` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

  
  function changeTodoList(e) {
    console.log(e);
    let item = e.target.value;
    setTodoList((currentArray) =>
      currentArray.filter((element) => element !== item)
    );
  }
  
 
  
  // ...
  
  
  return (
    <div>
      <h3>
        ํ• ์ผ ๋ชฉ๋ก {todoList.length == 0 ? null : "| " + todoList.length + "๊ฐœ"}
      </h3>
      <form onSubmit={onSubmit}>
        <input
          onChange={onChange}
          value={toDo}
          type="text"
          placeholder="ํ•  ์ผ"
        />
        <button>์ถ”๊ฐ€</button>
      </form>
      <hr />
      {todoList.map((item, index) => (
        <li key={index}>
          {index + 1}. {item}
          <button value={item} onClick={changeTodoList}>
            ์‚ญ์ œ
          </button>
        </li>
      ))}
    </div>
  );

 

 

 

 

 

 

 

๐Ÿ“Œ์ฐธ๊ณ 

 

ReactJS๋กœ ์˜ํ™” ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ – ๋…ธ๋งˆ๋“œ ์ฝ”๋” Nomad Coders

React for Beginners

nomadcoders.co

 

์ „๊ฐœ ๊ตฌ๋ฌธ - JavaScript | MDN

์ „๊ฐœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž๋ฅผ 0๊ฐœ ์ด์ƒ์˜ ์ธ์ˆ˜ (ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ) ๋˜๋Š” ์š”์†Œ (๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฒฝ์šฐ)๋กœ ํ™•์žฅํ•˜์—ฌ, 0๊ฐœ ์ด์ƒ์˜ ํ‚ค-๊ฐ’์˜ ์Œ์œผ๋กœ ๊ฐ์ฒด๋กœ ํ™•์žฅ์‹œ

developer.mozilla.org

 

'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] Can't resolve 'queryString' in ...  (0) 2025.03.13
[React] ๋ฆฌ๋•์Šค(Redux)  (0) 2025.03.04
[React] ๊ธฐ์ดˆ  (0) 2024.05.14