[React] ๐Ÿ“– MUI ๋ž€?

์–ธ์ง€ยท2024๋…„ 12์›” 7์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
9/13
post-thumbnail

๐Ÿ“ MUI ๋ž€?

: Material Design ์„ ๊ตฌํ˜„ํ•ด๋†“์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

: ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‰ฝ๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋””์ž์ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.


๐Ÿ“ MUI์˜ ์žฅ์ 

  1. ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋””์ž์ธ

    • ๋ฒ„ํŠผ, ์ž…๋ ฅ์ฐฝ, ๋ฉ”๋‰ด, ์นด๋“œ ๊ฐ™์€ ๋””์ž์ธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋งŒ๋“ค์–ด์ ธ์žˆ๋‹ค.
      import Button from '@mui/material/Button';
    
      function App() {
          return <Button />;
      }
    

    ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๋””์ž์ธ ์ปดํฌ๋„ŒํŠธ์„ ์„ ์–ธํ•˜๊ณ  ์ฝ”๋“œ์— ์ปดํฌ๋„ŒํŠธ๋ช… (Button)์„ ์„ ์–ธํ•˜๋ฉด ๋œ๋‹ค.

  2. ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋””์ž์ธ์„ ๋‚ด ์Šคํƒ€์ผ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์ƒ‰๊น”๊ณผ ๋ชจ์–‘์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

    import { styled } from '@mui/material/styles';
     import Button from '@mui/material/Button';
    
     export const CustomButton1 = styled(Button)(({ theme }) => ({
         position: 'relative', // ::before ๊ฐ€์ƒ ์š”์†Œ๊ฐ€ ๋ฒ„ํŠผ ๋‚ด๋ถ€์— ์œ„์น˜ํ•˜๋„๋ก ์„ค์ •
         overflow: 'hidden', // ๋ฒ„ํŠผ ์™ธ๋ถ€๋กœ ๋ฒ—์–ด๋‚˜๋Š” ์š”์†Œ๋ฅผ ์ˆจ๊น€
         borderRadius: '50%',
         padding: 0, // ๋ฒ„ํŠผ์˜ padding ์ œ๊ฑฐ
         border: 'none', // ๋ถˆํ•„์š”ํ•œ border๊ฐ€ ์—†๋„๋ก ์„ค์ •
         width: '65px', // ๋ฒ„ํŠผ์˜ ๊ฐ€๋กœ ํฌ๊ธฐ
         height: '65px', // ๋ฒ„ํŠผ์˜ ์„ธ๋กœ ํฌ๊ธฐ (๊ฐ€๋กœ์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •)
         '&::before': {
             content: '""',
             position: 'absolute',
             top: 0,
             left: 0,
             width: '100%',
             height: '100%',
             borderRadius: 'inherit',
             backgroundColor: 'rgba(245, 245, 245, 0)', // ์ดˆ๊ธฐ์—๋Š” ํˆฌ๋ช…
             transition: 'background-color 0.3s ease', // ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜ ํšจ๊ณผ
             zIndex: 1,
         },
         '&:hover::before': {
             backgroundColor: 'rgba(245, 245, 245, 0.7)', // ํ˜ธ๋ฒ„ ์‹œ ๋‚ด๋ถ€์— ํˆฌ๋ช…ํ•œ ํšŒ์ƒ‰ ์˜ค๋ฒ„๋ ˆ์ด ์ ์šฉ
             borderRadius: '50%',
         },
         '&:hover': {
             backgroundColor: 'rgba(245, 245, 245, 0)', // ๊ธฐ๋ณธ ํŒŒ๋ž€์ƒ‰ ํ˜ธ๋ฒ„ ์Šคํƒ€์ผ ๋ฎ์–ด์“ฐ๊ธฐใ„ด
             borderRadius: '50%',
         },
     }));

โ—๏ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•œ ์ปดํฌ๋„ŒํŠธ๋ช…์ด CustomButton1 ์ด๋ฏ€๋กœ ์ด ๋””์ž์ธ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ์šฉํ•  ํŽ˜์ด์ง€.js(x) ํŒŒ์ผ์— CustomButton1 import ํ•˜๊ณ  ์œ„์น˜ํ•˜๊ณ ์žํ•˜๋Š” ๊ณณ์— <CustomButton1 /> ์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

  1. ๋ฐ˜์‘ํ˜• ๋””์ž์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
    • ์ปดํ“จ๋„ˆ, ํƒœ๋ธ”๋ฆฟ, ์Šค๋งˆํŠธํฐ ํ™”๋ฉด ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋””์ž์ธ์ด ์กฐ์ •์ด๋œ๋‹ค.

๐Ÿ“ MUI ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

โฌ‡๏ธ ๋‹ค์šด๋กœ๋“œ

npm install @mui/material [๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค]

๐Ÿ“ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค ์ข…๋ฅ˜

  • @mui/materia : MUI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณต
  • @emotion/react : CSS-in-JS ๋ฐฉ์‹์œผ๋กœ ์Šคํƒ€์ผ ์ž‘์„ฑ
    (CSS-in-JS ๋ฐฉ์‹ : ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์•ˆ์—์„œ CSS ์Šคํƒ€์ผ์„ ์ž‘์„ฑ)
  • @emotion/styled : React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์Šคํƒ€์ผ๋ง๋œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ฆ
    (import { styled } from '@mui/material/styles';) ์„ ์–ธ
  • @mui/icons-material : MUI์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์•„์ด์ฝ˜์„ ์ œ๊ณต
    (import [์•„์ด์ฝ˜๋ช…] from '@mui/icons-material/[์•„์ด์ฝ˜๋ช…]';) ์„ ์–ธ
    https://mui.com/material-ui/material-icons/ โžก๏ธ ์—ฌ๊ธฐ์—์„œ ์•„์ด์ฝ˜์„ ๊ฐ€์ ธ์˜จ๋‹ค.

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