728x90
반응형
🤦♂️ 문제상황
tailwind 사용중, class를 변수로 넣었는데 class는 정상적으로 render되었지만, css가 적용되지 않았다.
<aside
className={`${
isUser ? `top-[${paddingTop + headerHeight}px]` : `top-[${paddingTop}px]`
} sticky col-span-2 h-fit w-[180px]`}
>
</aside>
isUser 에 따라 top값이 다르게 계산되어 출력되길 원함
✅ 해결
기본적으로 Tailwind는 화면에서 사용한다고 인식되는 class의 css를 랜더한다. 이것이 tailwind의 tree-shaking기능이다. (관련링크)
즉, Tailwind는 top-[117px]을 인식하지 못했다는 의미
다이나믹 class를 Tailwind가 올바르게 인식하게 하기 위해선 몇가지 규칙을 지켜야 한다. (관련 링크)
1. class명을 온전히 리턴값으로 가져야 한다.
❌ 문자열 연결을 통해 클래스를 만들지 않는다.
<div className={`mt-[${size === 'lg' ? '22px' : '17px' }]`}></div>
✅ 완전한 클래스 이름을 동적으로 만든다.
<div className={ size === 'lg' ? 'mt-[22px]' : 'mt-[17px]' }></div>
2. 임의 값은 동적 값에서 계산할 수 없다.
❌ 임의의 값을 동적으로 추가하지 않는다.
<div class="bg-[{{ userThemeColor }}]"></div>
✅ 이러한 경우 stlye(인라인 스타일)을 이용한다.
<div style="background-color: {{ userThemeColor }}"></div>
내가 겪었던 상황은 2번이었고, 아래와 같이 해결했다.
...
const quickBarTopStyle = useMemo(() => {
const paddingTop = STYLE_ENUM.REPORT_DETAIL_BODY_PADDING_TOP;
const headerHeight = STYLE_ENUM.REPORT_DETAIL_HEADER_HEIGHT;
return isUser ? { top: paddingTop + headerHeight } : { top: paddingTop };
}, [isUser]);
return (
<aside style={quickBarTopStyle} className={`sticky col-span-2 h-fit w-[180px]`}>
...
style인라인에 동적 값을 넣었다.
객체는 화면 랜더시 다르다고 인식하기에 useMemo에 담았다.
이렇게 하니까 잘된다! 해결-!
728x90
반응형