์žฌ๋ฐŒ๊ฒŒ ํ•ฉ์‹œ๋‹ค

๊ธฐ๋กํ•˜๊ธฐ, ๊ฐ€์‹œํ™”ํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก/YSS | ์—ฐ์„ธ๋Œ€ํ•™๊ต ๊ณต๊ฐ„๋Œ€๊ด€ ์„œ๋น„์Šค

์‚ฌ์ด๋“œ๋ฐ” ๊ตฌํ˜„ํ•˜๊ธฐ | UI

์€๋˜๋”” 2022. 9. 18. 12:40
์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

 

๋ช…ํ™•ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ์—†์ด ๋‹จ์ง€ ๊ฐ•์˜์‹ค ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค.

์–ด๋–ค ์‹์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•  ์ง€ ๊ฐ์ด ์•ˆ์™€์„œ, ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

Ant Design

Ant design - components - layout

Ant design ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‹ค์–‘ํ•œ ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค. ์‹ค์ œ๋กœ ์กฐ์ž‘ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ณ , ๋Œ€๋žต์ ์ธ ์ฝ”๋“œ๋„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ ์ค‘ ์œ„ ์ด๋ฏธ์ง€์— ์žˆ๋Š” ์‚ฌ์ด๋“œ๋ฐ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

Ant Design ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ถ„์„ ๋ฐœ์ทŒํ•ด์™”๋‹ค. ์ด์ค‘ Menu ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด๋ฉด, props๋กœ items๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค. items์— ์ „๋‹ฌ๋˜๋Š” ์˜ˆ์ œ ๊ฐ์ฒด๋ฅผ ์‚ดํŽด๋ดค๋”๋‹ˆ, children์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์„œ๋ธŒ ๋ฉ”๋‰ด๋“ค์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ๋‹ค.

์ฆ‰, Menu ์ปดํฌ๋„ŒํŠธ์— ์„œ๋ธŒ ๋ฉ”๋‰ด๊ฐ€ ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด Menu ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์„œ๋ธŒ ๋ฉ”๋‰ด๋“ค์„ ๋ Œ๋”๋งํ•œ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„

Ant design์—์„œ ์ฐธ๊ณ ํ•œ ์‚ฌ์ด๋“œ๋ฐ” ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋‚˜์—ดํ•ด ๋ณด์•˜๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ์„ธ ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค. 1. ๋ฉ”์ธ ๋ฉ”๋‰ด(๊ฑด๋ฌผ) 2. ๊ทธ ์•ˆ์— ๋“ค์–ด๊ฐˆ ์„œ๋ธŒ ๋ฉ”๋‰ด(๊ฐ•์˜์‹ค) 3. ์ปจํ…Œ์ด๋„ˆ

์ข€ ๋” ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ๋ถ„์„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

๋ฉ”๋ชจ์žฅ์— ์ •๋ฆฌํ•œ ์‚ฌ์ด๋“œ๋ฐ” UI ์š”๊ตฌ๋ถ„์„

์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

Sidebar: ์ปจํ…Œ์ด๋„ˆ

  • ์‚ฌ์ด๋“œ๋ฐ” ์ „์ฒด ๋ฐ•์Šค
  • useRecoilValue๋กœ ์กฐํšŒํ•œ ์ƒํƒœ๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ

SidebarItem: ๋ฉ”๋‰ด

๋ฉ”์ธ ๋ฉ”๋‰ด์™€ ์„œ๋ธŒ ๋ฉ”๋‰ด๋ฅผ ํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๋‘˜์˜ ๊ธฐ๋Šฅ์ด ๊ฑฐ์˜ ๋™์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ๋ฒ„ํŠผ์œผ๋กœ์„œ ๋™์ž‘ํ•œ๋‹ค. (=ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ณ , ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.)
  • props๋กœ ๋ฐ›์€ ์ •๋ณด๋ฅผ ๋ Œ๋”๋ง ํ•œ๋‹ค.

