Skip to content

UseTheme

功能描述

UseTheme 是一个用于主题管理的 Vue 组合式函数,提供完整的暗色/亮色模式切换功能,支持系统主题跟随、localStorage 持久化存储和平滑过渡动画等特性。

安装

bash
# 使用 pnpm
pnpm add @oiij/use

# 使用 npm
npm install @oiij/use

# 使用 yarn
yarn add @oiij/use

依赖

  • vue: ^3.0.0
  • @vueuse/core: ^10.0.0

基本使用

loading

API

useTheme(options?)

主题管理,支持暗黑模式切换和平滑过渡动画。

参数

参数类型说明
optionsUseThemeOptions配置选项

UseThemeOptions

选项类型默认值说明
storageKeystring'__COLOR_MODE_PERSIST__'存储在 localStorage 中的键名
viewTransitionOptionsViewTransitionOptions-视图过渡动画配置选项
useDarkOptionsUseDarkOptions-暗色模式选项
usePreferredDarkOptionsConfigurableWindow-系统主题跟随选项
useColorModeOptionsUseColorModeOptions-颜色模式选项

返回值

属性类型说明
isDarkRef<boolean>当前是否为暗色模式
preferredDarkRef<boolean>系统偏好是否为暗色模式
colorModeRef<string>当前颜色模式
systemColorModeRef<string>系统颜色模式
setColorMode(mode, event?)Function设置颜色模式
setDark(event?)Function切换到暗色模式
setLight(event?)Function切换到亮色模式
toggleDark(event?)Function切换暗色/亮色模式

类型定义

ts
export type UseThemeOptions = {
  /**
   * 存储在 localStorage 中的键名
   * @default '__COLOR_MODE_PERSIST__'
   */
  storageKey?: string
  /**
   * 视图过渡动画配置选项
   */
  viewTransitionOptions?: ViewTransitionOptions
  /**
   * 暗色模式选项
   */
  useDarkOptions?: UseDarkOptions
  /**
   * 系统主题跟随选项
   */
  usePreferredDarkOptions?: ConfigurableWindow
  /**
   * 颜色模式选项
   */
  useColorModeOptions?: UseColorModeOptions
}

export type UseThemeReturns = {
  isDark: Ref<boolean>
  preferredDark: Ref<boolean>
  colorMode: Ref<string>
  systemColorMode: Ref<string>
  setColorMode: (mode: 'dark' | 'light' | 'auto', event?: MouseEvent) => void
  setDark: (event?: MouseEvent) => void
  setLight: (event?: MouseEvent) => void
  toggleDark: (event?: MouseEvent) => void
}

export declare function useTheme(options?: UseThemeOptions): UseThemeReturns

使用示例

基础用法

vue
<script setup>
import { useTheme } from '@oiij/use'

const { isDark, toggleDark, setDark, setLight } = useTheme()
</script>

<template>
  <button @click="toggleDark">
    切换主题
  </button>
  <p>当前模式: {{ isDark ? '暗色' : '亮色' }}</p>
</template>

自定义配置

ts
import { useTheme } from '@oiij/use'

const { isDark, toggleDark } = useTheme({
  storageKey: 'my-app-theme',
  viewTransitionOptions: {
    duration: 800,
    easing: 'ease-out'
  }
})

使用事件定位过渡动画中心

vue
<script setup>
import { useTheme } from '@oiij/use'

const { toggleDark } = useTheme()
</script>

<template>
  <button @click="(e) => toggleDark(e)">
    切换主题(带动画)
  </button>
</template>

在模板中使用

vue
<script setup lang="ts">
import { useTheme } from '@oiij/use'

const { isDark, toggleDark, setDark, setLight } = useTheme()
</script>

<template>
  <button @click="toggleDark">
    切换主题
  </button>
  <button @click="(e) => setDark(e)">
    切换到暗色模式
  </button>
  <button @click="(e) => setLight(e)">
    切换到亮色模式
  </button>
  <div :class="{ dark: isDark }">
    内容区域
  </div>
</template>