ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๊ธฐ์—…๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น li์˜ ๋ฐฐ๊ฒฝ์ƒ‰์ด ๋ฐ”๋€Œ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„(์„ ํƒ๋œ ํšจ๊ณผ)์„ ์ฒ˜์Œ ํ•ด๋ณด์•˜๋‹ค.
์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋จธ๋ฆฌ๋กœ๋Š” ์กฐ๊ธˆ ์•Œ๊ฒ ๋Š”๋ฐ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์‰ฝ๊ฒŒ ๋˜์ง€ ์•Š์•„์„œ ๊ฒ€์ƒ‰์„ํ•˜๋ฉฐ ๊ฒจ์šฐ ๊ตฌํ˜„์„ ํ–ˆ๋‹ค.
์žŠ์–ด๋ฒ„๋ฆฌ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ •๋ฆฌ๋ฅผ ํ•ด๋ณธ๋‹ค!

โš™๏ธ ๊ธฐ๋Šฅ

App.js

import { Table } from "./components/Table/Table";

function App() {
  const d = new Date();
  const year = d.getFullYear();
  let month = d.getMonth() + 1;
  let day = d.getDate();

  if (month <= 9) month = `0${month}`;
  if (day <= 9) month = `0${day}`;

  const date = `${year}-${month}-${day}`;

  const data = [
    {
      no: 1,
      title: "์•ˆ๋…•ํ•˜์„ธ์š”? ์ตœ๊ณ  ๊ท€์—ฌ์šด ์ถ˜์‹์ž…๋‹ˆ๋‹ค.",
      name: "์ถ˜์‹",
      date: date,
    },
    {
      no: 2,
      title: "์˜ค๋Š˜์€ ์ฒดํฌ๋ฐ•์Šค ์ฒดํฌ ์‹œ li์— ๋ณ€ํ™”๋ฅผ ์ค˜๋ณด์•˜์Šต๋‹ˆ๋‹ค.",
      name: "์ •์Œ",
      date: date,
    },
    {
      no: 3,
      title: "๋ฆฌ์•กํŠธ๋Š” ์ •๋ง ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์•„์š”.",
      name: "๊ณ ์‹ฌ์ด",
      date: date,
    },
    {
      no: 4,
      title: "๋ฒŒ์จ 4์›”๋ง์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋น ๋ฅด๋„ค์š”.",
      name: "์ •์Œ",
      date: date,
    },
    {
      no: 5,
      title: "์ž„์˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์—ฐ์Šต์šฉ์ด์—์š”!",
      name: "์ •์Œ",
      date: date,
    },
  ];
  return (
    <div>
      <h1>์ฒดํฌ๋ฐ•์Šค ์ฒดํฌ ์‹œ li ๋ณ€ํ™”์‹œํ‚ค๊ธฐ</h1>
      <Table data={data} />
    </div>
  );
}
export default App;

๋จผ์ € ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.
ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ๋Š” div, ul, liํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

1. ๊ฐœ๋ณ„ ์ฒดํฌ/ํ•ด์ œ

  // ๊ฐœ๋ณ„ ์ฒดํฌ
  // ์ฒดํฌ๋œ ์•„์ดํ…œ์˜ ์•„์ด๋””๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ
  // ์ฒดํฌ๊ฐ€ false์ด๋ฉด ํ•ด๋‹น item์˜ id๊ฐ€ ์•„๋‹Œ ๊ฒƒ๋“ค๋งŒ ๋‹ด์Œ.
const [checkedItems, setCheckedItems] = useState([]);

  const onChangeCheckBox = (e, item) => {
    const isChecked = e.target.checked;
    setCheckedItems((prevCheckedItems) => {
      if (isChecked) {
        return [...prevCheckedItems, item.no];
      } else {
        return prevCheckedItems.filter((no) => no !== item.no);
      }
    });
  };

๊ฐœ๋ณ„ ์ฒดํฌ์˜ ๊ฒฝ์šฐ, ๊ฐ li์— onChange์ด๋ฒคํŠธ๊ฐ€ ๋“ค์–ด์™”์„ ๋•Œ ๋ฐฐ๊ฒฝ ์ƒ‰์ƒ์ด ๋ณ€ํ•˜๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.
checkedItems๋ฐฐ์—ด์€ ์ฒดํฌ๋œ ์•„์ดํ…œ์˜ index ๋ฒˆํ˜ธ(no)๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”๋ฐ
checked๊ฐ€ true๋ผ๋ฉด ๊ธฐ์กด ๋ฐฐ์—ด์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์•„์ดํ…œ์˜ no๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ฒดํฌ๊ฐ€ ํ•ด์ œ๋˜๋ฉด checked๊ฐ€ false์ด๋ฏ€๋กœ ์ด๋•Œ์—๋Š” ์ฒดํฌ๋œ ๊ฒƒ๋งŒ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๋ฆฌํ„ดํ•œ๋‹ค.

{data.map((item) => (
  <li
    key={item.no}
    className={checkedItems.includes(item.no) ? "select" : ""}
  >
    {์ดํ›„ ์ฝ”๋“œ๋“ค...}

์ด๋ ‡๊ฒŒ ๋˜๋ฉด checkedItems ๋ฐฐ์—ด์— ํ•ด๋‹นํ•˜๋Š” item.no๊ฐ€ ์žˆ๋‹ค๋ฉด li์— select ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ฐฐ๊ฒฝ์ƒ‰์„ ์ ์šฉํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

2. ์ „์ฒด ์ฒดํฌ/ํ•ด์ œ

// ์ „์ฒด ์ฒดํฌ
  const onCheckBoxAll = (e) => {
    if (e.target.checked) {
      const checkedListArr = [];
      data.forEach((item) => checkedListArr.push(item.no));
      setCheckedItems(checkedListArr);
    } else {
      setCheckedItems([]);
    }
  };

์ „์ฒด ์ฒดํฌ๋Š” ํ…Œ์ด๋ธ”์˜ header์— ์žˆ๋Š” checkBox์—์„œ onChange ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
checked๊ฐ€ true๋ผ๋ฉด ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ forEach๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ item.no๋“ค์„ ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฐฐ์—ด์„ checkedItems์— ๋„ฃ์–ด useState๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค.

๋งŒ์•ฝ checked๊ฐ€ false๋ผ๋ฉด checkedItems๊ฐ€ ๋นˆ๋ฐฐ์—ด์ด ๋˜์–ด ์ „์ฒด ์ฒดํฌ ํ•ด์ œ๊ฐ€ ๋œ๋‹ค.

๋Œ“๊ธ€