书接上篇(《在nuxt3中同时使用PrimeVue和TailwindCSS》),在用Tailwind完成页面布局后,我开始着手用Prime开发操作页面。但问题又接踵而至。不过每天花点时间琢磨琢磨,终于搞明白了,在这记录一下。
01、初始情况
遇到的问题:无法重置prime组件样式的变量值(–p-*)。
主要文件内容:
nuxt.config.ts
:nuxt配置文件
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
| import Aura from '@primeuix/themes/aura';
export default defineNuxtConfig({ css: [ '~/assets/css/tailwind.css', '~/assets/css/main.css', ], modules: [ '@nuxtjs/tailwindcss', '@primevue/nuxt-module', ], primevue: { autoImport: true, options: { ripple: true, theme: { preset: Aura, options: { darkModeSelector: '.p-dark', cssLayer: false } } } } })
|
tailwind.config.ts
:tailwind配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| import type { Config } from 'tailwindcss'
import PrimeUI from "tailwindcss-primeui";
export default { content: [], theme: { extend: {}, },
plugins: [PrimeUI], darkMode: ["class", ".p-dark"] } satisfies Config
|
assets/css/tailwind.css
:自动导入的tailwind样式文件
1 2 3 4 5 6 7 8 9 10
| @layer tailwind-base, primevue, tailwind-utilities;
@layer tailwind-base { @tailwind base; }
@layer tailwind-utilities { @tailwind components; @tailwind utilities; }
|
assets/css/main.css
:自定义布局&重置prime变量样式文件
1 2 3 4 5
| :root { --p-toolbar-background: var(--bg-transparent); }
|
这里为了精简篇幅和方便理解,以设置toolbar的背景色为透明举例。这个时候toolbar的设置是不生效的。
02、第一种方案:强制声明
修改assets/css/main.css
文件,在样式后方追加 !important,强制修改样式。
1 2 3 4 5
| :root { --p-toolbar-background: var(--bg-transparent) !important; }
|
这种方式并不好,一旦后续其他地方要修改,只能使用内联样式、JS修改CSS变量值的方式再去覆盖。如果是多人协作开发,长久以往就会变成屎山项目,谁也搞不清样式设置会在何时生效….(**所以该方案,Pass!**)
03、第二种方案:CSS Layer
@layer
是 CSS 中的一个新特性,用于创建级联层(Cascade Layers)。这将允许开发者将样式规则分组到不同的层中,在浏览器解析样式时会按照特定的顺序和优先级执行。
在assets/css/tailwind.css文件中我们已经见到了@layer
的应用,而Prime在nuxt中也可以通过cssLayer
配置来开启或关闭这一特性。
ok,这次的修改项有两个:
assets/css/tailwind.css
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @import url("./main.css") layer(reset);
@layer tailwind-base, primevue, reset, tailwind-utilities;
@layer tailwind-base { @tailwind base; }
@layer tailwind-utilities { @tailwind components; @tailwind utilities; }
|
nuxt.config.ts
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
| import Aura from '@primeuix/themes/aura';
export default defineNuxtConfig({ css: [ '~/assets/css/tailwind.css', ], modules: [ '@nuxtjs/tailwindcss', '@primevue/nuxt-module', ], primevue: { autoImport: true, options: { ripple: true, theme: { preset: Aura, options: { darkModeSelector: '.p-dark', cssLayer: true } } } } })
|
这个方案相比第一种方案优雅许多,而且最初用的时候也没发现什么问题。但是,不出意外的话,应该要出意外了…
![]()
直到我正式开始编写操作页面,使用了prime的DataTable
组件才发现问题。它组件样式不见了….
组件边框、背景色样式全不见了
再回去翻官方手册,发现官网的配置方式与我不同,参照其调整后也未能解决问题。
官方文档的配置方式
04、第三种方案:自定义Theme
就在我没有头绪,胡乱的往下翻时,我看到了Customization这一节内容。通过definePreset
方法,可以基于某套官方默认Theme下,重置部分样式。
1 2 3 4 5 6 7 8 9 10 11 12 13
| import PrimeVue from 'primevue/config'; import { definePreset } from '@primeuix/themes'; import Aura from '@primeuix/themes/aura';
const MyPreset = definePreset(Aura, { });
app.use(PrimeVue, { theme: { preset: MyPreset } });
|
再往下拉,在Component这一小节,提供了如何自定义组件样式的方法。
自定义card组件样式
那么再看看card组件有哪些可配置的样式变量,可以看到上图的background
和subtitle.color
都能在Card的样式设置中找到。
Card组件的可用变量
那么依样画葫芦,我toolbar的配置应该是这样的:
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
|
const MyPreset = definePreset(Aura, { components: { toolbar: { colorScheme: { light: { root: { background: 'transparent' }, border: { color: '#ff0000' } }, darK: { } } } } });
|
配置完成后重启项目,一切搞定。后续可以把这部分自定义样式配置封装到单独文件中,再在nuxt.config.ts
中引用。
nice,搞定!