TECH

[React] Checkbox (2) — ๋ฒ„ํŠผ์œผ๋กœ ์„ ํƒ ํ•ด์ œํ•˜๊ธฐ

ttaerrim 2022. 2. 21. 01:59

[React] Checkbox (1) — Context API๋กœ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์ด์–ด์ง€๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

 

 

 

 

๋ฒ„ํŠผ์œผ๋กœ ์ฒดํฌ๋ฐ•์Šค ํ•ด์ œํ•˜๊ธฐ

 

 

 

์ฒดํฌ๋ฐ•์Šค์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฒ„ํŠผ์œผ๋กœ ์ฒดํฌ๋ฐ•์Šค ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ฏค์€ ๊ปŒ์ž…๋‹ˆ๋‹ค.

 

 

 

์šฐ์„  ์ฒดํฌ๋œ ์š”์†Œ๋“ค์„ ๋ฒ„ํŠผ์œผ๋กœ ์ถœ๋ ฅํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฒ„ํŠผ ์š”์†Œ ํ•˜๋‚˜๋Š” Selected.jsx๋กœ ๋งŒ๋“ค๊ณ , ์ถœ๋ ฅ์€ CheckboxList์—์„œ ๊ฐ™์ด ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

1. ์ฒดํฌ๋œ ์š”์†Œ ๋ฒ„ํŠผ์œผ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ

      <div>
       {Object.keys(cateObject).map((key, index) => {
          return (
            <div key={index}>
              <Selected value={key} checked={cateObject[key]} />
            </div>
          );
        })}
      </div>

CheckboxList.jsx์˜ return ๋ฌธ์— ์ด๋Ÿฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.

value์—๋Š” ํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๊ณ , checked์—๋Š” true/false ์†์„ฑ์„ ์ „๋‹ฌํ•ด ์ค๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์†์„ฑ์ด false๋ผ๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•ด ์ฃผ์„ธ์š”๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋œจ๋„๋ก isAllFalse๋ผ๋Š” ๋ณ€์ˆ˜๋„ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

const [isAllFalse, setIsAllFalse] = useState(true);

  const handleIsAllFalse = () => {
    for (const [cate, bool] of Object.entries(cateObject)) {
      if (bool === true) {
        setIsAllFalse(false);
        break;
      }
      setIsAllFalse(true);
    }
  }

  useEffect(() => {
    handleIsAllFalse();
  }, [cateObject]);

useState๋กœ isAllFalse, setIsAllFalse๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , ์ดˆ๊ธฐ์—๋Š” ์„ ํƒ๋œ ๊ฐ’์ด ์—†์–ด ์ „๋ถ€ false์ผ ํ…Œ๋‹ˆ ์ดˆ๊นƒ๊ฐ’์„ true๋กœ ๋„ฃ์–ด ์ค๋‹ˆ๋‹ค.

 

handleIsAllFalse๋Š” cateObject๋ฅผ for๋ฌธ์œผ๋กœ ๋Œ๋ฉฐ bool์ด true์ธ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด isAllFalse๋ฅผ false๋กœ ์„ค์ •ํ•˜๊ณ  if ๋ฌธ์„ break๋กœ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์ „๋ถ€ false๋ผ๋ฉด isAllFalse๋ฅผ true๋กœ ์„ค์ •ํ•ด ์ค๋‹ˆ๋‹ค.

 

useEffect์— handelIsaFalse ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ์ฃผ๊ณ , cateObject๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋„๋ก ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ์–ด ์ค๋‹ˆ๋‹ค.

 

 

 

{isAllFalse && (
  <div>
    <p>์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์„ธ์š”.</p>
  </div>
)}

๊ทธ๋ฆฌ๊ณ  isAllFalse๊ฐ€ true๋ผ๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์„ธ์š” ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด ์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// CheckboxList.jsx

import React, { useContext, useEffect, useState } from "react";
import { CategoryContext } from "store/category";
import Checkbox from "./Checkbox";
import Selected from "./Selected";

