Files
youlai-app/docs/theme-system-guide.md
2025-05-29 08:28:46 +08:00

312 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 主题系统使用指南
## 概述
本项目基于 Wot Design Uni 的 ConfigProvider 组件实现了完整的主题系统,支持:
- 🌙 暗黑/浅色模式切换
- 🎨 12种预设主题色
- 🎯 自定义主题色
- 💾 主题设置持久化存储
- 📱 多平台兼容H5、小程序
## 核心文件
### 1. useTheme Composable (`src/composables/useTheme.ts`)
主题管理的核心逻辑,提供:
```typescript
const {
theme, // 当前主题模式 'light' | 'dark'
themeVars, // ConfigProviderThemeVars 主题变量
toggleTheme, // 切换主题模式
setThemeColor, // 设置主题色
resetTheme, // 重置主题
initTheme, // 初始化主题
colorColumns, // 预设主题色列表
} = useTheme();
```
### 2. 布局文件
#### Tabbar 布局 (`src/layouts/tabbar.vue`)
```vue
<template>
<wd-config-provider
:theme="theme"
:theme-vars="themeVars"
custom-style="min-height: 100vh"
:class="{ 'wot-theme-dark': theme === 'dark' }"
>
<!-- 页面内容 -->
</wd-config-provider>
</template>
```
#### Default 布局 (`src/layouts/default.vue`)
```vue
<template>
<wd-config-provider
:theme="theme"
:theme-vars="themeVars"
custom-style="background-color: #f5f5f5;min-height: 100vh"
:class="{ 'wot-theme-dark': theme === 'dark' }"
>
<!-- 页面内容 -->
</wd-config-provider>
</template>
```
### 3. 主题设置页面 (`src/pages/mine/settings/theme/index.vue`)
提供用户界面来:
- 切换暗黑/浅色模式
- 选择预设主题色
- 输入自定义主题色
- 预览主题效果
- 重置主题设置
## 主题变量
### 支持的 ConfigProviderThemeVars
根据 Wot Design Uni 文档,主要使用:
```typescript
interface ConfigProviderThemeVars {
colorTheme?: string; // 主题色
buttonPrimaryBgColor?: string; // 主按钮背景色
buttonPrimaryColor?: string; // 主按钮文字色
// ... 更多变量
}
```
### 预设主题色
```typescript
const colorColumns = [
{ value: "#165DFF", label: "蓝色" },
{ value: "#0FC6C2", label: "青绿色" },
{ value: "#722ED1", label: "紫色" },
{ value: "#F5222D", label: "红色" },
{ value: "#FA8C16", label: "橙色" },
{ value: "#FADB14", label: "黄色" },
{ value: "#52C41A", label: "绿色" },
{ value: "#EB2F96", label: "粉色" },
{ value: "#13C2C2", label: "青色" },
{ value: "#1890FF", label: "天蓝色" },
{ value: "#CD5C5C", label: "经典红" },
{ value: "#228B22", label: "自然绿" },
];
```
## 暗黑模式实现
### 1. ConfigProvider 主题切换
```vue
<wd-config-provider :theme="theme">
<!-- theme 'dark' 时自动应用暗黑模式 -->
</wd-config-provider>
```
### 2. 全局样式适配
`src/uni.scss` 中定义:
```scss
.wot-theme-dark {
background-color: #1a1a1a !important;
color: #f5f5f5 !important;
/* H5 环境 body 样式 */
body {
background-color: #1a1a1a !important;
color: #f5f5f5 !important;
}
/* 其他组件暗黑模式适配 */
}
```
### 3. 动态 Body 样式
`useTheme` 中自动处理:
```typescript
const applyDarkModeBodyStyle = (isDark: boolean) => {
// #ifdef H5
if (typeof document !== "undefined") {
const body = document.body;
if (isDark) {
body.style.backgroundColor = "#1a1a1a";
body.style.color = "#f5f5f5";
body.classList.add("wot-theme-dark");
} else {
body.style.backgroundColor = "#f8f8f8";
body.style.color = "#333";
body.classList.remove("wot-theme-dark");
}
}
// #endif
};
```
## 持久化存储
主题设置自动保存到本地存储:
```typescript
// 存储键名
const THEME_STORAGE_KEY = "app_theme_mode";
const THEME_COLOR_STORAGE_KEY = "app_theme_color";
// 自动监听变化并保存
watch(
theme,
(newTheme) => {
saveThemeToStorage(newTheme);
applyDarkModeBodyStyle(newTheme === "dark");
},
{ immediate: true }
);
```
## 使用示例
### 在页面中使用主题
```vue
<template>
<view>
<wd-button type="primary">主题色按钮</wd-button>
<text :style="{ color: themeVars.colorTheme }">主题色文本</text>
</view>
</template>
<script setup>
import { useTheme } from "@/composables/useTheme";
const { theme, themeVars, toggleTheme, setThemeColor } = useTheme();
// 切换主题模式
const handleToggleTheme = () => {
toggleTheme();
};
// 设置主题色
const handleSetColor = (color: string) => {
setThemeColor(color);
};
</script>
```
### 在组件中响应主题变化
```vue
<template>
<view :class="{ 'dark-mode': isDark }">
<!-- 组件内容 -->
</view>
</template>
<script setup>
import { computed } from "vue";
import { useTheme } from "@/composables/useTheme";
const { theme } = useTheme();
const isDark = computed(() => theme.value === "dark");
</script>
<style>
.dark-mode {
background-color: #2a2a2a;
color: #f5f5f5;
}
</style>
```
## 最佳实践
### 1. 组件开发
- 使用 Wot Design Uni 组件时,主题色会自动应用
- 自定义组件需要手动适配暗黑模式
- 使用 `:class="{ 'wot-theme-dark': theme === 'dark' }"` 来应用暗黑模式样式
### 2. 样式编写
```scss
.my-component {
background-color: #fff;
color: #333;
// 暗黑模式适配
.wot-theme-dark & {
background-color: #2a2a2a;
color: #f5f5f5;
}
}
```
### 3. 主题色使用
```vue
<template>
<!-- 直接使用主题色 -->
<view :style="{ borderColor: themeVars.colorTheme }">
<!-- 内容 -->
</view>
</template>
```
## 注意事项
1. **ConfigProvider 包裹**:确保页面被 ConfigProvider 包裹才能应用主题
2. **样式优先级**:暗黑模式样式需要足够的优先级,必要时使用 `!important`
3. **平台兼容**:小程序和 H5 的样式处理略有不同,使用条件编译处理
4. **性能考虑**:主题切换时避免频繁的 DOM 操作
## 扩展功能
### 添加新的主题色
`colorColumns` 中添加新的颜色:
```typescript
export const colorColumns = [
// ... 现有颜色
{ value: "#FF6B6B", label: "珊瑚红" },
{ value: "#4ECDC4", label: "薄荷绿" },
];
```
### 添加更多主题变量
```typescript
const themeVars = ref<ConfigProviderThemeVars>({
colorTheme: getStoredThemeColor(),
buttonPrimaryBgColor: getStoredThemeColor(),
// 添加更多变量
});
```
### 自定义暗黑模式样式
`uni.scss` 中添加更多组件的暗黑模式适配:
```scss
.wot-theme-dark {
// 新组件的暗黑模式样式
.my-custom-component {
background-color: #2a2a2a;
color: #f5f5f5;
}
}
```