usePreferredColorScheme 介绍
📋 这是什么?
usePreferredColorScheme 是一个 VueUse 组合式函数,用于检测用户系统的颜色主题偏好。
🎯 核心功能 ★
检测用户操作系统或浏览器设置的颜色主题:
- 🌙
dark- 深色模式 - ☀️
light- 浅色模式 - 🖥️
no-preference- 无偏好
💡 基本使用 ★
import { usePreferredColorScheme } from '@vueuse/core'
// 使用
const colorScheme = usePreferredColorScheme()
console.log(colorScheme.value) // 'light' 或 'dark'
🔧 实际应用
1. 自动跟随系统主题
<script setup>
import { usePreferredColorScheme } from '@vueuse/core'
import { watch } from 'vue'
// 获取系统主题偏好
const preferredScheme = usePreferredColorScheme()
// 应用到页面
watch(preferredScheme, (newScheme) => {
if (newScheme === 'dark') {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
}, { immediate: true })
</script>
📊 浏览器 API 基础
usePreferredColorScheme 基于浏览器 API:
1. window.matchMedia
// 原生的实现方式
const darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')
const lightModeQuery = window.matchMedia('(prefers-color-scheme: light)')
if (darkModeQuery.matches) {
console.log('用户偏好深色模式')
} else if (lightModeQuery.matches) {
console.log('用户偏好浅色模式')
}
2. VueUse 的封装
// VueUse 内部实现
function usePreferredColorScheme() {
const isDark = useMediaQuery('(prefers-color-scheme: dark)')
const isLight = useMediaQuery('(prefers-color-scheme: light)')
return computed(() => {
if (isDark.value) return 'dark'
if (isLight.value) return 'light'
return 'no-preference'
})
}
🔄 完整主题管理示例
<script setup>
import { usePreferredColorScheme } from '@vueuse/core'
import { useThemeStore } from '@/stores/theme'
// 获取系统偏好
const preferredScheme = usePreferredColorScheme()
const themeStore = useThemeStore()
// 初始化时应用系统主题
onMounted(() => {
if (themeStore.followSystem) {
themeStore.setTheme(preferredScheme.value)
}
})
// 监听系统主题变化
watch(preferredScheme, (newScheme) => {
if (themeStore.followSystem) {
themeStore.setTheme(newScheme)
}
})
</script>
<template>
<div :class="themeStore.currentTheme">
<!-- 页面内容 -->
</div>
</template>
<style>
/* 深色模式样式 */
.dark {
background-color: #1a1a1a;
color: #ffffff;
}
/* 浅色模式样式 */
.light {
background-color: #ffffff;
color: #333333;
}
</style>
📈 响应式特性
自动响应变化
// 当用户在系统中切换主题时
// 会自动更新
const scheme = usePreferredColorScheme()
console.log(scheme.value) // 初始值
// 用户在系统设置中切换主题
// scheme.value 会自动更新
响应式组件
<template>
<div>
<!-- 自动更新显示 -->
<p>系统主题偏好: {{ scheme }}</p>
<!-- 根据主题显示不同图标 -->
<n-icon v-if="scheme === 'dark'" name="moon" />
<n-icon v-if="scheme === 'light'" name="sun" />
</div>
</template>
<script setup>
import { usePreferredColorScheme } from '@vueuse/core'
const scheme = usePreferredColorScheme()
</script>
⚡ 性能优化
1. 防抖处理
import { usePreferredColorScheme, useDebounceFn } from '@vueuse/core'
// 防抖处理,避免频繁更新
const scheme = usePreferredColorScheme()
const debouncedUpdate = useDebounceFn((newScheme) => {
updateTheme(newScheme)
}, 200)
watch(scheme, debouncedUpdate)
2. 条件监听
// 只有需要时才监听
const shouldListen = ref(false)
const scheme = usePreferredColorScheme({ disabled: () => !shouldListen.value })
// 用户开启"跟随系统"时开始监听
const toggleFollowSystem = () => {
shouldListen.value = !shouldListen.value
}
💡 浏览器支持
- ✅ Chrome 76+
- ✅ Firefox 67+
- ✅ Safari 12.1+
- ✅ Edge 79+
- ❌ IE 不支持
📊 使用场景总结
| 场景 | 使用方式 |
|---|---|
| 自动主题切换 | 监听变化并应用对应主题 |
| 主题预览 | 实时显示当前系统主题 |
| 主题建议 | 根据系统主题推荐合适的主题 |
| 无障碍支持 | 尊重用户系统偏好 |
🎓 关键点
- 响应式:自动监听系统主题变化
- 简单:一行代码获取主题偏好
- 实用:提升用户体验
- 标准化:基于 Web 标准
📋 总结
usePreferredColorScheme 是 VueUse 提供的主题检测工具,它能:
- 🔍 检测用户系统主题偏好
- 🔄 自动响应主题变化
- 🎨 帮助实现无障碍设计
- 💡 提升用户体验