const CheckboxList = () => {
  const { cateObject } = useContext(CategoryContext);
  const [isAllFalse, setIsAllFalse] = useState(true);

  const handleIsAllFalse = () => {
    for (const [cate, bool] of Object.entries(cateObject)) {
      if (bool === true) {
        setIsAllFalse(false);
        break;
      }
      setIsAllFalse(true);
    }
  }

  useEffect(() => {
    handleIsAllFalse();
  }, [cateObject]);

  return (
    <div>
      <div>
        {Object.keys(cateObject).map((key) => {
          return (
            <div className={styles.innerContainer} key={key}>
              <Checkbox value={key} checked={cateObject[key]} />
              {key}
            </div>
          );
        })}
      </div>
      <div>
        {Object.keys(cateObject).map((key) => {
          return (
            <div className={styles.innerContainer} key={key}>
              <Selected value={key} checked={cateObject[key]} />
            </div>
          );
        })}
        {isAllFalse && (
          <div>
            <p>์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์„ธ์š”.</p>
          </div>
        )}
      </div>
    </div>
  );
};

export default CheckboxList;

 

 

 

 

2. ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

 

 

๋‹ค์Œ์€ ๋ฒ„ํŠผ์„ ์ถœ๋ ฅํ•˜๋Š” Selected ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

 

// Selected.jsx

import { CategoryContext } from "store/category";

const Selected = ({ value, checked }) => {
  const { cateObject, setCateObject } = useContext(CategoryContext);

  const onClick = (e) => {
      let copyObject = { ...cateObject };
      copyObject[value] = !checked;
      setCateObject(copyObject);
  }

  return (
    checked && (
      <button onClick={onClick} value={value}>
        <p>{value}</p>
        <p>×</p>
      </button>
    )
  );
};

export default Selected;

๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

CheckboxList์—์„œ ์ „๋‹ฌํ•ด ์ค€ value์™€ ํ•จ๊ป˜ ๋ฒ„ํŠผ์„ ์ถœ๋ ฅํ•˜๊ณ  onClick ์ด๋ฒคํŠธ๋ฅผ ๋‹ฌ์•„ ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š”๋ฐ์š”.

onClick ํ•จ์ˆ˜์—์„œ๋Š” true์ธ checked ์†์„ฑ์„ false๋กœ ๋ฐ”๊ฟ” ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  checked๊ฐ€ true์ผ ๋•Œ๋งŒ ๋ฒ„ํŠผ์ด ๋งŒ๋“ค์–ด์ง€๋„๋ก ์กฐ๊ฑด์„ ๋ถ™์—ฌ ์ค์‹œ๋‹ค.

 

 

 

 

 

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ๋ฒ„ํŠผ์œผ๋กœ๋„ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋˜๋Š” ๋ชจ์Šต์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค~

 

 

 

์ €๋Š” ์Šคํƒ€์ผ๋ง๋„ ๋„ฃ์–ด ์คฌ๋Š”๋ฐ, ์Šคํƒ€์ผ๋ง์ด ํฌํ•จ๋œ ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ๋งํฌ๋ฅผ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ ค์š”.

 

GitHub - ttaerrim/product-admin: ์ƒํ’ˆ๋“ฑ๋ก ๊ณผ์ œ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋‹ด์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค

์ƒํ’ˆ๋“ฑ๋ก ๊ณผ์ œ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ๋‹ด์€ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค. Contribute to ttaerrim/product-admin development by creating an account on GitHub.

github.com

 

 

 

์ด ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐ์ฒด ํ˜•ํƒœ๋กœ Checkbox ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•ด ๋ดค๋Š”๋ฐ, isAllFalse๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ’์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์งˆ ๊ฒƒ ๊ฐ™์•„ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ๋ฐฐ์—ด๋กœ๋„ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ผ์š”.

 

 

์ œ๊ฐ€ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ๋Š” ์•„๋ฌด๋ฆฌ ์ฐพ์•„๋ด๋„ ๋ฒ„ํŠผ์œผ๋กœ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋„๋ฌด์ง€ ๋ณด์ด์ง€ ์•Š์•„ ์“ฐ๊ฒŒ ๋œ ํฌ์ŠคํŠธ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฅฒ

๋„์›€์ด ๋˜์…จ๋‹ค๋ฉด ์ €์—๊ฒŒ ํž˜์ด ๋˜๋Š” ๊ณต๊ฐ ๋ฒ„ํŠผ์ด๋‚˜ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ ค์š”. (--)(__)