CHZZK-Study / Grass-Diary-Client

์ทจ์ง€์ง 2ํŒ€ ํ”„๋กœ์ ํŠธ Grass Diary
1 stars 3 forks source link

๐Ÿ’„design: NavBar ์ปดํฌ๋„ŒํŠธ ๋””์ž์ธ ๋ณ€๊ฒฝ #164

Closed rkdcodus closed 2 months ago

rkdcodus commented 2 months ago

โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๐Ÿ“ ์ž‘์—… ์ƒ์„ธ ๋‚ด์šฉ

1๏ธโƒฃ ์Šคํƒ€์ผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๋ฐ sementic ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ๋ณ€๊ฒฝ

styles ์ ˆ๋Œ€ ๊ฒฝ๋กœ์— s๊ฐ€ ๋น ์ ธ์žˆ๋Š” ์˜คํƒ€๊ฐ€ ์žˆ์–ด ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

image ํ”ผ๊ทธ๋งˆ์˜ sementic background ํ•„๋“œ๊ฐ€ bg๋กœ ๋˜์–ด์žˆ์–ด background -> bg ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ @svgr/rollup ์„ค์น˜ ๋ฐ svg, image ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์„ค์ •

svg ์‚ฌ์šฉ์ด ๋งŽ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. svgํŒŒ์ผ๊ณผ png ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด assets์— svg, image ํด๋”๋ฅผ ์ƒ์„ฑํ•ด๋‘์—ˆ๊ณ  @svg, @image ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

svg ์ด๋ฏธ์ง€ ์‚ฌ์šฉ๋ฒ•

svg๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ importํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import { ReactComponent as LogoSVG } from '@svg/logo.svg';
...

<LogoSVG />

์ด๋ ‡๊ฒŒ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด svg์˜ ์ตœ๋Œ€ ์žฅ์ ์ธ ์ƒ‰์ƒ, ํฌ๊ธฐ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ ๋งํฌ ๋‹ฌ์•„๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ img ํƒœ๊ทธ์˜ src ๊ฒฝ๋กœ๋กœ ์ง€์ •๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ svg ์ด๋ฏธ์ง€์˜ ์ƒ‰์ƒ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

import avatarBg from '@svg/avatarBg.svg';
...

<img src={avatarBg}></img>

svg๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ svg ์ด๋ฏธ์ง€๋ฅผ ReactComponent๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด costom.d.ts ํŒŒ์ผ์„ ๋งŒ๋“  ๋’ค tsconfig.json์˜ includes์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, svg๋ฅผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ฃผ๋Š” svgr๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. CRA๋กœ ๋ฆฌ์•กํŠธ์•ฑ์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ์ž๋™ ์„ค์ •๋˜์–ด์žˆ์ง€๋งŒ, ์ž”๋””์ผ๊ธฐ ์ฒ˜๋Ÿผ Vite๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ง์ ‘ ์„ค์ •ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— @svgr/rollup๋ฅผ ์„ค์น˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ ButtonWrapper/Interaction ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

ํ”ผ๊ทธ๋งˆ ๋””์ž์ธ์˜ interaction๋ถ€๋ถ„(hover, focus ๋“ฑ)์€ ๋ ˆ์ด์–ด์ฒ˜๋Ÿผ ์Œ“์•„์•ผ ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ButtonWrapper์™€ Interaction ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Interaction์€ ํ”ผ๊ทธ๋งˆ์— ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ๊ณผ ๊ฐ™์ด Interaction1, Interaction2, Interaction3, Interaction4๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

props

์‚ฌ์šฉ ์˜ˆ์‹œ

<ButtonWrapper>
     // Interaction์€ ์›ํ•˜๋Š” ์š”์†Œ๋ฅผ ๊ฐ์‹ธ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ทธ๋ƒฅ ์•ž์— ์œ„์น˜.
    <Interaction1  onClick={ํ•จ์ˆ˜}  topRadius={8} bottomRadius={8} />
    <LoginBtn>๋กœ๊ทธ์ธ</LoginBtn>
</ButtonWrapper>

Interaction์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” ButtonWrapper๋กœ ๊ฐ์‹ธ์ค€ ํ›„ ์ธํ„ฐ๋ž™์…˜์ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ์•ž์— ๊ฑธ์–ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 2024-08-04 21;39;51

4๏ธโƒฃ Menu/Menus ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

