์ด์ ์ปดํฌ๋ํธ ๋จ์๋ก UI๋ฅผ ๊ฐ๋ฐํ๋ ์ด์ ์ ์ปดํฌ๋ํธ ๋ด๋ถ์ CSS๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๋ก ์ธ CSS-in-JS๋ฅผ ๋ฐฐ์ ๋ค.
UI ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๋ React Custom Component ๊ณผ์ ๋ฅผ ์งํํ๊ธฐ์ ์์ ๋ค์ ๋ณต์ตํด๋ณด์.
์ถ๊ฐ๋ก ์ค๋์ ๋ฒ๋ธ๋ง ๊ฐ๋
& stopPropagation() ๋ฉ์๋์ ๋ํด์ ์ฒ์ ๋ฐฐ์์ ํ๋ฐ์ ๋ค๋ค๋ณผ ์์ ์ด๋ค.
UI๋ฅผ ๊ฐ๋ฐํด ๋ณธ ๊ฐ๋ฐ์๋ผ๋ฉด UI ๊ฐ๋ฐ์ ๋ค๋ฅธ ๋ถ์ผ์ ๊ฐ๋ฐ๋ณด๋ค ๋ณต์กํ๊ณ ๊น๋ค๋กญ๋ค๋ ์ฌ์ค์ ์ ๊ฒ์ด๋ค.
UI ๊ฐ๋ฐ์ ๋๋์ฒด ์ ๊น๋ค๋ก์ด ๊ฑธ๊น?
ํ๋ก์ ํธ์ ์ํฉ์์ ์ ๋์ ์ผ๋ก ๋ง์ ์์ ํ๋ฉด๊ณผ ๋ณต์กํ ํ๋ฉด์ด ๋ฌธ์ ์ด๋ค.
๊ทธ๋์ ์น์ฌ์ดํธ์ ๋ชจ๋ ํ๋ฉด๋ค์ ๋ถ์ํด ๋ณด์๋ค.
ํ๋ฉด์ ๋ถ์ํด ๋ณด๋ ๋ช ๊ฐ์ง ํจํด๋ค์ ๋ฐ๊ฒฌํ ์ ์์๋ค.
ํ๋ฉด์ด ์๋ฌด๋ฆฌ ๋ณต์กํ๊ณ ๋ค์ํด๋ ๊ธฐ๋ณธ์ ์ธ ๋ ์ด์์ ๊ตฌ์ฑ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ UI๋ค์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ฐ์๋ค์ ๋ฐ๋ณต๋๋ UI๋ค์ ์ด๋ป๊ฒ ์ฌ์ฌ์ฉํ๊ณ ์์์๊น?
๋๊ตฐ๊ฐ ๋จผ์ ์ฝ๋๋ฅผ ์ค๊ณํด ๋์ผ๋ฉด ๊ทธ ์ฝ๋๋ฅผ ๋น์ทํ๊ฒ ์ฐ๊ฑฐ๋, ํด๋น UI๊ฐ ์ด๋ ํ๋ฉด์ ๊ฐ๋ฐ๋์ด ์๋์ง ์ ์ ์์ ๋ ์๋ก ๊ฐ๋ฐํ๊ธฐ๋ ํ๋ค. ์ด๋ฐ ํฌ๊ณ ์์ ๋ถํธํจ์ด ์์ฌ, ์์ฐ์ค๋ฝ๊ฒ UI ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ๋ํ ๋ ผ์๊ฐ ์์๋์๋ค.
๊ฐ๋ฐํ๋ค์ UI ์ปดํฌ๋ํธ๋ฅผ ๋์
ํจ์ผ๋ก์จ ์ ๋์ ์ธ ์ฝ๋๋์ ์ค์ผ ์ ์์๋ค.
๋๋ถ์ด ํ๋ฉด์ด ์ ๋์ ์ผ๋ก ๋ง๊ณ ๋ณต์ก๋๊ฐ ์๋ ํ๋ก์ ํธ์์๋ ๊ฐ๋ฐ ๊ธฐ๊ฐ ๋จ์ถ์ ์ ๋์ ์ผ๋ก ๊ธฐ์ฌํ ์ ์๋ ์ฅ์ ์ด ์๋ค.
์ด๋ฌํ UI ์ปดํฌ๋ํธ๋ค์ ๋ชจ์์ ๊ตฌ์กฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋์์ธ ์์คํ
์ด๋ผ๋ ์ฉ์ด๋ ๋ฑ์ฅํ๋ค.
๋์์ธ ์์คํ ์ด๋ ์๋น์ค๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ๊ณตํต ์ปฌ๋ฌ, ์์ฒด, ์ธํฐ๋์ , ๊ฐ์ข ์ ์ฑ ๋ฐ ๊ท์ ์ ๊ดํ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฆฌํด ๋์ ๊ฒ์ด๋ฉฐ ๋ถํ์ํ ์ปค๋ฎค๋์ผ์ด์ ์ ์์ ๊ธฐ ์ํด ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ ์์คํ ์ ๋งํ๋ค.
๋์์ธ ์์คํ
์ ์ธ๊ธฐ๋ ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์๋ค. Airbnb์ ๊ฐ์ ๊ฑฐ๋ ๊ธฐ์ ๊ธฐ์
๋ถํฐ ์ ์ ์คํํธ์
๊น์ง,
ํ์ฌ๋ค์ ์๊ฐ๊ณผ ๋น์ฉ์ ์ ์ฝํ๊ธฐ ์ํด UI ํจํด์ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋์
ํ๊ณ ์๋ค.
์ต๊ทผ์ ๋ฑ์ฅํ ์ ์ ์ธํฐํ์ด์ค(UI)๋ค์ ๋ค์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด
์๋ฐฑ ๊ฐ์ ๋ชจ๋์ UI ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฐฐ์ด๋ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๋น๋ ์ปดํฌ๋ํธ
์ง๊ธ๊น์ง ๋ฐฐ์ด React, Styled Components๋ฅผ ํ์ฉํ์ฌ React-custom-component๋ฅผ ์์ฑํฉ๋๋ค.
Modal Component ์์ฑ ์์
Modal UI ์ปดํฌ๋ํธ๋ ๊ธฐ์กด์ ๋ธ๋ผ์ฐ์ ํ์ด์ง ์์ ์๋ก์ด ์๋์ฐ ์ฐฝ์ด ์๋, ๋ ์ด์ด๋ฅผ ๊น๋ ๊ฒ์ ๋งํฉ๋๋ค.
(ํ์
์ฐฝ๊ณผ๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ์ง์ ๊ตฌ๊ธ๋ง์ ํตํด ์ฐพ์๋ณด์ธ์!)
ํ์ฌ ์ ๊ณต๋๊ณ ์๋ Modal.js๋ Modal ๋ฒํผ๋ง ์๊ณ ์๋ฌด ๊ธฐ๋ฅ์ด ์๋ํ์ง ์๋ ์ฝ๋์
๋๋ค. ์๋ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ Modal ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํด ์์ GIF ํ์ผ๊ณผ ๊ฐ์ด Modal ๋ฒํผ์ ํด๋ฆญํ๋ฉด Modal ์ฐฝ์ด ์ผ์ง๊ณ ๊บผ์ง ์ ์๊ฒ ๊ตฌํํ์ธ์.
์์ํ๊ธฐ
Modal
์ปดํฌ๋ํธ ๊ตฌํ์ ํ์ํ ์ ๋ณด๊ฐ ์์ธํ ์ ํ์์ต๋๋ค. ํ์ธ ํ ๊ณผ์ ๋ฅผ ์งํํ์ธ์.
Modal
์ปดํฌ๋ํธ ํ
์คํธ๋ ์ฃผ์ ์ฒ๋ฆฌ๊ฐ ๋์ด์์ง ์์ต๋๋ค. ๋ฐ๋ก ์งํํด ์ฃผ์ธ์.Modal
์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ state๊ฐ ์กด์ฌํฉ๋๋ค. ํ์์ ๋ฐ๋ผ์ state๋ฅผ ๋ ๋ง๋ค ์๋ ์์ต๋๋ค.ModalBtn
์ปดํฌ๋ํธ๋ ๋ชจ๋ฌ ์ฐฝ ์ ์ด๋ฅผ ์ํด ํธ๋ค๋ฌ ํจ์ openModalHandler๋ฅผ ์์ฑํฉ๋๋ค.ModalBtn
ํด๋ฆญ ์ ๋ฐ์๋๋ change ์ด๋ฒคํธ ํธ๋ค๋ฌ์
๋๋ค.ModalView
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ isOpen ์ํ๊ฐ true ์ผ ๊ฒฝ์ฐ์๋ง ๋ ๋๋ง ํฉ๋๋ค.ModalBackdrop
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ isOpen ์ํ๊ฐ true ์ผ ๊ฒฝ์ฐ์๋ง ๋ ๋๋ง ํฉ๋๋ค.์๊ตฌ์ฌํญ
ModalContainer
ModalBackdrop
ModalBtn
ModalView
์ปดํฌ๋ํธ์ CSS๋ฅผ ์์ ๋กญ๊ฒ ๊ตฌํํฉ๋๋ค.ModalContainer
: Modal์ ๊ตฌํํ๋๋ฐ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ ์ญํ ์ ํฉ๋๋ค.ModalBackdrop
: Modal์ด ๋ด์ ๋์ ๋ฐฐ๊ฒฝ์ ๊น์์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.ModalBtn
: Modal ์ฐฝ์ ์ผ๊ณ ๋ ์ ์๋ ๋ฒํผ์
๋๋ค.ModalView
: Modal ์ฐฝ ์ปดํฌ๋ํธ์
๋๋ค.Modal ๋ฒํผ ๊ธฐ๋ฅ ํ ์คํธ
ModalBtn
์ ํด๋ฆญํ๋ฉด Modal์ด ์ด๋ฆฐ ์ํ(isOpen)๋ฅผ boolean ํ์
์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํฉ๋๋ค.ModalBtn
์ ๋ด๋ถ ํ
์คํธ๊ฐ 'Opened!'๋ก Modal์ด ๋ซํ ์ํ(isOpen์ด false์ธ ์ํ)์ผ ๋๋ ModalBtn
์ ๋ด๋ถ ํ
์คํธ๊ฐ 'Open Modal'์ด ๋๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.Toggle Component ์์ฑ ์์
Toggle UI ์ปดํฌ๋ํธ๋ ๋ ๊ฐ์ง ์ํ๋ง์ ๊ฐ์ง๊ณ ์๋ ์ค์์น์
๋๋ค. ์๋ฅผ ๋ค์ด, ํ๋ฒ ๋๋ฅด๋ฉด ๋ถ์ด ๋ค์ด์ค๊ณ ํ๋ฒ ๋๋ฅด๋ฉด ๋ถ์ด ๋๊ฐ๋ ์ค์์น๋ฅผ Toggle Switch๋ผ๊ณ ํ ์ ์์ต๋๋ค. Toggle.js๋ CSS๋ ๊ฑฐ์ ์์ฑ๋์ด ์์ง๋ง ๊ธฐ๋ฅ์ ์๋ํ์ง ์์ต๋๋ค. ์๋ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ Toggle ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํด ์์ GIF ํ์ผ๊ณผ ๊ฐ์ด ์ ์์ ์ผ๋ก ์๋ํ๋๋ก ๋ง๋ค์ด ๋ด
์๋ค.
์์ํ๊ธฐ
Toggle
์ปดํฌ๋ํธ ๊ตฌํ์ ํ์ํ ์ ๋ณด๊ฐ ์์ธํ ์ ํ์์ต๋๋ค. ํ์ธ ํ ๊ณผ์ ๋ฅผ ์งํํ์ธ์.
Toggle
์ปดํฌ๋ํธ ํ
์คํธ์ ์ฃผ์์ ํด์ ํ๊ณ ์์ํฉ๋๋ค.Toggle
์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ state๊ฐ ์กด์ฌํฉ๋๋ค. ํ์์ ๋ฐ๋ผ์ state๋ฅผ ๋ ๋ง๋ค ์๋ ์์ต๋๋ค.ToggleContainer
์ปดํฌ๋ํธ๋ ํ ๊ธ ๋ฒํผ ์ ์ด๋ฅผ ์ํด ํธ๋ค๋ฌ ํจ์ toggleHandler๋ฅผ ์์ฑํฉ๋๋ค.ToggleContainer
ํด๋ฆญ ์ ๋ฐ์๋๋ change ์ด๋ฒคํธ ํธ๋ค๋ฌ์
๋๋ค.์๊ตฌ์ฌํญ
ToggleContainer
Desc
์ปดํฌ๋ํธ์ CSS๋ฅผ ์์ ๋กญ๊ฒ ๊ตฌํํฉ๋๋ค.ToggleContainer
: Toggle์ ๊ตฌํํ๋๋ฐ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ ์ญํ ์ ํฉ๋๋ค.Desc
: Toggle Switch์ ์ํ๋ฅผ ์ค๋ช
ํ๋ ํ
์คํธ๋ฅผ ๋ด๋ ์ปดํฌ๋ํธ์
๋๋ค.ToggleContainer
๋ด๋ถ์ .toggle-container
.toggle-circle
ํด๋์ค๋ฅผ ๊ฐ์ง div
์์๋ฅผ ๊ฐ๊ฐ ์์ฑํฉ๋๋ค.toggle--checked
ํด๋์ค๋ฅผ ๋ ์์ ๋ชจ๋์ ์ถ๊ฐํฉ๋๋ค.<div className={`toggle-container ${isOn ? "toggle--checked" : ""}`} />
transition
์์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค. ํ ๊ธ์ ๊ธฐ๋ฅ์ ๋ค ๊ตฌํํ๋ค๋ฉด ์๋ํด ๋ณด์ธ์!Tab Component ์์ฑ ์์
Tab UI ์ปดํฌ๋ํธ๋ ๋์ผํ ๋ฉ๋ด ๋ผ์ธ์์ ๋ทฐ๋ฅผ ์ ํํ ๋ ์ฌ์ฉํฉ๋๋ค. Tag.js๋ CSS๋ ๊ฑฐ์ ์์ฑ๋์ด ์์ง๋ง ๊ธฐ๋ฅ์ ์๋ํ์ง ์์ต๋๋ค. ์๋ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ ์๊ตฌ์ฌํญ์ ์์ฑํ์ฌ Tab ์ปดํฌ๋ํธ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋๋ก ๋ง๋ค์ด ๋ด
์๋ค. ๋ํ ํ์ตํ Styled Components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ๋ถ๋ง์ ๋ฉ์ง Tab ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์.
์์ํ๊ธฐ
Tab
์ปดํฌ๋ํธ ๊ตฌํ์ ํ์ํ ์ ๋ณด๊ฐ ์์ธํ ์ ํ์์ต๋๋ค. ํ์ธ ํ ๊ณผ์ ๋ฅผ ์งํํ์ธ์.
Tab
์ปดํฌ๋ํธ ํ
์คํธ์ ์ฃผ์์ ํด์ ํ๊ณ ์์ํฉ๋๋ค.Tab
์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ state๊ฐ ์กด์ฌํฉ๋๋ค. ํ์์ ๋ฐ๋ผ์ state๋ฅผ ๋ ๋ง๋ค ์๋ ์์ต๋๋ค.currentTab
state๋ ํ์ฌ tab์ index๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.TabMenu
์ปดํฌ๋ํธ๋ ํ ๊ธ ๋ฒํผ ์ ์ด๋ฅผ ์ํด ํธ๋ค๋ฌ ํจ์ selectMenuHandler
๋ฅผ ๊ฐ์ง๋๋ค.selectMenuHandler
ํจ์๋TabMenu
ํด๋ฆญ ์ ๋ฐ์๋๋ change ์ด๋ฒคํธ ํธ๋ค๋ฌ์
๋๋ค.li
์์๋ฅผ ์ด์ฉํด ๋ฉ๋ด๋ฅผ ์์ฑํ๊ณ , ๊ฐ ๋ฉ๋ด๋ฅผ ๋๋ ์ ๋ ๋ทฐ๊ฐ ์ ํ๋๋๋ก handler(selectMenuHandler
) ํจ์๋ฅผ ์์ฑํฉ๋๋ค.currentTab
์ํ๋ฅผ ์ด์ฉํ์ฌ ํด๋ฆญํ Tab ๋ฉ๋ด๋ง className(submenu focused
)๊ณผ CSS ๊ฐ ๋ณ๊ฒฝ๋๋๋ก ๊ตฌํํฉ๋๋ค. ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ์์ ํ ๊ธ์์ ๊ตฌํํ ๊ฒ๊ณผ ๊ฐ์ด ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด๊ณผ ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.์๊ตฌ์ฌํญ
Component
TabMenu
Desc
์ปดํฌ๋ํธ์ CSS๋ฅผ ์์ ๋กญ๊ฒ ๊ตฌํํฉ๋๋ค.TabMenu
: Tab์ ๊ตฌํํ๋๋ฐ ํ์ํ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ฃผ๋ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ ์ญํ ์ ํฉ๋๋ค.Desc
: Toggle Switch์ ์ํ๋ฅผ ์ค๋ช
ํ๋ ํ
์คํธ๋ฅผ ๋ด๋ ์ปดํฌ๋ํธ์
๋๋ค.TabMenu
TabMenu
๋ด๋ถ์ .submenu
ํด๋์ค๋ช
์ ๊ฐ์ง li
์์๋ค์ map
์ ์ด์ฉํ ๋ฐ๋ณต์ ํตํด ์์ฑํฉ๋๋ค.TabMenu
๋ด๋ถ์ .submenu
ํด๋์ค๋ช
์ ๊ฐ์ง li
์์์ textContent
๋ ๊ฐ ์์์ name
์
๋๋ค.currentTab
li
์์์ ํด๋์ค๋ช
๋ง submenu focused
๊ฐ ๋์ด์ผ ํ๊ณ , ์ ํ๋์ง ์์ ๋๋จธ์ง๋ submenu
๊ฐ ๋๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค.TabMenu
๋ฅผ ํด๋ฆญํ๋ฉด ํ์ฌ ์ ํ๋ ํญ์ ์ธ๋ฑ์ค ๊ฐ์ ์ ๋ฌ๋ฐ์ currentTab
์ํ๋ฅผ ๋ณ๊ฒฝํ๋ selectMenuHandler
๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํฉ๋๋ค.TabMenu
๋ฅผ ํด๋ฆญํ๋ฉด ํ์ฌ ์ ํ๋ ํญ ๋ฉ๋ด๋ง .focused
CSS๊ฐ ์ ์ฉ๋์ด์ผ ํฉ๋๋ค.TabMenu
๋ฅผ ํด๋ฆญํ๋ฉด Desc
์ปดํฌ๋ํธ์ content
์ ๋ด์ฉ์ด ํด๋น ํญ์ content
๋ก ๋ฐ๋์ด์ผ ํฉ๋๋ค.Tag Component ์์ฑ ์์
Tag UI ์ปดํฌ๋ํธ๋ ๋ ์ด๋ธ ์ง์ ์ ํตํด ๊ตฌ์ฑ์ด๋ ๋ถ๋ฅ์ ๋์์ด ๋๋ ํค์๋ ์งํฉ์ ๋ง๋ค ๋ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. Tag.js ๋ CSS๋ ๊ฑฐ์ ์์ฑ๋์ด ์์ง๋ง ๊ธฐ๋ฅ์ ์๋ํ์ง ์์ต๋๋ค. ์๋ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ์ฌ Tag ์ปดํฌ๋ํธ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋๋ก ๋ง๋ค์ด ๋ด
์๋ค. ๋ํ ํ์ตํ Styled Components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ๋ถ๋ง์ ๋ฉ์ง Tag ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์.
์์ํ๊ธฐ
Tag
์ปดํฌ๋ํธ ๊ตฌํ์ ํ์ํ ์ ๋ณด๊ฐ ์์ธํ ์ ํ์์ต๋๋ค. ํ์ธ ํ ๊ณผ์ ๋ฅผ ์งํํ์ธ์.
Tag
์ปดํฌ๋ํธ ํ
์คํธ์ ์ฃผ์์ ํด์ ํ๊ณ ์์ํฉ๋๋ค.Tag
์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ state๊ฐ ์กด์ฌํฉ๋๋ค. ํ์์ ๋ฐ๋ผ์ state๋ฅผ ๋ ๋ง๋ค ์๋ ์์ต๋๋ค.tags
state๋ ๋ฐฐ์ด์ ํํ์
๋๋ค.initialTags
๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.TagsInput
์ปดํฌ๋ํธ๋ ํธ๋ค๋ฌ ํจ์ addTags
๋ฅผ ๊ฐ์ง๋๋ค.addTags
ํจ์๋span.tag-close-icon
์๋ ์์ง ์ค์ ์๋ํ๋ ์ญ์ ์์ด์ฝ(x
)์ด ์์ต๋๋ค. ์ญ์ ์์ด์ฝ์ ๋ง๋ค๊ณ , ์ด ๋ฒํผ์ด ๋์ํ๋๋ก handler (removeTags
) ํจ์๋ฅผ ์์ฑํฉ๋๋ค.์๊ตฌ์ฌํญ
input ๊ธฐ๋ฅ ํ ์คํธ
input
์ฐฝ์ ํ
์คํธ๋ฅผ ์
๋ ฅ ํ Enter ํค๋ฅผ ๋๋ฅด๋ฉด ํ๊ทธ๊ฐ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค. ๋ง์ฐ์ค ํด๋ฆญ์ด ์๋ Enter ํค๋ฅผ ํตํด ํ๊ทธ๊ฐ ์ถ๊ฐ๋๋๋ก ํ๋ฉฐ, Enter ํค๊ฐ ๋๋ฆฌ๋ฉด ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ addTags
๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํฉ๋๋ค.addTags
๋ฉ์๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ ์ด์ธ์ ์๋ ์ธ ๊ฐ์ง ๊ธฐ๋ฅ๋ ์ํํ ์ ์์ด์ผ ํฉ๋๋ค.addTags
๋ฉ์๋๊ฐ ์คํ๋์ง ์์์ผ ํฉ๋๋ค.input
์ฐฝ์ด ๋น์์ ธ์ผ ํฉ๋๋ค.์ญ์ ๊ธฐ๋ฅ ํ ์คํธ
tags
๋ฐฐ์ด ์์ ๋ชจ๋ ํ๊ทธ๋ค์ด ํ๋ฉด์ ๋ณด์ฌ์ผ ํฉ๋๋ค.x
)์ด ํ์๋๋๋ก ํ๊ณ , ์์ด์ฝ์ ํด๋ฆญํ๋ฉด ํด๋น ํ๊ทธ๋ฅผ ์ญ์ ํ๋ removeTags
๋ฉ์๋๊ฐ ์คํ๋์ด์ผ ํฉ๋๋ค.removeTags
๋ฉ์๋๊ฐ ์ญ์ ์์ด์ฝ(x
)์ด ๋๋ฆฐ ํ๊ทธ๋ฅผ ์ญ์ ํ๋๋ก removeTags
๋ฉ์๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.Modal Component
Modal
: ๋ชจ๋ฌ ์ฐฝ์ ์ ๋ฐ์ ์ธ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ค.
openModalHandler
: ์ํ ๊ด๋ฆฌ ์ค์ธ isOpen
์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
!
๋ฅผ ์ฌ์ฉํ์ฌ isOpen
์ boolean
๊ฐ์ ์ญ์ผ๋ก ๋ณ๊ฒฝํ๋ค.closeModalHandler
: modalRef
๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ฌ ์ฐฝ ์ธ๋ถ๋ฅผ ํด๋ฆญํ ๊ฒฝ์ฐ์๋ง ๋ชจ๋ฌ์ ๋ซ๋๋ก ์ค์ ํ๋ค.
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ useEffect
๋ฅผ ํตํด ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋์๋ง ๋ฑ๋ก๋๋ฉฐ, ์ธ๋ง์ดํธ ์์๋ ์ ๋ฆฌ๋๋ค.
ModalBtn
: onClick
์ผ๋ก openModalHandler
ํจ์๋ฅผ ์คํ์์ผ isOpen
๋ฅผ true
๋ก ๋ณ๊ฒฝํ๋ค.
์กฐ๊ฑด๋ถ ๋ ๋๋ง(์ผํญ ์ฐ์ฐ์)์ ํ์ฉํด์ Modal์ด ์ด๋ฆฌ๊ณ ๋ซํ์ ๋, ๋ฒํผ ๋ฌธ๊ตฌ๋ฅผ ๋ค๋ฅด๊ฒ ํ
์คํธ๋ฅผ ๋ํ๋ธ๋ค.
ModalView
: ref
๋ฅผ ์ถ๊ฐํ์ฌ ํด๋น ์์๋ฅผ ์ฐธ์กฐํ๋ค.
CloseBtn
: onClick
์ผ๋ก openModalHandler
ํจ์๋ฅผ ์คํ์์ผ isOpen
๋ฅผ false
๋ก ๋ณ๊ฒฝํ๋ค.
ํน์ดํ ์ ์ด ์๋ค๋ฉด, useRef๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ closeModalHandler ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์, ๋ชจ๋ฌ ์ฐฝ ์ธ๋ถ๋ฅผ ํด๋ฆญํ ๋ ๋ชจ๋ฌ์ด ๋ซํ๊ฒ ํ๋ค.
์ด๋ฅผ ์ํด useRef, useEffect, mousedown ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ค.
const closeModalHandler = (e) => {
// ๋ชจ๋ฌ ์ฐธ์กฐ(modalRef)๊ฐ ์กด์ฌํ๊ณ , ํด๋ฆญํ ์์(e.target)๊ฐ ๋ชจ๋ฌ ์ฐฝ ๋ด๋ถ์ ํฌํจ๋์ง ์์ ๋ ๋ชจ๋ฌ์ ๋ซ๋๋ค.
if (modalRef.current && !modalRef.current.contains(e.target)) {
setIsOpen(false);
}
};
useEffect(() => {
// ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐ
document.addEventListener("mousedown", closeModalHandler);
return () => {
// ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ๊ฑฐ
document.removeEventListener("mousedown", closeModalHandler);
};
}, []);
๋๋ฌด ๋ณต์กํ๋ค.
๋ฌผ๋ก , useRef์ useEffect๋ฅผ ์ฐ์ง ์๋ ๋ฐฉ๋ฒ๋ ์๋ค.
isOpen? (
<ModalBackdrop onClick={openModalHandler}>
<ModalView onClick={event => event.stopPropagation()}>
<h2>Modal</h2>
<p>์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ต๋๋ค.</p>
<CloseBtn onClick={openModalHandler}>Close</CloseBtn>
</ModalView>
</ModalBackdrop>
) : null}
์ ์ฒด๋ฅผ ๋ชจ๋ฌ์ฐฝ ๋ฐ์ ์๋ฏธํ๋ Backdrop์ผ๋ก ๊ฐ์ธ์ฃผ๊ณ ,
onClick ์ผ๋ก openModalHandler ํจ์๋ฅผ ์คํ์์ผ์ฃผ๋ฉด ๋๋ค.
ํ์ง๋ง ์ด์ ๊ฐ์ด ์ค์ ์, '๋ฒ๋ธ๋ง' ์ด๋ผ๋ ํ์์ด ์๊ธฐ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ชจ๋ฌ์ฐฝ์ธ ModalView์๋ stopPropagation() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํ์์ ๋ง์์ค์ผ ํ๋ค.
๋ง์ฝ ์ ๊ณผ์ ์ด ์๋ต๋๋ค๋ฉด, ๋ชจ๋ฌ์ฐฝ ์ ์ชฝ ์๋ฌด ๊ณณ์ด๋ ํด๋ฆญํด๋ ๋ฒ๋ธ๋ง ํ์์ผ๋ก ์ธํด ๋ชจ๋ฌ์ฐฝ์ด ๋ซํ๊ฒ ๋๋ค.
๋ฒ๋ธ๋ง๊ณผ stopPropagation() ๋ฉ์๋ ๊ฐ๋ ์ Error Note.์์ ๋ค๋ฃจ๊ฒ ๋ค.
Toggle Component
Toggle
: ํ ๊ธ์ ์ ๋ฐ์ ์ธ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ค.
toggleHandler
: ์ํ ๊ด๋ฆฌ ์ค์ธ isOn
์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
!
๋ฅผ ์ฌ์ฉํ์ฌ isOn
์ boolean
๊ฐ์ ์ญ์ผ๋ก ๋ณ๊ฒฝํ๋ค.ToggleContainer
: onClick
์ผ๋ก toggleHandler
ํจ์๋ฅผ ์คํ์์ผ isOn
๋ฅผ true
๋ก ๋ณ๊ฒฝํ๋ค.
์กฐ๊ฑด๋ถ ๋ ๋๋ง(์ผํญ ์ฐ์ฐ์)์ ํ์ฉํด์ ํ ๊ธ ํด๋ฆญ ์ฌ๋ถ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ค.
์ถ๊ฐ๋ก props๋ฅผ ๋ฐ๋ ์ฌ๋ถ์ ๋ฐ๋ผ ํ ๊ธ์ ์์๊ณผ ์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค.
Desc
: ์กฐ๊ฑด๋ถ ๋ ๋๋ง(์ผํญ ์ฐ์ฐ์)์ ํ์ฉํด์ ํ ๊ธ ํด๋ฆญ ์ฌ๋ถ์ ๋ฐ๋ผ ํ
์คํธ๋ฅผ ๋ณ๊ฒฝํ๋ค.
ํน์ดํ ์ ์ด ์๋ค๋ฉด, ToggleContainer๊ฐ checked ๋ผ๋ props๋ฅผ ์ ๋ฌ๋ฐ๋ ๊ฒ์ด๋ค.
์ ํํ๋ checked={isOn} ๋ถ๋ถ์์ isOn ๊ฐ์ checked props๋ก ์ ๋ฌํ๊ณ ์์ผ๋ฉฐ,
์ด๋ ๊ฒ ์ ๋ฌ๋ checked props๋ ToggleContainer ์ปดํฌ๋ํธ ๋ด๋ถ์์ props.checked๋ก ์ฐธ์กฐ๋์ด ์ฌ์ฉ๋๋ค.
์ด๋ฅผ ํตํด Toggle ์ค์์น์ ์ํ์ ๋ฐ๋ผ ํด๋น ์คํ์ผ์ด ์ ์ฉ๋๋๋ก ๊ตฌํ๋์๋ค.
๋ฌผ๋ก , props๋ฅผ ์ ๋ฌํ์ง ์๋ ๋ฐฉ์์ ์ฌ์ฉํ ์๋ ์๋ค.
ToggleContainer ์คํ์ผ ์ํธ ์ ์ชฝ์ ๋ค์ ์ฝ๋๋ง ์ถ๊ฐ์ํค๋ฉด ๋๋ค.
&.toggle--checked {
background-color: var(--coz-purple-600);
}
Tab Component
Tab
: ํญ์ ์ ๋ฐ์ ์ธ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ค.
boolean
๊ฐ์ด ์๋ number
ํํ๋ก ๊ด๋ฆฌํ๋ค.menuArr
๋ผ๋ ๋ฐฐ์ด ์์ ๋ค๋ฃจ๊ธฐ ์ํด์์ด๋ค.menuArr
: ์ ํ๋ ํญ ์ ๋ณด๋ฅผ ๊ฐ์ฒด ๋ชจ์์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๋ฐฐ์ด์ด๋ค.
selectMenuHandler
: parameter๋ก ํ์ฌ ์ ํํ index
๊ฐ์ ์ ๋ฌํ๋ค.
TabMenu
: ์ ์ชฝ์ ๋ฐฐ์ด์ธ menuArr
์ ๊ฐ์ฒด ์ ๋ณด๋ฅผ map
์ผ๋ก ๋ฟ๋ ค์ค๋ค.
map
ํจ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ์ผ๋ฉฐ, ์ฒซ ๋ฒ์งธ ์ธ์์ธ ๋งค๊ฐ๋ณ์ el
์ ๋ฐฐ์ด์ ์์๋ฅผ ์๋ฏธํ๊ณ ,index
๋ ํด๋น ์์์ ์ธ๋ฑ์ค๋ฅผ ์๋ฏธํ๋ค.map
์ผ๋ก ๊ฐ์ ๋ฟ๋ ค์ง ์ ๋ณด๋ค์ <li>
์์๋ก ๋ ๋๋ง๋๋ฉฐ, onClick
์ผ๋ก ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ํด๋ฆญ ์,selectMenuHandler
ํจ์๋ฅผ ์คํ์์ผ index
์ ๋ณด๋ฅผ ๋๊ฒจ์ค๋ค.index
์ ํ์ฌ ํด๋ฆญํ ํญ์ด ๋ง๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ค.Desc
: ์ ํ๋ ํญ์ ํด๋นํ๋ ๊ฐ์ฒด์ content ์์ฑ์ ๋ํ๋ธ๋ค.
menuArr
๋ฐฐ์ด์์ ์ํ ๊ด๋ฆฌ ์ค์ธ currentTab
๋ณ์์ ํด๋นํ๋ ์ธ๋ฑ์ค์ ์๋ ๊ฐ์ฒด๋ฅผ ์ ํํ๋ค.content
)๋ฅผ ๋ํ๋ธ๋ค.Tag Component
Tag
: ํ๊ทธ์ ์ ๋ฐ์ ์ธ ์ํ ๊ด๋ฆฌ๋ฅผ ํ๋ค.
boolean
๊ฐ์ด ์๋ initialTags
๋ฐฐ์ด ๋ฐ์ดํฐ๋ก ๊ด๋ฆฌํ๋ค.removeTags
: ํ๊ทธ๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ ํจ์์ด๋ค.
indexToRemove
๋ผ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ผ๋ฉฐ, ์ด ๋งค๊ฐ๋ณ์๋ ์ญ์ ํ ํ๊ทธ์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ธ๋ค.setTags
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ tags
์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ค.tags.filter()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํ๋ค.(el, index) => indexToRemove !== index
๋ tags
๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์คํ๋๋ค.indexToRemove
์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ์๋ง true
๋ฅผ ๋ฐํํ์ฌ ํด๋น ์์๋ฅผ ์ ์งํ๋ค. ๋ฐ๋ผ์ indexToRemove
์ ์ผ์นํ๋ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ์์๋ ํํฐ๋ง๋์ด ์ ์ธ๋๋ค.addTags
: event๋ฅผ ํตํด ์
๋ ฅ๋ ๊ฐ์ ํ๊ทธ ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค.
!tags.includes(event.target.value)
์ ์ฌ์ฉํด์ ์ด๋ฏธ ์๋ ํ๊ทธ๋ผ๋ฉด ์ถ๊ฐํ์ง ์๋๋ค.event.target.value !== ""
์ ์ฌ์ฉํด์ ์
๋ ฅ๋ ๊ฐ์ด ๋น์ด์์ง ์์ ๊ฒฝ์ฐ์๋ง ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ค.event.target.value = ""
๋ฅผ ํตํด ์
๋ ฅ ์ฐฝ์ ๊ฐ์ ๋น ๋ฌธ์์ด๋ก ์ค์ ํ์ฌ ๋น์ด๋ค. TagsInput
: ์ฌ์ฉ์๊ฐ ํ๊ทธ๋ฅผ ์
๋ ฅํ๊ณ ์ถ๊ฐํ ์ ์๋๋ก UI๋ฅผ ์ ๊ณตํ๋ค.
<ul>
ํ๊ทธ ๋ด์ ์๋ <li>
ํ๊ทธ๋ค์ tags ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ๋ํด ๋ ๋๋ง๋๋ค.tags.map
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํ๊ทธ๋ฅผ ์ํํ๊ณ , ๊ฐ ํ๊ทธ์ ๋ํ <li>
์์๋ฅผ ์์ฑํ๋ค.<li>
ํ๊ทธ์ ๋ด๋ถ์๋ tag
๊ฐ์ ํ์ํ๋ <span>
์์์ ์ญ์ ์์ด์ฝ์ ๋ํ๋ด๋ <span>
์์๊ฐ ์๋ค.removeTags
ํจ์๋ ์ญ์ ์์ด์ฝ์ด ํด๋ฆญ๋๋ฉด ์คํ๋๋๋ก ์ฐ๊ฒฐ๋์ด ์๋ค.<input>
์์๋ ํ๊ทธ๋ฅผ ์
๋ ฅ๋ฐ๋ ์ญํ ์ ํ๋ค.addTags
ํจ์๊ฐ ์คํ๋๋ค.onKeyUp
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ณด๋์ Enter ํค๋ฅผ ๊ฐ์งํ๊ณ , ์ด ๊ฒฝ์ฐ์ addTags
ํจ์๊ฐ ์คํ๋๋ค.๐ก ๋ฒ๋ธ๋ง
HTML ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ์์๋ก ์ ํ๋๋ ๋์์ ๋งํ๋ค.
์ฆ, ํ์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์์ ์์๋ก ์ฐ์์ ์ผ๋ก ์ ๋ฌ๋๋ ๊ฒ์ ์๋ฏธํ๋ค.
HTML ์์๋ค์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์์์ ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ค.
์ด๋, ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ํ ์ด๋ฒคํธ๊ฐ ๊ณ์ ์ ํ๋๋๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋์ด ์๋ค.
์ด๋ฒคํธ๊ฐ ์ ํ๋ ๋๋ ์ด๋ฒคํธ '์บก์ฒ๋ง' ๋จ๊ณ์ '๋ฒ๋ธ๋ง' ๋จ๊ณ๋ก ๋๋ ์ง๋ค.
<div id="outer">
<div id="inner">
<button id="button">Click me!</button>
</div>
</div>
button ์์๋ฅผ ํด๋ฆญํ์ ๋ ๋ฐ์ํ๋ click ์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง์ ํตํด ์์ ์์๋ก ์ ํ๋๋ค.
๋ฐ๋ผ์, button ์์์ ์ฐ๊ฒฐ๋ click ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋จผ์ ์คํ๋ ํ, inner ์์์ click ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๊ณ , ๋ง์ง๋ง์ผ๋ก outer ์์์ click ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์คํ๋๋ค.
์ด๋ฌํ ๋ฒ๋ธ๋ง ๋์์ ์ด๋ฒคํธ์ ์ ํ ๊ฒฝ๋ก์ ๋ฐ๋ผ ์์ ์์์์ ํ์ ์์๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์คํํ๋๋ก ์ค๊ณํ ์ ์๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ์์ ์์์์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ํ, ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ event.stopPropagation() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋ฒ๋ธ๋ง์ ์ค์ง์ํฌ ์๋ ์๋ค.
๐ก event.stopPropagation() ๋ฉ์๋
์ด๋ฒคํธ์ ์ ํ๋ฅผ ์ค์ง์ํค๋ ์ญํ ์ ํ๋ค.
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์์์ ์์ํ์ฌ ์์ ์์๋ก์ ์ด๋ฒคํธ ์ ํ๊ฐ ์ค์ง๋๋ค.
๋ค์ ๋งํด, ํธ์ถ๋ ์์์์๋ถํฐ ์์ ์์๋ก์ ๋ฒ๋ธ๋ง์ด ๋ฉ์ถ๊ฒ ๋๋ค.
์ด ๋ฉ์๋๋ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ฌ์ฉ๋๋ค.
ํน์ ์์์์ ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๊ณ ๋ ์ด์์ ๋ฒ๋ธ๋ง์ ์์น ์์ ๋:
ํน์ ์์์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ดํ์ ์์ ์์์ ๋ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฒํผ์ ๋ํ ๋์์ ์ฒ๋ฆฌํ๊ณ , ์์ ์์์ ๋ํ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ค์ฒฉ๋ ์์์์ ์ด๋ฒคํธ์ ์ค๋ณต ์คํ์ ๋ฐฉ์งํ ๋:
์์ ์์์ ํ์ ์์ ๊ฐ์ ์ค์ฒฉ๋ ๊ตฌ์กฐ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ค๋ณต์ผ๋ก ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ ์์ดํ
์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ ๋, ๋ฆฌ์คํธ์ ์ ์ฒด ์์ญ์ ๊ฐ์ธ๋ ์์ ์์์์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ์ค์ฒฉ๋ ๋ฆฌ์คํธ ์์ดํ
์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ถํ์ํ๊ฒ ์คํ๋์ง ์๋๋ก event.stopPropagation()์ ์ฌ์ฉํ ์ ์๋ค.
์ฃผ์ํ ์ ์ event.stopPropagation()์ ์ด๋ฒคํธ ์ ํ๋ฅผ ํ์ฌ ์์์์๋ง ์ค์ง์ํค๊ณ , ๋ค๋ฅธ ์์์ ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๊ณ์ ์คํ๋ ์ ์๋ค๋ ์ ์ด๋ค. ๋ฐ๋ผ์, ๋์ผํ ์ด๋ฒคํธ์ ๋ํด ๋ค๋ฅธ ์์์์๋ ์ค์ง์ํค๊ณ ์ ํ๋ค๋ฉด ๊ฐ ์์์ ๋ํด ๊ฐ๋ณ์ ์ผ๋ก event.stopPropagation()์ ํธ์ถํด์ผ ํ๋ค.
๐ก
.toggle-container.toggle--checked
์.toggle-container .toggle--checked
.toggle-container.toggle--checked
: .toggle-container์ .toggle--checked ํด๋์ค๊ฐ ๋์์ ์ ์ฉ๋ ์์๋ฅผ ์ ํํ๋ค. ์ฆ, ๊ฐ์ ์์์ ๋ ๊ฐ์ ํด๋์ค๊ฐ ํจ๊ป ์ ์ฉ๋ ๊ฒฝ์ฐ๋ฅผ ์ ํํ๋ค..toggle-container .toggle--checked
: .toggle-container ์์์ ํ์์ ์๋ .toggle--checked ํด๋์ค๊ฐ ์ ์ฉ๋ ์์๋ฅผ ์ ํํ๋ค. ์ฆ, .toggle-container ์์์ ์์ ์์ ์ค์ .toggle--checked ํด๋์ค๊ฐ ์ ์ฉ๋ ์์๋ฅผ ์ ํํ๋ค.&.toggle--checked
์ผ๋ก๋ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค !