๐Ÿ’ ์ฒดํฌ๋ฐ•์Šค ์ „์ฒด์„ ํƒ ๊ธฐ๋Šฅ

Somiยท2021๋…„ 7์›” 25์ผ
6
post-thumbnail

1์ฐจ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚œ๊ฒŒ ์—Š๊ทธ์ œ ๊ฐ™์€๋ฐ ๋ฒŒ์จ 2์ฐจ ํ”„๋กœ์ ํŠธ์˜ 1์ฐจ ์Šคํ”„๋ฆฐํŠธ๊ฐ€ ๋์ด ๋‚ฌ๋‹ค... 1์ฐจ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉฐ ๋ง‰ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ต์ˆ™ํ•ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ 2์ฐจ๋กœ ์˜ค๋ฉด์„œ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์— ์ต์ˆ™ํ•ด์ง€๋Š”๋ฐ์— ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜์—ฌ๊ฐ„ ๊ฑฐ๋‘์ ˆ๋ฏธํ•˜๊ณ  ์˜ค๋Š˜์€ ์ง€๊ธˆ๊ป ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์†Œ๊ฐœํ•˜๋ ค๊ณ ํ•œ๋‹ค. ๋ฐ”๋กœ๋ฐ”๋กœ... ์ฒดํฌ๋ฐ•์Šค!!!

์ฒดํฌ๋ฐ•์Šค์˜ ๋Šช์— ๋น ์ง€๋‹ค

๋ฐ”๋กœ ์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๊ฒƒ์ธ๋ฐ... ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ธ๋งŒํผ ์„ธ์ƒ ๋‹จ์ˆœํ•œ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„ ๋‹จ๊ณ„์—์„œ๋„ ๋นผ๋†“๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋“ฑ... ๋„ˆ๋ฌด๋‚˜๋„ ํฐ ์ฐฉ๊ฐ์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

(์ฒซ๋ฒˆ์งธ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜ ๋‘ ์ฒดํฌ๋ฐ•์Šค๋„ ๋ชจ๋‘ ์„ ํƒ๋˜์–ด์•ผ ํ•œ๋‹ค.)

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€... ์ƒ๊ฐ๋ณด๋‹ค ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
1, 2๋ฒˆ ๋ฒ„ํŠผ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒ๋œ ์ƒํƒœ์—์„œ๋„ ์ „์ฒด์„ ํƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋„ ์„ ํƒ๋˜์–ด์•ผํ•˜๊ณ , ์„ธ ๋ฒ„ํŠผ์ด ์„ ํƒ๋œ ์ƒํƒœ์—์„œ ํ•˜๋‚˜๋งŒ ํ•ด์ œ๋˜์–ด๋„ ์ „์ฒด ์„ ํƒ ๋ฒ„ํŠผ์ด ํ•ด์ œ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค...!!! ใ…‚ใ„ทใ…‚ใ„ท

์ฒดํฌ๋ฐ•์Šค์˜ ๋Šช์—์„œ ๋‚˜์˜ค๋Š” ๋ฐฉ๋ฒ•

์ฒซ๋ฒˆ์งธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

setState๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‘๊ฐœ์˜ state๊ฐ’์„ ์คฌ๋‹ค. 1, 2๋ฒˆ ๋ฒ„ํŠผ์˜ ์ƒํƒœ๊ฐ’์„ boolean๊ฐ’์œผ๋กœ ์คฌ๊ณ , ์„ธ ๋ฒ„ํŠผ์— ๋ชจ๋‘ onClick ์ด๋ฒคํŠธ๋ฅผ ์ค˜์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ „์ฒด์„ ํƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„๋•Œ, ๋‚˜๋จธ์ง€ ๋‘ ๋ฒ„ํŠผ์˜ boolean ๊ฐ’์ด ๋ฐ”๋€Œ๋Š” ๋ฐฉ์‹์„ ์ทจํ–ˆ๋”๋‹ˆ ํ•˜๋‚˜๋งŒ ์„ ํƒ๋˜์—ˆ์„๋•Œ ์ „์ฒด์„ ํƒ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด 1, 2๋ฒˆ์ด ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์„ ํƒ๋˜๋Š” ๊ธฐ์ดํ•œ ๋ชจ์Šต์„ ๋„๊ฒŒ ๋˜์—ˆ๋‹ค...

๋‘๋ฒˆ์งธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋‘๋ฒˆ์งธ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์ฒซ๋ฒˆ์งธ๋ณด๋‹ค ๋œ ์›์‹œ์ ์ธ ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฐ์šฑ๋‹˜์˜ ์กฐ์–ธ์— ๋”ฐ๋ผ ์ „์ฒด์„ ํƒ ๋ฒ„ํŠผ์— ๋Œ€ํ•œ state ๊ฐ’์„ ์ฃผ์ง€ ์•Š๊ณ , checked ์†์„ฑ์„ ํ†ตํ•ด ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์— ํ•œํ•ด state๊ฐ’์€ ํ•˜๋‚˜๋กœ ์ถฉ๋ถ„ํ•ด์กŒ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ผ๋‹จ state๊ฐ’์œผ๋กœ boolean ๊ฐ’์ด ์•„๋‹Œ ๋นˆ๋ฐฐ์—ด์„ ์ฃผ๊ณ , 1, 2๋ฒˆ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋ ๋•Œ๋งˆ๋‹ค ์ด ๋ฒ„ํŠผ๋“ค์˜ ์ด๋ฆ„ ์†์„ฑ์ด ๋ฐฐ์—ด์•ˆ์— push๋˜๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋กœ ์ „์ฒด์„ ํƒ๋ฒ„ํŠผ์ด ์„ ํƒ๋ ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ์ •ํ•ด์•ผํ•œ๋‹ค.

