Loading...
Loading...
Compare original and translation side by side
Don't fight the framework. Use it as it was designed to be used.
不要对抗框架。按照它的设计初衷来使用它。
package.jsonreactvueangularsveltenextnuxtastrosolid-jstailwind.config.*@tailwindmain.tsvuetify.tscreateTheme()tailwind.config.*@themepackage.jsonreactvueangularsveltenextnuxtastrosolid-jstailwind.config.*@tailwindmain.tsvuetify.tscreateTheme()tailwind.config.*@themeseverity="success"size="small"!importantseverity="success"size="small"!importantptunstyledusePassThrough()pt.p-button-label.p-datatable-headermain.tsapp.use(PrimeVue, {
theme: {
preset: Aura,
options: {
prefix: 'p',
darkModeSelector: '.dark-mode',
cssLayer: { name: 'primevue', order: 'tailwind-base, primevue, tailwind-utilities' }
}
}
})import { definePreset } from '@primevue/themes'
import Aura from '@primevue/themes/aura'
const MyPreset = definePreset(Aura, {
semantic: {
primary: {
50: '{indigo.50}',
// ...
950: '{indigo.950}'
}
}
})severitysizeoutlinedroundedraisedtextptptptunstyledusePassThrough()pt.p-button-label.p-datatable-headermain.tsapp.use(PrimeVue, {
theme: {
preset: Aura,
options: {
prefix: 'p',
darkModeSelector: '.dark-mode',
cssLayer: { name: 'primevue', order: 'tailwind-base, primevue, tailwind-utilities' }
}
}
})import { definePreset } from '@primevue/themes'
import Aura from '@primevue/themes/aura'
const MyPreset = definePreset(Aura, {
semantic: {
primary: {
50: '{indigo.50}',
// ...
950: '{indigo.950}'
}
}
})severitysizeoutlinedroundedraisedtextptptsm:md:lg:xl:text-primary-500text-[#3b82f6]bg-${color}-500prettier-plugin-tailwindcss@applytext-[14px]text-smsm:md:lg:xl:text-primary-500text-[#3b82f6]bg-${color}-500prettier-plugin-tailwindcss@applytext-smtext-[14px]@applydark:hover:focus:active:disabled:focus:ring-2focus:outline-nonetailwind.config@applydark:hover:focus:active:disabled:focus:ring-2focus:outline-nonetailwind.configvue-best-practicesreact-best-practicescreate-design-system-rulesvue-best-practicesreact-best-practicescreate-design-system-rules| Anti-pattern | Why it's wrong | What to do instead |
|---|---|---|
| Fights the framework's theming system | Use design tokens and |
| Re-implements PrimeVue from scratch | Use a theme preset |
| Wrapper components with style overrides | Unnecessary abstraction, breaks on updates | Use components directly with props |
| Specificity wars, unmaintainable | Fix the root cause through theme config |
| Tailwind classes on library components | Two systems fighting for control | Let the library own its components |
| Custom CSS for things Tailwind does | Mixed methodologies | Use Tailwind utilities |
| Defeats utility-first purpose | Extract Vue components instead |
Arbitrary values ( | Bypasses design token system | Use scale values ( |
Class concatenation ( | Breaks Tailwind compiler purging | Use lookup objects |
| Targeting internal library classes | Breaks on library updates | Use library's theming API |
| 反模式 | 错误原因 | 替代方案 |
|---|---|---|
PrimeVue组件上使用 | 与框架的主题系统冲突 | 使用设计令牌和 |
| 相当于从零重新实现PrimeVue | 使用官方主题预设 |
| 带样式覆盖的wrapper组件 | 不必要的抽象,组件更新时容易失效 | 直接使用组件并传递props |
| 会导致优先级冲突,难以维护 | 通过主题配置从根源解决问题 |
| 给组件库组件添加Tailwind类 | 两个样式系统会产生冲突 | 让组件库自己控制组件样式 |
| 为Tailwind已经支持的功能写自定义CSS | 混用方法论会提升维护成本 | 使用Tailwind工具类 |
到处使用 | 违背了工具优先的设计初衷 | 提取为Vue组件 |
使用任意值( | 绕开了设计令牌系统 | 使用刻度值( |
拼接类名( | 破坏Tailwind编译器的Tree Shaking功能 | 使用查找对象 |
| Target组件库内部类 | 组件库更新时容易失效 | 使用组件库的主题API |