Menu ์ปดํฌ๋„ŒํŠธ

ํ—ค๋”์˜ ๋ฉ”๋‰ด๋ฐ” ์™ธ์—๋„ ์—ฌ๋Ÿฌ ์„ค์ •๋ฐ”์— ๊ฐ™์ด ์“ฐ๊ธฐ ์œ„ํ•ด Menu ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋‰ด๋ฐ”์— ๋“ค์–ด๊ฐ€๋Š” ํ•˜๋‚˜์˜ ๋ฉ”๋‰ด ์ปดํฌ๋„ŒํŠธ ์ž…๋‹ˆ๋‹ค.

props

link, onClick, line, topRadius, bottomRadius์€ ์ƒ๋žต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Menus ์ปดํฌ๋„ŒํŠธ

Menus๋Š” Menu๋ฅผ ๊ฐ์‹ธ๋Š” Container ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

props

์‚ฌ์šฉ์˜ˆ์‹œ

    <Menus toggle={toggle}>
        <Menu link={'/mypage'} text={'๋งˆ์ดํŽ˜์ด์ง€'} svg={person} line={4} topRadius={16}/>
        <Menu link={'/setting'} text={'์„ค์ •'} svg={setting} />
        <Menu onClick={handleLogout} text={'๋กœ๊ทธ์•„์›ƒ'} svg={logout} />
        <Menu onClick={deleteAccount} text={'ํƒˆํ‡ด'} svg={person_remove} bottomRadius={16}/>
      </Menus>

2024-08-05 02;01;40

๐Ÿ’ก (์ถ”๊ฐ€)

styled props ์•ž์— $ prefix ๋‹ฌ๊ธฐ

// toggle์ด๋ผ๋Š” ์ปค์Šคํ…€ ์†์„ฑ์„ ์‚ฌ์šฉํ•œ Menus ์ปดํฌ๋„ŒํŠธ 
const Menus = ({ children, toggle }: MenusProps) => {
  return <MenusContainer $toggle={toggle}>{children}</MenusContainer>;
};

const MenusContainer = styled.div<{ $toggle: boolean }>`
  height: ${props => (props.$toggle ? 'auto' : '0px')};
...
`;

styled component ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ topRadius, bottomRadius, toggle์™€ ๊ฐ™์€ ์ปค์Šคํ…€ ์†์„ฑ์€ HTML DOM์—์„œ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ styled-component๋Š” ๋ชจ๋“  ์ปค์Šคํ…€ ์†์„ฑ์„ HTML ์†์„ฑ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ React props ๋กœ ์ „๋‹ฌ ๋˜๊ฑฐ๋‚˜, DOM ์š”์†Œ๋กœ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋„๋ก ๊ธฐํ˜ธ($)๋ฅผ prefix๋กœ ๋ถ™์ด๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด ์ด๋ฅผ ์ด์šฉํ•ด ๊ฒฝ๊ณ ๋ฌธ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšจ ๋ฒ„๊ทธ ๋ฐœ์ƒ ์ด์œ  (์„ ํƒ ์‚ฌํ•ญ)

๐Ÿ”Ž ํ›„์† ์ž‘์—… (์„ ํƒ ์‚ฌํ•ญ)

๐Ÿค” ์งˆ๋ฌธ ์‚ฌํ•ญ (์„ ํƒ ์‚ฌํ•ญ)

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ (์„ ํƒ ์‚ฌํ•ญ)

[React] SVG ํ™œ์šฉ๋ฒ• React์—์„œ svgํŒŒ์ผ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ• (create-react-app)

vite ํ™˜๊ฒฝ์—์„œ svg๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ ์„ค์ • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ƒ์—์„œ svg ํŒŒ์ผ์„ ์ปดํฌ๋„ŒํŠธ๋กœ์„œ importํ•  ๋•Œ ๋ฌธ์ œ]

Warning: Received "true" for a non-boolean attribute ํ•ด๊ฒฐํ•˜๊ธฐ

๐Ÿ“ธ ์Šคํฌ๋ฆฐ์ƒท (์„ ํƒ ์‚ฌํ•ญ)

๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์Šคํฌ๋ฆฐ์ƒท์ด ์žˆ๋‹ค๋ฉด ์ฒจ๋ถ€ํ•ด์ฃผ์„ธ์š”.

โœ… ์…€ํ”„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

์ด์Šˆ ๋ฒˆํ˜ธ: Close #165