Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 너비우선탐색
- 호이스팅
- 코테
- BFS
- 국비지원
- CS
- nodejs
- html/css/js
- cpu
- 국비지원취업
- 코딩테스트
- 야놀자
- 컴퓨터과학
- 패스트캠퍼스
- Javascript
- CSS
- git
- 자바스크립트
- github
- 부트캠프
- DFS
- 백준
- js
- KAKAO
- 그리디
- 컴퓨터공학
- 알고리즘
- 프론트엔드개발자
- LinkSnap
- computerscience
Archives
- Today
- Total
My Boundary As Much As I Experienced
Next.js14) tailwind에서 동적 스타일링 제대로 구현하기 본문
삼항연산자를 이용한 동적 스타일링
테일윈드에서 동적으로 스타일링 할 때 아래와 같은 방법을 사용한다.
isRed의 값에 따라 bg-red-500이냐 bg-blue-500이냐를 가른다.
interface DynamicProps {
isRed: boolean;
}
export default function DynamicStyledButton({isRed}: DynamicProps) {
return (
<div className="flex items-center justify-center min-h-screen">
<button
onClick={() => setIsRed(!isRed)}
className={`px-4 py-2 text-white font-bold rounded ${isRed ? 'bg-red-500' : 'bg-blue-500'}`}
>
Click me!
</button>
</div>
);
}
class의 일부만 동적으로 관리할 수 없다.
그런데 많은 tailwind 입문자들이 실수하는 것이 아래와 같은 코드이다.
특정 클래스의 특정 부분만 수정하려고 하는 경우이다.
예를 들어 bg- 다음에 'red-500'이나 'blue-500'만 수정하려는 경우이다.
이런 경우 제대로 동작하지 않는다.
Tailwind CSS 클래스 이름을 동적으로 변경하는 방식으로 className 속성을 설정할 수 있지만,
템플릿 리터럴을 사용하는 방식으로는 직접적으로 동적 클래스를 생성할 수 없기 때문이다.
그 이유는 Tailwind CSS가 빌드 시 미리 정의된 클래스들만 포함하기 때문이라고 한다.
interface DynamicProps {
isRed: boolean;
}
export default function DynamicStyledButton({isRed}: DynamicProps) {
return (
<div className="flex items-center justify-center min-h-screen">
<button
onClick={() => setIsRed(!isRed)}
className={`px-4 py-2 text-white font-bold rounded bg-[${isRed ? 'red-500' : 'blue-500'}]`}
>
Click me!
</button>
</div>
);
}
조건이 3개 이상일 때 스위치문 쓰기
그러나 조건들이 너무너무 많다면 어떻게 해야될까?
삼항 연산자는 2가지 조건밖에 처리 못하니.. 여러 개일 때는 대안이 필요하다.
이럴 때는 if-else if문을 쓰거나 switch문을 통과하게 하여 동적으로 조건들을 변경할수도 있다.
interface DynamicProps {
isRed: boolean;
}
// switch문 예시
export default function DynamicStyledButton({isRed}: DynamicProps) {
const getColorClass = () => {
switch (color) {
case 'red':
return 'bg-red-500';
case 'blue':
return 'bg-blue-500';
case 'green':
return 'bg-green-500';
default:
return '';
}
};
return (
<div className={`px-4 py-2 text-white font-bold rounded ${getColorClass()}`}>
Dynamic Styled Component
</div>
);
}
// switch문 예시2
export default function DynamicStyledButton({color}: DynamicProps) {
switch (color) {
case 'red':
return 'bg-red-500';
case 'blue':
return 'bg-blue-500';
case 'green':
return 'bg-green-500';
default:
return '';
}
return (
<div className={`px-4 py-2 text-white font-bold rounded ${color}`}>
Dynamic Styled Component
</div>
);
}
혹은 그냥 인라인 css를 쓰기
width를 변화무쌍하게 바꿔야하는 경우, 스위치문으로도 역부족일 수 있다.
이런 경우를 위해 tailwind를 보완하기 위한 tailwind-merge와 clsx라는게 있다고는 들었는데,
아직 써본 적은 없다. tailwind 숙련도가 늘면 그때 써보도록 하겠다.
하여튼 이럴 때 추가적인 외부 라이브러리를 안 쓸거면 그냥 인라인 css로 조작하면 된다.
import styles from './DynamicWidthComponent.module.css';
export default function DynamicWidthComponent({ width }) {
return (
<div className={styles.container} style={{ width: `${width}%` }}>
Dynamic Width Component
</div>
);
}
'FrontEnd > Next.js' 카테고리의 다른 글
Firebase Hosting을 사용할 때 Next.js프로젝트 빌드 시 Github Action으로 환경변수 주입하는 방법 (0) | 2024.07.25 |
---|---|
Next.js 14 애플 로그인 연동하기 (w. Firebase) (0) | 2024.07.10 |
Next13부터는 getServerSideProps를 굳이 거치지 않더라도 params와 searchParams를 가져올 수 있다. (0) | 2024.06.30 |
App Router에서는 params를 getServerSideProps를 거치지 않고도 페이지 컴포넌트에서 쓸 수 있다. (0) | 2024.06.26 |
Next.js의 pre-rendering이란? (0) | 2024.06.25 |