5.props์™€ attrs

props

์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ์—์„œ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ์— ์ถ”๊ฐ€ ์†์„ฑ์„ ์ „๋‹ฌํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ๋ฒ•์—๋Š” props์™€ attrs์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ์˜ ํ”„๋กœํผํ‹ฐ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์†Œํ’ˆ์€ ์Šคํƒ€์ผ ์ •์˜ ๋‚ด์—์„œ ์•ก์„ธ์Šคํ•˜๊ณ  ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์Šคํƒ€์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  1. ๋ณด๊ฐ„(Interpolation): ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ์ •์˜ ๋‚ด์—์„œ ์†Œํ’ˆ์„ ๋ณด๊ฐ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด color๋ผ๋Š” ์ด๋ฆ„์˜ ์†Œํ’ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ‰์ƒ ์†์„ฑ์„ ๋™์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณด๊ฐ„(Interpolation) - ์•Œ๋ ค์ง„ ์ง€์ ์˜ ๊ฐ’ ์‚ฌ์ด(์ค‘๊ฐ„)์— ์œ„์น˜ํ•œ ๊ฐ’์„ ์•Œ๋ ค์ง„ ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

const Button = styled.button`
  color: ${props => props.color};
`;
  1. ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง(Conditional Styling): ์†Œํ’ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์„ ์กฐ๊ฑด๋ถ€๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด isPrimary๋ผ๋Š” ์†Œํ’ˆ์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋ฒ„ํŠผ์˜ ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

const Button = styled.button`
  background-color: ${props => props.isPrimary ? 'blue' : 'gray'};
`;

attrs

์Šคํƒ€์ผ์ด ์ง€์ •๋œ ์ปดํฌ๋„ŒํŠธ์˜ attrs ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ€์ผ๋ง๊ณผ ๊ด€๋ จ์ด ์—†๋Š” ์ถ”๊ฐ€ ์†์„ฑ์„ ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์†์„ฑ์€ ์ •์  ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ปดํฌ๋„ŒํŠธ ์†Œํ’ˆ์—์„œ ํŒŒ์ƒ๋œ ๋™์  ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

  1. ์ •์  ์†์„ฑ(Static Attributes): attrs ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ์— ์ •์  ์†์„ฑ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๊ธฐ๋ณธ DOM ์š”์†Œ์— ์ถ”๊ฐ€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

const Link = styled.a.attrs({
  target: "_blank",
  rel: "noopener noreferrer",
})`
  color: blue;
`;

์ด ์˜ˆ์ œ์—์„œ ๋งํฌ ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€์ƒ ๋ฐ rel ์†์„ฑ์ด ๊ฐ๊ฐ "_blank" ๋ฐ "noopener noreferrer"๋กœ ์„ค์ •๋œ <a> ํƒœ๊ทธ๋กœ ๋ Œ๋”๋ง๋œ๋‹ค.

  1. ๋™์  ์†์„ฑ(Dynamic Attributes): attrs ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ์†Œํ’ˆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์  ์†์„ฑ์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ถ€๋กœ ์†์„ฑ์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

const Button = styled.button.attrs(props => ({
  disabled: props.isLoading,
}))`
  background-color: ${props => props.isPrimary ? 'blue' : 'gray'};
`;

์ด ์˜ˆ์ œ์—์„œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋Š” isLoading ํ”„๋กœํผํ‹ฐ์— ๋”ฐ๋ผ ๋น„ํ™œ์„ฑํ™” ์†์„ฑ์ด ์„ค์ •๋œ๋‹ค. isLoading์ด ์ฐธ์ด๋ฉด ๋ฒ„ํŠผ์ด ๋น„ํ™œ์„ฑํ™”๋œ๋‹ค.

์ค‘์š”ํ•œ ์ ์€ attrs ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์˜ ์Šคํƒ€์ผ๋ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฃผ๋กœ ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๊ธฐ๋ณธ DOM ์š”์†Œ์— ์ถ”๊ฐ€ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

props์™€ attrs๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ํ”„๋กœํผํ‹ฐ ๋ฐ ๊ธฐํƒ€ ์š”์†Œ์— ๋”ฐ๋ผ ์Šคํƒ€์ผ๊ณผ ์†์„ฑ์„ ๋ชจ๋‘ ๋™์ ์œผ๋กœ ์กฐ์ •ํ•˜์—ฌ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ์˜ ์œ ์—ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

Last updated