์‚ฌ์‹ค ์ด ๋‘ ๊ฐ€์ง€๊ฐ€ ์ „๋ถ€์˜€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ ๋‹ค์Œ ๋ฌธ์ œ๋Š”, ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ถ„ํ•  ๊ฒƒ์ธ๊ฐ€์˜€๋Š”๋ฐ, ๊ฐœ์ธ์ ์œผ๋กœ flag ๋ณ€์ˆ˜๋ฅผ ๋‘๋Š” ๊ฑธ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•ด ๋‚ธ ๋ฐฉ๋ฒ•์€ children props์˜ ์—ฌ๋ถ€๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. children prop์ด ์กด์žฌํ•˜๋ฉด ๋ฉ”์ธ ๋ฉ”๋‰ด, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ๋ธŒ ๋ฉ”๋‰ด์ด๋‹ค. ๋”ฐ๋ผ์„œ children props ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์กฐ๊ฑด์œผ๋กœ, ํ•œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๋งˆํฌ์—…

๋งˆํฌ์—…์œผ๋กœ๋Š” ulํƒœ๊ทธ์™€ liํƒœ๊ทธ๋ฅผ ์ด์šฉํ–ˆ๋‹ค. navigation, menu์˜ ๊ฒฝ์šฐ ul ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. SidebarItem ์ปดํฌ๋„ŒํŠธ๋ฅผ li ํƒœ๊ทธ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

์‹ค์ œ ์ฝ”๋“œ

Sidebar

ulํƒœ๊ทธ ๋‚ด์— liํƒœ๊ทธ์ธ SidebarItem ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ Œ๋”๋งํ•œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ์—ญํ• ์˜ Sidebar ์ปดํฌ๋„ŒํŠธ

SidebarItem

  • children์ด ์žˆ์œผ๋ฉด SidebarItem์„ ์‚ฌ์šฉํ•ด children props๋ฅผ ๋ Œ๋”๋งํ–ˆ๋‹ค.
  • ๋ฉ”์ธ ๋ฉ”๋‰ด/์„œ๋ธŒ ๋ฉ”๋‰ด ๋ณ„๋กœ ํด๋ฆญ ์‹œ์— ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ๋™์ž‘์ด ๋‹ค๋ฅด๋‹ค. ๋”ฐ๋ผ์„œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด onClick prop์— ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋งคํ•‘ํ–ˆ๋‹ค.
    • ๋ฉ”์ธ ๋ฉ”๋‰ด์˜ ๊ฒฝ์šฐ ํ† ๊ธ€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, open state๋ฅผ ์ •์˜ํ•ด open ์ƒํƒœ์— ๋”ฐ๋ผ children์„ ๋ Œ๋”๋งํ–ˆ๋‹ค. onClick ์‹œ open state๋ฅผ ํ† ๊ธ€ํ•˜๋Š” ํ•จ์ˆ˜ openSubMenu๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    • ์„œ๋ธŒ ๋ฉ”๋‰ด์˜ ๊ฒฝ์šฐ ํด๋ฆญ ์‹œ ์กฐํšŒํ•  ๊ฐ•์˜์‹ค์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค. useRecoilState์˜ setํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด atom๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” selectClassroom ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด SidebarItem์€

  • ๊ฐœ๋ณ„ ๊ฑด๋ฌผ, ๊ฐ•์˜์‹ค์„ ์˜๋ฏธํ•œ๋‹ค.
  • props๋กœ ์ž์‹ ์ด ํ•ด๋‹นํ•˜๋Š” ๊ฑด๋ฌผ, ๊ฐ•์˜์‹ค์˜ ์ด๋ฆ„์„ ๋ฐ›๋Š”๋‹ค. ์ด๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
  • ๋ฉ”์ธ ๋ฉ”๋‰ด์˜ ๊ฒฝ์šฐ ์„œ๋ธŒ ๋ฉ”๋‰ด๋“ค์„ open/closeํ•˜๋Š” ๊ธฐ๋Šฅ ๋งŒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์‚ฌ์ด๋“œ๋ฐ” ๊ตฌํ˜„ ๋‹น์‹œ์—๋Š” ๋Œ€๊ด€ ํ˜„ํ™ฉ ์กฐํšŒ ์š”์ฒญ ์‹œ ๊ฐ•์˜์‹ค ์ •๋ณด๋งŒ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ตœ์ข…์ ์ธ API์—์„œ๋Š” ๊ฑด๋ฌผ ์ •๋ณด์™€ ๊ฐ•์˜์‹ค ์ •๋ณด ๋‘ ๊ฐœ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ด์„œ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€ ๊ณ ๋ฏผ์ด ๋œ๋‹ค.