๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“… ํ•ฉ์ฃผ์‹œ๊ฐ„ํ‘œ ํ”„๋กœ์ ํŠธ

[ํ•ฉ์ฃผ์‹œ๊ฐ„ํ‘œ ํ”„๋กœ์ ํŠธ] 02# ํ•ฉ์ฃผ ์‹œ๊ฐ„ํ‘œ ์ œ์ž‘ - ๋ฉค๋ฒ„ ์„ ํƒ

by ๋ฝ€์งœ๊ผฌ 2024. 9. 18.

์™„์„ฑ๋ณธ


๋ฉ”์ธ ๊ธฐ๋Šฅ : ๋ฉค๋ฒ„๋ฅผ ์„ ํƒํ•˜๋ฉด ์‹œ๊ฐ„ํ‘œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

- ๋ฉค๋ฒ„ ์„ ํƒ, ์„ ํƒํ•œ ๋ฉค๋ฒ„ ํ‘œ์‹œ, ํ† ๊ธ€์ฐฝ, ๊ฒฝ๊ณ ๋ฌธ๊ตฌ


์ƒ๊ฐ๋ณด๋‹ค ๋ฐ˜์‘์ด ๋งค์šฐ๋งค์šฐ๋งค์šฐ ํญ๋ฐœ์ ์ด๋‹ค.

์•„์ง ๋ถ€์กฑํ•œ๊ฒŒ ๋งŽ์€๋ฐ ์นญ์ฐฌ ํ•ด์ฃผ์…”์„œ ๋งค์šฐ ๊ฐ์‚ฌ.. ๋ฉ‹์žˆ๋‹ค๊ณ  ํ•ด์ฃผ์…”์„œ.. ๋งค์šฐ๊ฐ์‚ฌ...

 

์•„๋ฌด๋ž˜๋„ ๋‚ด๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๋งŒ๋“ค๋‹ค ๋ณด๋‹ˆ

๋ถˆํŽธํ•œ์ ์„ ์ตœ๋Œ€ํ•œ ์—†์• ๊ธฐ์œ„ํ•ด ๋งŽ์ด ์ƒ๊ฐํ•˜๊ณ  ๋…ธ๋ ฅํ•œ๊ฒƒ ๊ฐ™๋‹ค.

 

๋งŒ๋“ค๋ฉด์„œ ๊ณ ๋ คํ•œ ๊ธฐ๋Šฅ์€ ์ด๋ ‡๋‹ค.

1. ๋ฉค๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ๋ช… ์„ ํƒํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ.

2. ๋‘๋ช… ์ด์ƒ์˜ ๋ฉค๋ฒ„๋ฅผ ๋ฐ˜๋“œ์‹œ ์„ ํƒํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€๋ฅผ ๋„์šธ ๊ฒƒ

3. ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ์„ ํƒํ•œ ๋ฉค๋ฒ„๋ฅผ ํ•œ๋ฒˆ์— ๋ณด์—ฌ์ฃผ๋Š” div๋ฅผ ๋งŒ๋“ค ๊ฒƒ

4. ์„ ํƒ ์™„๋ฃŒ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜๋Š” ์นธ์„ ๋งŒ๋“ค๊ฒƒ.

-> ๋ชจ๋‹ฌ์ฐฝ์œผ๋กœ ์ œ์ž‘ํ•จ

5. ๊ฐ„์ง€์šฉ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋„ฃ์„๊ฒƒ

 


01. ๋ฉค๋ฒ„ ์„ ํƒ ์ฝ”๋“œ


์—ฌ๋Ÿฌ๋ช…์„ ์„ ํƒํ•ด์•ผํ•˜๋ฏ€๋กœ checkbox๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์—ˆ๋‹ค.

{names.map((name, index) => (
   <div className="nameli" key={index} onClick={() => document.getElementById(`name${index}`).click()}>
      <input type="checkbox"
             id={`name${index}`}
             onChange={() => checkMember(name)}/>
      <label htmlFor={`name${index}`}>{name}</label>
   </div>
))}

names๋Š” ์ด๋ฆ„๋“ค์ด ๋‹ด๊ธด list์ด๋‹ค. ์ด list์˜ ์š”์†Œ๋“ค์„ ์ถœ๋ ฅํ•ด์„œ ์ฒดํฌ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.  

checkbox์™€ div๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ div๋ฅผ ๋ˆŒ๋Ÿฌ๋„ chcek ๋ฐ•์Šค๊ฐ€ ์ฒดํฌ๋˜๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.

label htmlFor ์ฒ˜๋Ÿผ id๋ฅผ ์ผ์น˜์‹œํ‚ค๋ฉด ์—ฐ๊ฒฐ์ด ๋œ๋‹ค.

โœ”๏ธonChange

์ž…๋ ฅ ํ•„๋“œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ด๋‹ค.

์ฒดํฌ๋œ ์ด๋ฆ„๋“ค์˜ ๊ฐ’์„ ๋ชจ์•„์„œ ํ™”๋ฉด ์ƒ๋‹จ์— ํ‘œ์‹œํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์ฒดํฌํ–ˆ์„ ๋•Œ checkMember ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ด๋“ค์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

const [selectNames, setSelectNames] = useState([]);

โœ”๏ธuseState

const [state, setState] = useState(์ดˆ๊ธฐ๊ฐ’);

- state : ์ƒํƒœ

- setState : ์ƒํƒœ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜

useState๋กœ ์„ ํƒ๋œ ์ด๋ฆ„์„ ๋‹ด์„ list๋ฅผ ๋งŒ๋“ ๋‹ค. ์ƒ๋‹จ์— ์ด list์˜ ๊ฐ’์„ ๋ณด์—ฌ์ฃผ๋Š”๊ฑฐ๋‹ค.

const checkMember = (name) => {
        setSelectNames((prev) =>
            //์ด๋ฆ„ ํฌํ•จ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ
            prev.includes(name)
                //์ด๋ฏธ ์žˆ๋Š”๋ฐ ๋˜ ๋ˆŒ๋ €๋‹ค? ๊ทธ๋Ÿฌ๋ฉด ์•„ ์‚ญ์ œํ• ๋ž˜ ํ•˜๊ณ  ๋ˆ„๋ฅธ๊ฑฐ๋ผ ํŒ๋‹จํ•˜์ฃ .
                //filter : ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ ๋ชจ์•„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
                //์œ ๋‹ค๋นˆ-์กฐ์œค๋ฏผ ๋‹ฌ๋ผ - true
                //์œ ๋‹ค๋นˆ-์œ ๋‹ค๋นˆ ๊ฐ™์•„ - false -> ์ œ๊ฑฐ
                ? prev.filter((e) => e !== name)
                //์—†์–ด -> name์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
                : [...prev, name]
        );
        setWarning(false); 
    };

์ด๊ฒŒ ์ด๋ฒˆ์˜ ํ•ต์‹ฌ ์ฝ”๋“œ์ด๋‹ค. ์ด๋ฆ„์„ ์„ ํƒํ•˜๊ณ  ์•ˆํ•˜๊ณ !๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”...

name์€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์ด๋ฆ„์ด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์ด๋ฆ„(name)์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

setState๋กœ ์„ ํƒ๋œ ์ด๋ฆ„์„ ๊ด€๋ฆฌํ•œ๋‹ค.

prev.includes(name) ๋กœ ์ด์ „ state ๊ฐ’์ธ prev์— ์„ ํƒ๋œ ์ด๋ฆ„์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋ฏธ prev์— ์ด๋ฆ„์ด ์žˆ๋Š”๋ฐ ๋˜ ์ธ์ž๋ฅผ ์ „๋‹ฌ ๋ฐ›์•˜๋‹ค? == ๋˜ ๋ˆ„๋ฅธ๊ฑฐ๋‹ค

== ์‚ญ์ œํ•˜๋ ค๊ณ  ๋ˆ„๋ฅธ๊ฑฐ๋‹ค!

์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๊ฒน์น˜๋Š” ๊ฐ’์„ ์‚ญ์ œํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. right?

โœ”๏ธfilter

๋ง ๊ทธ๋Œ€๋กœ ํ•„ํ„ฐ๋ง. ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

true๋ฉด ์œ ์ง€, false๋ฉด ์ œ๊ฑฐ

 

prev.filter((e) => e !== name)

prev์˜ ์š”์†Œ์ธ e์™€ ์„ ํƒํ•œ ์ด๋ฆ„ name์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ = true์ด๊ณ , ๊ฐ™์„ ๊ฒฝ์šฐ๋Š” false๋กœ ์ œ๊ฑฐ๊ฐ€ ๋œ๋‹ค.

๋ญ”๋ง์ด๋ƒ?

prev์— [์œ ๋‹ค๋นˆ, ์กฐ์œค๋ฏผ, ๊น€๋ณ‘๋ฌด]๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

name์ด '์œ ๋‹ค๋นˆ'์ผ ๋•Œ,

e(์กฐ์œค๋ฏผ) - name(์œ ๋‹ค๋นˆ)์ด ๋‹ค๋ฅด๋ฉด ๋ƒ…๋‘ 

