ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] Checkbox (1) — Context API๋กœ Checkbox ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ
    TECH 2022. 2. 19. 20:00

     

     

    ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ฒดํฌ๋ฐ•์Šค๋กœ ์„ ํƒํ•˜๊ณ  ๋ฒ„ํŠผ์œผ๋กœ ํ•ด์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ

    ๋ฒ„ํŠผ์œผ๋กœ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฐฉ์‹์—์„œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ•ด, ํฌ์ŠคํŒ…์œผ๋กœ ๋‚จ๊ฒจ ๋‘๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

     

     

    ์ž„์˜์˜ ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ๋กœ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค๊ณ  Context API๋กœ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

     

    ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋กœ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค~

    ๋”๋ณด๊ธฐ
    // utils/sampleData.js
    
    export const data = [
      "๊ฐ€์„",
      "๊ฐ€๋žŒ",
      "๊ธฐ์จ",
      "๊ตฌ๋ฆ„",
      "๋‚˜๋ฆฌ",
      "๋„ˆ์šธ",
      "๋ˆ„๋ฆฌ",
      "๋…ธ์„",
      "๋ˆˆ๊ฝƒ",
      "๋‹ค์†œ",
      "๋งˆ์Œ",
      "๋งˆ๋ฃจ",
      "๋ฏธ๋ฅด",
      "๋ฌด๋Šฌ",
      "๋ง‘์Œ",
      "๋ฏฟ์Œ",
      "๋ญ‡๋ณ„",
      "๋ฐ”๋‹ค",
      "๋ฐฉ์šธ",
      "๋ณด๋ฆ„",
      "๋ด„๊ฝƒ",
      "๋ณ„๋น›",
      "๋ณ„๋ฐค",
      "๋ณ„์ˆฒ",
      "์‚ฌ๋ž‘",
      "์†”์žŽ",
      "์ƒˆ๋ฒฝ",
      "์ƒˆ์‹น",
      "์ƒ›๋ณ„",
      "์•„์นจ",
      "์•„๋ฆ„",
      "์—ฌ๋ฆ„",
      "์ด์Šฌ",
      "์—ฌ์šธ",
      "์›ƒ์Œ",
      "์œผ๋œธ",
      "์—ด๋งค",
      "์œค์Šฌ",
      "์ €๋…",
      "์ž”๋ณ„",
      "์ดˆ๋กฑ",
      "ํ’€์žŽ",
      "ํ•˜๋ฃจ",
      "ํ•˜๋‚˜",
      "ํ•˜๋Š˜",
      "ํ–‡์‚ด",
      "ํ–‡๋ณ•",
      "ํ–‡๋ด„",
    ];

     

     


    CategoryContext ๋งŒ๋“ค๊ธฐ

    import { createContext } from "react";
    
    const CategoryContext = createContext();

    createContext()๋กœ CategoryContext๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

     

    import { data } from "utils/sampleData";
    
    const CategoryProvider = ({ children }) => {
      const categories = [...data];
      const categoriesBool = [...Array(categories.length).fill(false)];
    
      let result = {};
      categories.forEach((cate, i) => {
        result[cate] = categoriesBool[i];
      });
    
      const [cateObject, setCateObject] = useState(result);
    
    };
    
    // result = {
    //   ๊ฐ€์„: false,
    //   ๊ฐ€๋žŒ: false,
    //   ๊ธฐ์จ: false,
    //   ๊ตฌ๋ฆ„: false,
    // };
    // ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค

    CategoryProvider ์•ˆ์— key๋Š” ๋ฐฐ์—ด์ด๊ณ  value๋Š” true/false์ธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    1. importํ•œ ๋ฐฐ์—ด์„ categories์— ๋ณต์‚ฌํ•œ๋‹ค.
    2. ๋ฐฐ์—ด ๊ฐœ์ˆ˜๋งŒํผ์˜ false๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.
    3. forEach๋ฌธ์œผ๋กœ ๋นˆ ๋ฐฐ์—ด์— key๋Š” categories ๋ฐฐ์—ด, value๋Š” categoriesBool๋กœ ๊ตฌ์„ฑ๋˜๋„๋ก ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
    4. useState๋กœ cateObject๋ฅผ ๋งŒ๋“ค๊ณ  ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ๋ฐฉ๊ธˆ ๋งŒ๋“  result ๋ฐฐ์—ด์„ ํ• ๋‹นํ•œ๋‹ค.

     

    const CategoryProvider = ({ children }) => {
    
      // ์ƒ๋žต
    
      return (
        <CategoryContext.Provider
          value={{
            cateObject,
            setCateObject,
          }}
        >
          {children}
        </CategoryContext.Provider>
      );
    };
    
    export { CategoryContext, CategoryProvider };

    CategoryContext์— Provider๋ฅผ ์ด์šฉํ•ด cateObject์™€ setCateObject๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๊ณ  CategoryContext, CategoryProvider๋ฅผ exportํ•ฉ๋‹ˆ๋‹ค.

     

     

     

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

    // store/category/index.js
    
    import { createContext, useState } from "react";
    import { data } from "utils/sampleData";
    
    const CategoryContext = createContext();
    
    const CategoryProvider = ({ children }) => {
      const categories = [...data];
      const categoriesBool = [...Array(categories.length).fill(false)];
    
      let result = {};
      categories.forEach((cate, i) => {
        result[cate] = categoriesBool[i];
      });
    
      const [cateObject, setCateObject] = useState(result);
    
      return (
        <CategoryContext.Provider
          value={{
            cateObject,
            setCateObject,
          }}
        >
          {children}
        </CategoryContext.Provider>
      );
    };
    
    export { CategoryContext, CategoryProvider };

     

     


    CheckboxList ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

    checkbox๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋‹ด๊ธธ CheckboxList๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    // CheckboxList.jsx
    
    import React, { useContext } from "react";
    import Checkbox from "./Checkbox";
    import { CategoryContext } from "store/category";
    
    const CheckboxList = () => {
      const { cateObject } = useContext(CategoryContext);
    
      return (
          <div>
            {Object.keys(cateObject).map((key, i) => {
              return (
                <div key={i}>
                  <Checkbox value={key} checked={cateObject[key]} />
                  {key}
                </div>
              );
            })}
          </div>
    
      );
    };
    
    export default CheckboxList;

    cateObject์˜ ํ‚ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋ฏ€๋กœ useContext๋ฅผ ์‚ฌ์šฉํ•ด cateObject๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.

    Array.map()์„ ์ด์šฉํ•  ๊ฑด๋ฐ, ํ˜„์žฌ cateObject๋Š” Object์ด๋ฏ€๋กœ map์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    Object.keys()๋ฅผ ์ด์šฉํ•˜๋ฉด Object์˜ key ๊ฐ’๋งŒ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

    ๋ฐ‘์—์„œ ๋งŒ๋“ค Checkbox ์ปดํฌ๋„ŒํŠธ์— value์™€ checked๋ฅผ ์ „๋‹ฌํ•ด ์ค๋‹ˆ๋‹ค.

    value๋Š” ํ‚ค๊ฐ’์ด ๋  ๊ฒƒ์ด๊ณ , checked๋Š” cateObject์˜ key๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ’, ์ฆ‰ value์ธ true / false ๊ฐ’์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


    Checkbox ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

    import { useContext } from "react";
    import { CategoryContext } from "store/category";
    
    const { cateObject, setCateObject } = useContext(CategoryContext);

    useContext์— CategoryContext๋ฅผ ์ „๋‹ฌํ•ด Provider์— ๋„ฃ์–ด ์คฌ๋˜ cateObject์™€ setCateObject๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

     

    const Checkbox = ({ value, checked }) => {
    
      const checkHandler = () => {
        let copyObject = { ...cateObject };
        copyObject[value] = !checked;
        setCateObject(copyObject);
      }
    
      return (
        <div>
          <input
            type="checkbox"
            checked={checked}
            value={value}
            onChange={checkHandler}
          />
        </div>
      );
    };

    CheckboxList์—์„œ value์™€ checked๋ฅผ ์ „๋‹ฌํ•ด ์คฌ์œผ๋ฏ€๋กœ props๋กœ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

    ์ฒดํฌ๋ฐ•์Šค ํƒ€์ž…์˜ input์„ ๋ฆฌํ„ดํ•ด ์ฃผ๊ณ ,

    ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ฒดํฌ๋˜์—ˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” checked ์†์„ฑ์—๋Š” checked๋ฅผ, ์ฒดํฌ ๋ฐ•์Šค ์˜†์— ์ถœ๋ ฅํ•  ๊ฐ’(value)์— value๋ฅผ ์ „๋‹ฌํ•ด ์ค๋‹ˆ๋‹ค.

    ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์„ ํƒ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋  onChange ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—๋Š” checkHandler๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

     

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

    checkbox์˜ onChange์— ์ „๋‹ฌํ•  checkHandler ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    cateObject์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ copyObject๋ฅผ ๋งŒ๋“ค๊ณ , copyObject์˜ key ๊ฐ’์— ์ ‘๊ทผํ•ด checked ์ƒํƒœ๋ฅผ ํ˜„ ์ƒํƒœ์™€ ๋ฐ˜๋Œ€๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ๋งŒ์•ฝ โ—ป๏ธ๊ฐ€์„์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ โ˜‘๏ธ๊ฐ€์„๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด checkHandler์˜ value๋Š” ๊ฐ€์„์ด ๋  ๊ฒƒ์ด๊ณ , false์˜€๋˜ ์ƒํƒœ๊ฐ€ true๋กœ ๋ฐ”๋€Œ์–ด copyObject์˜ {"๊ฐ€์„": false}๋Š” {"๊ฐ€์„": true}๋กœ ๋ฐ”๋€” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ” ์ค€ copyObject๋Š” setCateObject์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด cateObject๋ฅผ copyObject๋กœ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

     

     

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

    // Checkbox.jsx
    
    import { useContext } from "react";
    import { CategoryContext } from "store/category";
    
    
    const Checkbox = ({ value, checked }) => {
      const { cateObject, setCateObject } = useContext(CategoryContext);
    
      const checkHandler = () => {
          let copyObject = { ...cateObject };
          copyObject[value] = !checked;
          setCateObject(copyObject);
        }
        
      return (
        <div>
          <input
            type="checkbox"
            checked={checked}
            value={value}
            onChange={checkHandler}
          />
        </div>
      );
    };
    
    export default Checkbox;

     

     

    ์ด์ œ CheckboxList.jsx๋ฅผ App.js์—์„œ ๋ Œ๋”๋งํ•˜๋ฉด ์ฒจ๋ถ€ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด data๋กœ๋ถ€ํ„ฐ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ๋ Œ๋”๋ง๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    ์ฝ˜์†”์ฐฝ์—๋„ value์™€ cateObject[value]๊ฐ€ ์ œ๋Œ€๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

     

     

     

     

     

    ๋ฐฐ์—ด๋กœ๋„ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

     

     

     

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

     

     

    ๋Œ“๊ธ€

Designed by Tistory.