TailwindCSS 在现代前端框架(React、Vue、Angular)中都有良好的支持,可以无缝集成到各种项目中。
在 React 中使用 TailwindCSS
1. 安装和配置
bash# 安装 TailwindCSS 和相关依赖 npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p
2. 配置文件
javascript// tailwind.config.js module.exports = { content: [ "./src/**/*.{js,jsx,ts,tsx}", ], theme: { extend: {}, }, plugins: [], }
3. 在 React 组件中使用
jsx// 基础使用 function Button({ children, onClick }) { return ( <button onClick={onClick} className="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded" > {children} </button> ); } // 响应式组件 function Card({ title, content }) { return ( <div className="bg-white rounded-lg shadow-md p-6 w-full md:w-1/2 lg:w-1/3"> <h3 className="text-xl font-bold mb-2">{title}</h3> <p className="text-gray-600">{content}</p> </div> ); } // 条件类名 function StatusBadge({ status }) { const statusClasses = { active: 'bg-green-100 text-green-800', inactive: 'bg-gray-100 text-gray-800', error: 'bg-red-100 text-red-800', }; return ( <span className={`px-2 py-1 rounded ${statusClasses[status]}`}> {status} </span> ); }
4. 使用 clsx 或 classnames 库
jsximport clsx from 'clsx'; function Button({ variant, size, children, className, ...props }) { const baseClasses = 'font-bold rounded'; const variantClasses = { primary: 'bg-blue-500 hover:bg-blue-600 text-white', secondary: 'bg-gray-200 hover:bg-gray-300 text-gray-800', danger: 'bg-red-500 hover:bg-red-600 text-white', }; const sizeClasses = { small: 'py-1 px-2 text-sm', medium: 'py-2 px-4', large: 'py-3 px-6 text-lg', }; return ( <button className={clsx( baseClasses, variantClasses[variant], sizeClasses[size], className )} {...props} > {children} </button> ); }
在 Vue 中使用 TailwindCSS
1. 安装和配置
bash# 安装 TailwindCSS npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p
2. 配置文件
javascript// tailwind.config.js module.exports = { content: [ "./index.html", "./src/**/*.{vue,js,ts,jsx,tsx}", ], theme: { extend: {}, }, plugins: [], }
3. 在 Vue 组件中使用
vue<template> <!-- 基础使用 --> <button @click="handleClick" class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded" > 点击按钮 </button> <!-- 动态类名 --> <div :class="['bg-white', isActive ? 'bg-blue-500' : 'bg-gray-200']"> 动态类名 </div> <!-- 对象语法 --> <div :class="{ 'bg-blue-500': isActive, 'bg-gray-200': !isActive, 'text-white': isActive }" > 对象语法 </div> </template> <script> export default { data() { return { isActive: false, }; }, methods: { handleClick() { this.isActive = !this.isActive; }, }, }; </script>
4. 组合式 API
vue<template> <button @click="toggle" :class="buttonClasses" > {{ isActive ? '激活' : '未激活' }} </button> </template> <script setup> import { computed, ref } from 'vue'; const isActive = ref(false); const buttonClasses = computed(() => { return [ 'font-bold py-2 px-4 rounded', isActive.value ? 'bg-blue-500 hover:bg-blue-600 text-white' : 'bg-gray-200 hover:bg-gray-300 text-gray-800' ]; }); function toggle() { isActive.value = !isActive.value; } </script>
在 Angular 中使用 TailwindCSS
1. 安装和配置
bash# 安装 TailwindCSS npm install -D tailwindcss postcss autoprefixer npx tailwindcss init
2. 配置文件
javascript// tailwind.config.js module.exports = { content: [ "./src/**/*.{html,ts}", ], theme: { extend: {}, }, plugins: [], }
3. 在 Angular 组件中使用
typescript// 组件类 import { Component } from '@angular/core'; @Component({ selector: 'app-button', template: ` <button (click)="handleClick()" [ngClass]="buttonClasses" > {{ buttonText }} </button> `, styles: [] }) export class ButtonComponent { isActive = false; get buttonText() { return this.isActive ? '激活' : '未激活'; } get buttonClasses() { return { 'bg-blue-500': this.isActive, 'bg-gray-200': !this.isActive, 'hover:bg-blue-600': this.isActive, 'hover:bg-gray-300': !this.isActive, 'text-white': this.isActive, 'text-gray-800': !this.isActive, 'font-bold': true, 'py-2': true, 'px-4': true, 'rounded': true }; } handleClick() { this.isActive = !this.isActive; } }
在 Svelte 中使用 TailwindCSS
1. 安装和配置
bash# 安装 TailwindCSS npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p
2. 在 Svelte 组件中使用
svelte<script> let isActive = false; function toggle() { isActive = !isActive; } </script> <button on:click={toggle} class:bg-blue-500={isActive} class:bg-gray-200={!isActive} class:text-white={isActive} class:text-gray-800={!isActive} class="font-bold py-2 px-4 rounded" > {isActive ? '激活' : '未激活'} </button>
最佳实践
1. 组件封装
jsx// 创建可复用的组件 const Button = ({ variant, size, children, ...props }) => { const variants = { primary: 'bg-blue-500 hover:bg-blue-600 text-white', secondary: 'bg-gray-200 hover:bg-gray-300 text-gray-800', }; const sizes = { small: 'py-1 px-2 text-sm', medium: 'py-2 px-4', large: 'py-3 px-6 text-lg', }; return ( <button className={`font-bold rounded ${variants[variant]} ${sizes[size]}`} {...props} > {children} </button> ); };
2. 样式提取
jsx// 提取常用样式为常量 const CARD_STYLES = 'bg-white rounded-lg shadow-md p-6'; const BUTTON_STYLES = 'bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded'; function Card({ title, content }) { return ( <div className={CARD_STYLES}> <h3 className="text-xl font-bold mb-2">{title}</h3> <p className="text-gray-600">{content}</p> </div> ); }
3. 响应式设计
jsx// 使用响应式类 function ResponsiveGrid({ children }) { return ( <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> {children} </div> ); }
4. 性能优化
jsx// 使用 useMemo 优化类名计算 import { useMemo } from 'react'; function OptimizedButton({ variant, size, children }) { const className = useMemo(() => { return `font-bold rounded ${variant} ${size}`; }, [variant, size]); return <button className={className}>{children}</button>; }
注意事项
- 类名管理:在大型项目中,考虑使用类名管理工具
- 代码可读性:避免在单个元素上使用过多的类名
- 组件复用:将常用的样式组合封装为组件
- 类型安全:在 TypeScript 中使用类型定义确保类名正确
- 测试:确保在不同框架中样式表现一致