本文档介绍如何在项目中使用暗色主题功能。
我们的应用支持白天/黑夜两种主题模式,用户可以根据自己的偏好切换。主题的状态保存在Vuex中,并且会持久化保存在本地存储中,以便下次打开应用时恢复用户的偏好设置。
我们提供了一个方便的混入器,可以轻松地在任何组件中使用主题相关的功能:
// 1. 导入主题混入器
import themeMixin from '@/mixins/themeMode.js'
export default {
// 2. 在组件中注册混入器
mixins: [themeMixin],
methods: {
someMethod() {
// 3. 直接使用混入器提供的属性和方法
console.log(this.isDarkMode) // 是否为暗色模式
console.log(this.currentTheme) // 当前主题模式:'light'或'dark'
// 切换主题
this.toggleThemeMode()
// 设置为特定主题
this.setThemeMode('dark') // 或 'light'
}
}
}
我们在uni.scss
中定义了一系列暗色主题相关的变量,您可以在组件的样式中使用这些变量:
/* 示例组件的样式 */
.my-component {
background-color: #fff;
color: #333;
/* 添加主题过渡效果 */
@extend .theme-transition;
/* 定义暗色主题下的样式 */
.dark-mode & {
background-color: $dark-bg-color;
color: $dark-text-color-primary;
}
}
我们还提供了两个便捷的组件:
ThemeProvider是一个包装组件,它会自动传递当前的主题模式,并提供暗色主题的根容器:
<template>
<ThemeProvider>
<!-- 您的组件内容 -->
<view class="my-content">
这里的内容会自动响应主题变化
</view>
</ThemeProvider>
</template>
<script>
import ThemeProvider from '@/components/theme/ThemeProvider.vue'
export default {
components: {
ThemeProvider
}
}
</script>
DarkModeStyles是一个提供通用暗色主题样式的无渲染组件,可以导入到您的页面中使用:
<template>
<view>
<!-- 这里不会渲染任何内容,但会应用样式 -->
<DarkModeStyles />
<!-- 您的组件内容 -->
<view class="card">
<view class="card-title">标题</view>
<view class="card-content">内容</view>
</view>
</view>
</template>
<script>
import DarkModeStyles from '@/components/theme/DarkModeStyles.vue'
export default {
components: {
DarkModeStyles
}
}
</script>
以下是在uni.scss
中定义的暗色主题相关变量,您可以在组件样式中使用:
/* 背景色 */
$dark-bg-color: #1a1a1a; // 主背景色
$dark-bg-color-secondary: #222; // 次要背景色
$dark-bg-color-tertiary: #333; // 第三级背景色
/* 文本颜色 */
$dark-text-color-primary: #eee; // 主要文本颜色
$dark-text-color-secondary: #bbb; // 次要文本颜色
$dark-text-color-tertiary: #999; // 第三级文本颜色
/* 边框和阴影 */
$dark-border-color: #444; // 边框颜色
$dark-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.2); // 阴影
/* 强调色 */
$dark-accent-color: #4a90e2; // 强调色
/* 过渡动画时间 */
$theme-transition-duration: 0.3s; // 主题切换过渡时间
theme-transition
类,以确保主题切换时有平滑的过渡效果$my-component-bg: $dark-bg-color;
$my-component-text: $dark-text-color-primary;