-
[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์ผ ๋๋ง ๋ฒํผ์ด ๋ง๋ค์ด์ง๋๋ก ์กฐ๊ฑด์ ๋ถ์ฌ ์ค์๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ๋ฒํผ์ผ๋ก๋ ์ฒดํฌ๋ฐ์ค๊ฐ ํด์ ๋๋ ๋ชจ์ต์ ๋ณด์ค ์ ์์ต๋๋ค~
์ ๋ ์คํ์ผ๋ง๋ ๋ฃ์ด ์คฌ๋๋ฐ, ์คํ์ผ๋ง์ด ํฌํจ๋ ์ ์ฒด ์ฝ๋๊ฐ ๊ถ๊ธํ์๋ค๋ฉด ๋งํฌ๋ฅผ ์ฐธ๊ณ ๋ถํ๋๋ ค์.
์ด ํฌ์คํ ์์๋ ๊ฐ์ฒด ํํ๋ก Checkbox ์ํ ๊ด๋ฆฌ๋ฅผ ํด ๋ดค๋๋ฐ, isAllFalse๋ฅผ ์ฒดํฌํ๋ ๊ณผ์ ์์ ๊ฐ์ด ๋ง์์ง๋ค๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๋์์ง ๊ฒ ๊ฐ์ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๋ ๊ฒ ๋ ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ๋ฐฐ์ด๋ก๋ ๋ ๊ฐํธํ๊ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ผ๋ ์ฐธ๊ณ ํด ์ฃผ์๊ธธ ๋ฐ๋ผ์.
์ ๊ฐ ๊ฒ์ํ์ ๋๋ ์๋ฌด๋ฆฌ ์ฐพ์๋ด๋ ๋ฒํผ์ผ๋ก ์ฒดํฌ๋ฐ์ค ์ ํ ํด์ ํ๋ ๋ฐฉ๋ฒ์ด ๋๋ฌด์ง ๋ณด์ด์ง ์์ ์ฐ๊ฒ ๋ ํฌ์คํธ์ด๊ธฐ๋ ํฉ๋๋ค. ๐ฅฒ
๋์์ด ๋์ จ๋ค๋ฉด ์ ์๊ฒ ํ์ด ๋๋ ๊ณต๊ฐ ๋ฒํผ์ด๋ ๋๊ธ ๋ถํ๋๋ ค์. (--)(__)
'TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ๋ ๋์ ๋น๋๊ธฐ ํต์ (0) 2022.03.27 [React] Redux ๊ฐ๋ ์ ๋ฆฌ (0) 2022.03.13 [React] Checkbox (1) โ Context API๋ก Checkbox ์ํ ๊ด๋ฆฌํ๊ธฐ (0) 2022.02.19 CLOVA Summary API ํ์ด์ฌ์ผ๋ก ์ฌ์ฉํ๊ธฐ (0) 2021.08.23 [JavaScript] url-exist ์ฌ์ฉํ์ฌ url ์ ํจํ์ง ๊ฒ์ฌํ๊ธฐ (0) 2021.07.29