๐Ÿค Web/๐ŸŒ React

Styled Component์—์„œ ์ปดํฌ๋„ŒํŠธ ํ™•์žฅํ•˜๊ธฐ

chamroro 2025. 3. 26. 20:29

์˜›๋‚ ์— ๋ฆฌ์•กํŠธ ์ฒ˜์Œ ์ตํž๋•Œ ๋‹ค ๊ณต๋ถ€ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ํ”„๋กœ์ ํŠธ๋“ค์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๋น„์Šทํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ๋ฌด์‹œํ•˜๊ณ  ๊ณ„์† ํ•˜๋‹ค๊ฐ€ .. '์•„ ์˜›๋‚ ์— ์ด๊ฑฐ ๊ณต๋ถ€ํ–ˆ์—ˆ๋Š”๋ฐ .. ' ์‹ถ์–ด์„œ ์ •๋ฆฌํ•˜๊ฒŒ๋๋‹ค. 

 

์ผ๋‹จ ๊ทธ ์ „์— styled component ๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” 
๊ธฐ์กด์— div๋ฅผ ๋งŒ๋“ค๊ณ  className ์ด๋‚˜ style์„ ๋ถ€์—ฌํ•˜๋Š” ์‹์ด์—ˆ์ง€๋งŒ,

๋Œ€์‹  styled๋ฅผ ์ž„ํฌํŠธ ํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  html ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๊ณ , ๋ฐฑํ‹ฑ ์•ˆ์— css์ฝ”๋“œ๋ฅผ ์ ์–ด์ค€๋‹ค. -> ์ปดํฌ๋„ŒํŠธ 

์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํƒ€์ผ๋ง ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์•ˆ์— ์Šคํƒ€์ผ์„ ์ ์„ ํ•„์š”๊ฐ€ ์—†๊ณ , ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค. 

 

๋‚˜๋Š” ํผ์งํ•œ or ๋งŽ์ด ์‚ฌ์šฉํ• ๋งŒํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋กœ ์ง€์ •ํ•˜๊ณ , ๊ทธ ์•ˆ์˜ ์ž์ž˜ํ•œ ํ…์ŠคํŠธ๋‚˜ ๋ฒ„ํŠผ๋“ค์€ ๊ทธ๋ƒฅ html ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๋ชจ๋“  ui ์š”์†Œ๋ฅผ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋กœ ์ง€์ •ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ๊ท€์ฐฎ์•„์„œ์˜€๋‹ค.... ์žฅ๋‹จ์ ์ด ์žˆ์ง€๋งŒ,, ์˜ค๋Š˜ ๋ณต์Šตํ–ˆ๋˜ ๊ธฐ๋Šฅ๋“ค์€ ๊ผญ ์จ๋ณด๊ณ  ์‹ถ๋‹ค. 
 

 



React์—์„œ styled-components๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ธฐ์กด์— ๋งŒ๋“  ์Šคํƒ€์ผ์„ ์žฌ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๊ฐ€ styled(๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ) ๋ฌธ๋ฒ•์ด๋‹ค.

 

โœ… ๊ธฐ๋ณธ Box ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

๋จผ์ €, ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ฐ•์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.

const Box = styled.div` 
	background-color: ${(props) => props.bgColor}; 
    width: 100px; 
    height: 100px; 
`;
 

์ด Box๋Š” bgColor๋ผ๋Š” prop์„ ๋ฐ›์•„ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ํ›จ์”ฌ ๋†’์•„์ง„๋‹ค.


โœ… Box๋ฅผ ํ™•์žฅํ•˜์—ฌ Circle ๋งŒ๋“ค๊ธฐ

Box ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™•์žฅํ•ด์„œ Circle์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. styled(Box)๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

const Circle = styled(Box)` 
	border-radius: 50px; 
`;

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Box์˜ ์Šคํƒ€์ผ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ, border-radius ์†์„ฑ๋งŒ ์ถ”๊ฐ€๋œ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


โœ… ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ

 
function App() { 
	return ( 
    	<Father> 
        	<Box bgColor="teal" /> 
            <Circle bgColor="tomato" /> 
        </Father>
   );
}

๊ฒฐ๊ณผ ํ™”๋ฉด:

  • Box: ๋ฐฐ๊ฒฝ์ƒ‰์ด teal์ธ ์ •์‚ฌ๊ฐํ˜•
  • Circle: ๋ฐฐ๊ฒฝ์ƒ‰์ด tomato์ด๊ณ , ๋‘ฅ๊ธ€๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด ์›ํ˜•์ด ๋จ

์ถ”๊ฐ€ )

attrs์™€ as ์†์„ฑ์œผ๋กœ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ


styled-components๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ˆœํžˆ ์Šคํƒ€์ผ๋ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ปดํฌ๋„ŒํŠธ์˜ ํƒœ๊ทธ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ .attrs()์™€ as prop์ด๋‹ค.


โœ… .attrs()๋กœ ๊ธฐ๋ณธ ์†์„ฑ ์ง€์ •ํ•˜๊ธฐ

attrs()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTML ์†์„ฑ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด input ์ปดํฌ๋„ŒํŠธ์— required, minLength ์†์„ฑ์„ ํ•ญ์ƒ ์ ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค. ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•  ๋•Œ, ๋งค๋ฒˆ HTML ์†์„ฑ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜์„œ ํŽธ๋ฆฌํ•จ! 

const Input = styled.input.attrs({ required: true, minLength: 10, })` 
	background-color: tomato; 
`;
 
 

โœ… .attrs()๋Š” props๋กœ ๋ฐ›์•„์„œ ๋™์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค!


โœ… as prop์œผ๋กœ ํƒœ๊ทธ ๋ฐ”๊พธ๊ธฐ

์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฒ„ํŠผ(<button>)์œผ๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋งํฌ(<a>)๋กœ๋„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ as ์†์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Btn์ด๋ผ๋Š” ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ •์˜ํ–ˆ๋‹ค๋ฉด:

const Btn = styled.button` 
	background-color: tomato; 
    border: none; 
    padding: 10px 20px; 
    color: white; 
    font-weight: bold; 
    cursor: pointer; 
`;
 
as="a"๋ฅผ ์‚ฌ์šฉํ•ด์„œ <a> ํƒœ๊ทธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
function App() { 
	return ( 
    	<Father> 
        	<Btn>Log in</Btn> 
            <Btn as="a" href="/">Log in</Btn> 
        </Father> 
    ); 
}

 

 

 

๋ฐ˜์‘ํ˜•