์ด ๊ธฐ๋Šฅ์˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์ „์ฒด์„ ํƒ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋์„ ๋•Œ ์ „์ฒด์„ ํƒ๋ฒ„ํŠผ, 1, 2๋ฒˆ ๋ฒ„ํŠผ์ด ์„ ํƒ/์„ ํƒํ•ด์ œ๋˜์–ด์•ผํ•œ๋‹ค.
  2. ์ „์ฒด์„ ํƒ ๋œ ์ƒํƒœ์—์„œ 1 ๋˜๋Š” 2๋ฒˆ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํด๋ฆญ๋œ ๋ฒ„ํŠผ๊ณผ ํ•จ๊ป˜ ์ „์ฒด์„ ํƒ ๋ฒ„ํŠผ๋„ ์„ ํƒํ•ด์ œ๊ฐ€ ๋˜์–ด์•ผํ•œ๋‹ค.
  3. 1 ๋˜๋Š” 2๊ฐ€ ์„ ํƒ๋œ ์ƒํ™ฉ์—์„œ ์ „์ฒด์„ ํƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์„ธ ๋ฒ„ํŠผ์ด ๋™์‹œ์— ์„ ํƒ๋˜์–ด์•ผํ•œ๋‹ค.
const SignUp = () => {
  const [checkList, setCheckList] = useState([]);
  
   // ์ฒดํฌ๋ฐ•์Šค ์ „์ฒด์„ ํƒ์‹œ ๋ชจ๋‘์„ ํƒ ์ฒดํฌ๋ฐ•์Šค ํ™œ์„ฑํ™”์‹œํ‚ค๊ธฐ
  const handleCheck = e => {
    e.target.checked
      ? setCheckList([...checkList, e.target.name])
      : setCheckList(checkList.filter(el => el !== e.target.name));
  };

  // ์ „์ฒด์ฒดํฌ ์„ ํƒ์‹œ ์ „์ฒด ์„ ํƒ or ์ „์ฒดํ•ด์ œ
  const checkAll = e => {
    e.target.checked ? setCheckList(['terms', 'privacy']) : setCheckList([]);
  };
  
return (
  <Label>
    <div>
      <input
        type="checkbox"
        name="checkAll"
        onChange={checkAll}
        checked={checkList.length === 2 ? true : false}
        />
        ์•„๋ž˜ ๋‚ด์šฉ์— ๋ชจ๋‘ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.
    </div>
   </Label>
   <Label>
     <div>
       <input
          type="checkbox"
          name="terms"
          onChange={handleCheck}
          checked={checkList.includes('terms') ? true : false}
        />
 		 [ํ•„์ˆ˜] ์ด์šฉ์•ฝ๊ด€ ๋™์˜
   	 </div>
  		<div className="showMore">์ƒ์„ธ๋ณด๊ธฐ</div>
  	</Label>
  	<Label>
    	<div>
          <input
            type="checkbox"
            name="privacy"
            onChange={handleCheck}
            checked={checkList.includes('privacy') ? true : false}
            />
  		[ํ•„์ˆ˜] ๊ฐœ์ธ์ •๋ณด ์ˆ˜์ง‘ ์ด์šฉ ๋™์˜
          </div>
        <div className="showMore">์ƒ์„ธ๋ณด๊ธฐ</div>
 	 </Label>
  )
}

์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๋Š” ์Šคํ”„๋ ˆ๋“œ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด์ „ ๋ฐฐ์—ด์„ ๋ถˆ๋Ÿฌ์™”๋‹ค๋Š” ๊ฒƒ๊ณผ filter ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒดํฌ๊ฐ€ ํ•ด์ œ๋˜์—ˆ์„ ๋•Œ ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ๋ฒ„ํŠผ์˜ ์ด๋ฆ„์„ ๋ฐฐ์—ด์—์„œ ์ œ์™ธ์‹œํ‚จ๋‹ค๋Š” ์ ์ด๋‹ค.

๋˜ํ•œ ์ „์ฒด์„ ํƒ๋ฒ„ํŠผ์˜ ์„ ํƒ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •์ง“๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋„์ž…ํ–ˆ๋‹ค.

๋Š๋‚€ ์ 

๋ง‰์ƒ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜๋‹ˆ ๋ญ”๊ฐ€ ์‹œ์›์„ญ์„ญํ•˜๊ธฐ๋„ ํ•˜๊ณ , ๋ณ„๊ฑฐ ์•„๋‹Œ ๊ธฐ๋Šฅ์— ๋„ˆ๋ฌด ์˜ค๋ž˜๋™์•ˆ ๋งค๋‹ฌ๋ ค ์‚ฝ์งˆ์„ ํ–ˆ๋‚˜ ์‹ถ๊ธฐ๋„ ํ•˜๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์ด์ „์— ๋น„๊ต์  ์‚ฌ์šฉํ•ด๋ณธ ๋นˆ๋„๊ฐ€ ์ ์€ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์ด๋‚˜ filter๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.

ํ•œํŽธ์œผ๋กœ๋Š” ์ด๋ณด๋‹ค ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์žˆ์„๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ ๋‹ค. ๋ฒ„ํŠผ์ด ๋‘๊ฐœ๋ณด๋‹ค ๋” ๋งŽ์„ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผํ• ์ง€ ๋ง‰๋ง‰ํ•˜๊ธฐ๋„ ํ•˜๋‹ค. ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์‹ถ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€