๊ฐ๋จํ ์๊ฐํ์๋ฉด, ์คํ์ผ ์ถฉ๋ ์์ด JS์์ Tailwind CSS ํด๋์ค๋ค์ ๋ณํฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ ํธ ํจ์์ด๋ค.
Tailwind CSS๋ฅผ React๋ Vue ๊ฐ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ๋ ์๋์ ๊ฐ์ด ํ๋์ ํน์ ์ผ์ด์ค์์๋ง ์ปดํฌ๋ํธ์ ๋ช๋ช ์คํ์ผ์ ๋ฐ๊พธ๊ณ ์ถ์ ์ํฉ์ ๋ง์ฃผ์น ๊ฒฝํ์ด ๋ง๋ค.
function CommonInput(props) {
const className = `border rounded px-2 py-1 ${props.className || ''}`
return <input {...props} className={className} />
}
function ExceptionalInput(props) {
return (
<MyGenericInput
{...props}
className="p-3" // โ Only want to change some padding
/>
)
}
border rounded px-2 py-1 p-3
์ด๋ผ๋ className์ ๊ฐ๋ input์ด ์์ฑ๋๋ค.๐ค ๊ทธ๋์ tailwind-merge๊ฐ ๋ฑ์ฅํ์ต๋๋ค!
function MyGenericInput(props) {
// ์ด์ `props.className`๊ฐ ์ถฉ๋ํ๋ ํด๋์ค ๋ช
์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
const className = twMerge('border rounded px-2 py-1', props.className)
return <input {...props} className={className} />
}
border rounded p-3
์ด๋ผ๋ ํด๋์ค์ ํจ๊ป ๋ ๋๋ง๋ ๊ฒ์ด๋ค.function twMerge(
...classLists: Array<string | undefined | null | false | 0 | typeof classLists>
): string
๊ธฐ๋ณธ Tailwind config๋ฅผ ์ฌ์ฉํ๊ณ ์๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ๊ณผ ๊ทผ์ฌํ config ํ์ผ์ ์ฌ์ฉํ๊ณ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ ํจ์์ด๋ค.
twMerge๊ฐ ์ ์ฉ๋์ง ์๋๋ค๋ฉด extendTailwindMerge๋ฅผ ์ฌ์ฉํ์ฌ ์ปค์คํ ํจ์๋ฅผ ์์ฑํ ์ ์๋ค.
function twJoin(
...classLists: Array<string | undefined | null | false | 0 | typeof classLists>
): string
์ถฉ๋์ ํด๊ฒฐํ์ง ์๊ณ ์กฐ๊ฑด์ ์ผ๋ก ํด๋์ค๋ช
๋ฌธ์์ด์ ํฉ์ฑํด์ฃผ๋ ํจ์์ด๋ค.
twJoin ์ฌ์ฉ ์ ์กฐ๊ธ ๋ ๋น ๋ฅด๋ฉฐ ๋ฒ๋ค ์ฌ์ด์ฆ๋ฅผ ์ค์ผ ์ ์๋ค.
์๋์ ๊ฐ์ด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
twJoin(
'border border-red-500',
hasBackground && 'bg-red-100',
hasLargeText && 'text-lg',
hasLargeSpacing && ['p-2', hasLargeText ? 'leading-8' : 'leading-7'],
)
๋ค์ํ ์ธต์์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ธฐ ์ฝ๋ค.
tailwind-merge๋ ๋์์ธ ์์คํ ์ด๋ UI ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ HOC์ ์ ํฉํ๋ค.
๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ๋ฐ๋ณต ์๋๋ฅผ ๊ฐ๋ฅ์ผ ํ๋ค.
tailwind-merge๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ๋ด์์ ๊ฐ๊ฐ์ ๋ช
์์ ์ผ๋ก ์ ์ํ์ง ์๊ณ ๋ ๋ค์ํ ๋ฒ์์ ์คํ์ผ๋ง์ ์ง์ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๋ฒํผ ์ปดํฌ๋ํธ์ ๋๋น, ๊ธ์ ์์์ด๋ ์์น๋ฅผ ๋ช
์์ ์ผ๋ก ์ ์ํ์ง ์๋๋ผ๋ ํ๋์ className
์ prop์ผ๋ก ์ปค์คํ
ํ width์ ๊ธ์ ์์, ์์น๋ฅผ ๋ณ๊ฒฝ์ํฌ ์ ์๋ค.
์ฑ๊ธํ ์ถ์ํ๋ฅผ ๋ฐฉ์งํ๋ค.
error
๋ฅผ ๋ํ๋ด๋๋ก ์คํ์ผ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ฒํผ ์ปดํฌ๋ํธ์ ํน์ ์์ฑ๋ง ์ ๋ฌํ์ฌ ๊ตฌํํ ์ ์๋ค.๋ฒ๋ค ์ฌ์ด์ฆ๊ฐ ์ฆ๊ฐํ๋ค.
tailwind-merge์ ๊ฒฝ์ฐ ์ด๋ค ํด๋์ค๋ค์ด ์ถฉ๋ํ๋์ง๋ฅผ ํ์
ํ๊ธฐ ์ํด ๋ฐฉ๋ํ ํฌ๊ธฐ์ config์ ์์กดํ๋ค.
ํ์ดํธํ ๋ฒ๋ค ์ฌ์ด์ฆ ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ์ง ๊ฒฝ์ฐ ์ ํ์ด ๋ ์ ์๋ค.
์ปดํฌ๋ํธ ์ฌ์ฉ์์๊ฒ ๋๋ฌด ๋ง์ ์์จ์ฑ์ ๋ถ์ฌํ ์ ์๋ค.
๋๊ท๋ชจ ํ์ด๋ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ง ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์ปดํฌ๋ํธ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ๊ฐ ํ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ปดํฌ๋ํธ์ API๋ฅผ ์ฌ์ฉํ ์๋, ์ฌ์ฉํ์ง ์์์๋ ์๋ค. ์ด๋ฌํ ์ํฉ์์ tailwind-merge๋ ์ปดํฌ๋ํธ ์ฌ์ฉ์์๊ฒ ๋๋ฌด ๋ง์ ์์ ๋ฅผ ๋ถ์ฌํ์ฌ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ณ ๋ฐ์ ์ํค๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง ์ ์๋ค. tailwind-merge๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ปดํฌ๋ํธ ์คํ์ผ๋ง์ ์์ ํ ํต์ ๋ ํฌ๊ธฐํด์ผ ํ ๊ฒ์ด๋ค.
์ฌ์ฌ์ฉ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ปดํฌ๋ํธ ๋ฆฌํฉํ ๋ง์ด ์ด๋ ค์ธ ์ ์๋ค.
์ปดํฌ๋ํธ์ ์์์ ํด๋์ค๋ฅผ ์ ๋ฌํ ์ ์๋๋ก ํ์ฉํ๋ฉด ์ปดํฌ๋ํธ์ ๋ด๋ถ ์คํ์ผ์ ๋ฆฌํฉํฐ๋งํ ๋ ์ปดํฌ๋ํธ ์ฌ์ฉ์์ ์คํ์ผ์ด ์์๋ ์ ์๋ค. ๋ง์ฝ ๋น์ ์ด ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์์ฃผ ๋ฆฌํฉํ ๋งํ ์ ์์ด์ผ ํ๋ค๋ฉด ์ด๋ฌํ ์คํ์ผ์ ์ปดํฌ๋ํธ์ ์ฉ๋ ๋ํ ๋ฆฌํฉํ ๋งํ ์์ ์ด ์๋ ํ props๋ก ์ ๋ฌ๋๋ ์คํ์ผ๊ณผ ๋ณํฉ๋์ง ๋ง์์ผ ํ๋ค.
Tailwind CSS๋ ์ปดํฌ๋ํธ ํฉ์ฑ์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ๋ฌด์ฉํ๋ค.
tailwind-merge๋ TailwindCSS๊ณผ ์ปดํฌ๋ํธ ํฉ์ฑ์ ํน์ ํ ํํ์์ ํจ๊ผ ์ฌ์ฉํ ๋์๋ง ์ ์ฉํ๋ค.