e(์œ ๋‹ค๋นˆ) - name(์œ ๋‹ค๋นˆ)์ด ๊ฐ™์œผ๋ฉด ์ง€์šด๋‹ค.

 

prev์— ์ด๋ฆ„์ด ์—†์œผ๋ฉด [...prev, name] ์ด๋ ‡๊ฒŒ ๊ธฐ์กด ๋ฐฐ์—ด์— name์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

 

<div className='Parti'>
  {selectNames.map((name, index) => (
      <span id='view_name' key={index}>{name}</span> ))}
</div>

์ด๋ ‡๊ฒŒ ์™„์„ฑ๋œ list๋ฅผ map์œผ๋กœ ํ†ตํ•ด ์ถœ๋ ฅํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ์„ ํƒ๋œ ์ด๋ฆ„์ด ์ƒ๋‹จ์— ํ‘œ์‹œ๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋ฐ”๋กœ ๋š๋š ๋‚˜์˜ค๋Š”๊ฒŒ ๋ณ„๋กœ๋ผ์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

(๋ชจ๋“  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„์€ ๋‹ค์Œ ํฌ์ŠคํŒ…์— ์ ๋„๋ก ํ•˜๊ฒ ๋‹ค.)

 

02. ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ ์ฝ”๋“œ


๋ฉค๋ฒ„๋“ค์„ ์„ ํƒํ•˜๊ณ  ์„ ํƒ ์™„๋ฃŒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ† ๊ธ€์ฐฝ์ด ๋œฌ๋‹ค. 

ํ•˜์ง€๋งŒ ํ•ฉ์ฃผ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์†Œ 2๋ช…์˜ ์‚ฌ๋žŒ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. (์‚ฌ์‹ค ์ด๊ฒƒ๋„ ์ ์ง€๋งŒ)

๊ทธ๋ž˜์„œ ๋‘๋ช… ์ด์ƒ์˜ ๋ฉค๋ฒ„๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ๋ฅผ ๋„์›Œ์ฃผ๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

๊ฝค ๊ฐ„๋‹จํ•˜๋‹ค. 

๋‘๋ช…์ด์ƒ์ธ๊ฒŒ ๋งŒ์กฑ๋˜๋ฉด ๊ฒฝ๊ณ ์ฐฝ false(๊ฒฝ๊ณ ์ฐฝ ์•ˆ๋œจ๋‹ˆ๊นŒ F), ์•„๋‹ˆ๋ฉด true (๊ฒฝ๊ณ ์ฐฝ ๋œจ๋‹ˆ๊นŒ T)

    const nextButFunc = () => {
        if (selectNames.length < 2) {
            setShowWarning(true); 
        } else {
            setShowWarning(false); 
            setOpen(true); //๋ชจ๋‹ฌ์ฐฝ์—ด๊ธฐ
        }
    };

์•„๊นŒ ์ƒ๋‹จ์— ์„ ํƒํ•œ ์ด๋ฆ„๋“ค์„ ๋„์šฐ๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ๋˜

selectName์„ ์ด์šฉํ–ˆ๋‹ค.

์ด ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๊ฐ€ 2๋ฅผ ๋„˜์ง€๋ชปํ•˜๋ฉด ๊ฒฝ๊ณ ์ฐฝ ๋„์šฐ๊ธฐ.

 

03. ๋ชจ๋‹ฌ์ฐฝ ๋งŒ๋“ค๊ธฐ


๋ชจ๋‹ฌ์ฐฝ์€ ์ž˜ ์ •๋ฆฌํ•ด์ฃผ์‹  ๋ธ”๋กœ๊ฑฐ๊ฐ€ ๊ณ„์…”์„œ ๋งํฌ ์˜ฌ๋ฆฌ๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ฐธ๊ณ ํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

 

๐Ÿ‘‡์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ๐Ÿ‘‡

https://jisilver-k.tistory.com/143


 

ํ˜„์žฌ๋Š” ๋™์•„๋ฆฌ ์นœ๊ตฌ๋“ค์˜ ์˜ˆ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธํ•ด๋ณด์•˜๊ณ ,

(๋ฐ์ดํ„ฐ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์ค€ ์œคํ˜ธ์•ผ ๊ณ ๋งˆ์›Œ๐Ÿ‘)

์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๊ฐ€๋ฉฐ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•  ์ค€๋น„๋ฅผ ํ•˜๊ณ ์žˆ๋‹ค.

 

์‹œ๊ฐ„ํ‘œ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”๋ฐ ์ด๊ฑด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํŽธํ• ์ง€ ์ƒ๊ฐ์„ ๋” ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‹ค.

 

๋!