-
[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์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.- importํ ๋ฐฐ์ด์ categories์ ๋ณต์ฌํ๋ค.
- ๋ฐฐ์ด ๊ฐ์๋งํผ์ false๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ ๋ค.
- forEach๋ฌธ์ผ๋ก ๋น ๋ฐฐ์ด์ key๋ categories ๋ฐฐ์ด, value๋ categoriesBool๋ก ๊ตฌ์ฑ๋๋๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค๋ค.
- 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]๊ฐ ์ ๋๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
๋ฐฐ์ด๋ก๋ ๋ ๊ฐํธํ๊ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ผ๋ ์ฐธ๊ณ ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค.
๋์์ด ๋์ จ๋ค๋ฉด ์ ์๊ฒ ํ์ด ๋๋ ๊ณต๊ฐ ๋ฒํผ์ด๋ ๋๊ธ ๋ถํ๋๋ ค์. (--)(__)
'TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Redux ๊ฐ๋ ์ ๋ฆฌ (0) 2022.03.13 [React] Checkbox (2) โ ๋ฒํผ์ผ๋ก ์ ํ ํด์ ํ๊ธฐ (0) 2022.02.21 CLOVA Summary API ํ์ด์ฌ์ผ๋ก ์ฌ์ฉํ๊ธฐ (0) 2021.08.23 [JavaScript] url-exist ์ฌ์ฉํ์ฌ url ์ ํจํ์ง ๊ฒ์ฌํ๊ธฐ (0) 2021.07.29 [git] The requested URL returned error: 403 (0) 2021.07.28