书接上篇(《在nuxt3中同时使用PrimeVue和TailwindCSS》),在用Tailwind完成页面布局后,我开始着手用Prime开发操作页面。但问题又接踵而至。不过每天花点时间琢磨琢磨,终于搞明白了,在这记录一下。
01、初始情况
遇到的问题:无法重置prime组件样式的变量值(–p-*)。
主要文件内容:
- nuxt.config.ts:nuxt配置文件
| 12
 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配置文件
| 12
 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样式文件
| 12
 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变量样式文件
| 12
 3
 4
 5
 
 | :root {--p-toolbar-background: var(--bg-transparent);
 }
 
 
 
 | 
这里为了精简篇幅和方便理解,以设置toolbar的背景色为透明举例。这个时候toolbar的设置是不生效的。
02、第一种方案:强制声明
修改assets/css/main.css文件,在样式后方追加 !important,强制修改样式。
| 12
 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
| 12
 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
| 12
 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下,重置部分样式。
| 12
 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组件样式
自定义card组件样式
那么再看看card组件有哪些可配置的样式变量,可以看到上图的background和subtitle.color都能在Card的样式设置中找到。
![Card组件的可用变量]() Card组件的可用变量
Card组件的可用变量
那么依样画葫芦,我toolbar的配置应该是这样的:
| 12
 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,搞定!]() nice,搞定!
nice,搞定!