๐ pseudo selector๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ styled-component ์ฌ์ฉํ์ง ์๊ธฐ
css ์คํ์ผ๋ง์ ํ๋ค ๋ณด๋ฉด ์ ์ผ ๋ง์ง๋ง ๊ธ์๋ง ๋ค๋ฅธ ์์์ผ๋ก ๋ํ๋ด์ผ ํ๋๋ฐ, ๋ฒ๊ฑฐ๋กญ๊ฒ styled-component
๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ทธ๋ด ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ฐ์ ์ ํ์๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ค์ด๊ณ , ์ง๊ด์ ์ผ๋ก ์คํ์ผ์ ๊พธ๋ฐ ์ ์๋ค. ์๋ฅผ ๋ค์๋ฉด, FormTitle
์ ๋ง๋๋๋ฐ ํ์๋ก ์
๋ ฅ ํด์ผํ๋ *
๋ฅผ FormTitle
์ ์ผ ๋ง์ง๋ง์ ๋ถ์ฌ์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ฒ์์๋ FormTitle
๊ณผ Required
์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ ํ๋จ ์ฝ๋ ๋ธ๋ก์ฒ๋ผ ๊ด๋ฆฌํ๋ค. ์ฝ๋ ๋ธ๋ก์ ๋ํด ๊ฐ๋จํ๊ฒ ์ค๋ช
ํ์๋ฉด FormTitle
์ props
์๋ required
๊ฐ ๋ค์ด์ค๊ณ (์ด๋ required
์ ํ์
์ boolean
์ด๋ค.), required
๊ฐ true
์ด๋ฉด ๋ด๋ถ span
ํ๊ทธ์ color
๋ red
๋ก ์ค์ ํ๊ณ required
๊ฐ false
์ด๋ฉด color
๋ฅผ ์ค์ ํ์ง ์๋ ์ฝ๋์ด๋ค.
// form.tsx
interface FormTitleProps {
required: boolean
}
const FormTitle = styled.div<FormTitleProps>`
${({ required }) =>
required &&
css`
span {
color: red;
}
`}
`
function App() {
return (
<FormTitle required>
์ด๋ฉ์ผ ์ฃผ์ <Required />
</FormTitle>
)
}
// required.tsx
export function Required() {
return <span>*</span>
}
์ด๋ ๊ฒ ์์ฑํ๋ค๋ณด๋ ๋ถํ์ํ๊ฒ ์๋ก required.tsx
ํ์ผ์ ๋ง๋ค์ด ๊ด๋ฆฌํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์๊ณผ ์ฝ๋๊ฐ ํ ๋ฒ์ ์ฝํ์ง ์๋๋ค๋ ๋ฌธ์ ๊ฐ ์์๋ค. ์ด๋ด ๋ pseudo selector
์ค ํ๋์ธ ::after
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค. ::after
๋ HTML
์ฝ๋ ๋ค์ content
property๋ก ๋ด์ฉ์ ์ฝ์
ํ ์ ์๋ค. ์ด์ ๋น์ทํ ๊ฐ์ ์ ํ์๋ก๋ ::before
๊ฐ ์๋๋ฐ, ์ด๋ HTML
์ฝ๋ ์์ content
property๋ก ๋ด์ฉ์ ์ฝ์
ํ ์ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ::after
๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ฒ๋ผ ๋ฆฌํฉํ ๋ง์ ์งํํ๋ค.
// form.tsx
interface FormTitleProps {
required: boolean
}
const FormTitle = styled.div<FormTitleProps>`
${({ required }) =>
required &&
css`
::after {
content: " *";
}
`}
`
function App() {
return (
<FormTitle required>
์ด๋ฉ์ผ ์ฃผ์
</FormTitle>
)
}
์ด๋ฒ ๊ธ์ ํตํด ์คํ์ผ์ ํ๋ ์ง์ ํ๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด ์คํ์ผ ์ปดํฌ๋ํธ๋ก ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ๋ณด๋ค ๊ฐ์ ์ ํ์์ ๊ฐ์ css ๊ธฐ๋ณธ ์์ฑ์ ์ด์ฉํ๋ฉด ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค๋ ์ ์ ๋ฐฐ์ ๋ค.
Reference
๋๊ธ