ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] Checkbox (2) — ๋ฒ„ํŠผ์œผ๋กœ ์„ ํƒ ํ•ด์ œํ•˜๊ธฐ
    TECH 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๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ฐ’์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋†’์•„์งˆ ๊ฒƒ ๊ฐ™์•„ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ๋ฐฐ์—ด๋กœ๋„ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ผ์š”.

     

     

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

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

    ๋Œ“๊ธ€

Designed by Tistory.