Nuxt3+ElementPlus暗黑模式闪烁问题

用useDark就会闪烁,还会有各种错误提示。有效解决方案:

本人风格,直接上核心代码。

composables/theme.ts

export const useTheme = () => {
    const theme = useState<string>('theme', () => 'light')
    const cookie = useCookie('theme')
  
    // 服务端同步 cookie 到 state
    if (import.meta.server && cookie.value) {
      theme.value = cookie.value
    }
  
    // 客户端处理类名和持久化
    onMounted(() => {
      if (import.meta.client) {
        watchEffect(() => {
          cookie.value = theme.value
          document.documentElement.classList.toggle('dark', theme.value === 'dark')
        })
        
        // 初始同步一次类名
        document.documentElement.classList.toggle('dark', theme.value === 'dark')
      }
    })
  
    const toggleTheme = () => {
      theme.value = theme.value === 'dark' ? 'light' : 'dark'
    }
  
    return { theme, toggleTheme }
  }

app.vue

import { useTheme } from "../composables/theme";
const { theme } = useTheme();
useHead({
  htmlAttrs: {
    class: computed(() => theme.value),
  },
});

DarkModeSwitch.vue

<template>
  <el-switch v-model="isDark" class="dark-mode-switch"></el-switch>
</template>

<script setup>
import { useTheme } from "../composables/theme";

const { theme, toggleTheme } = useTheme();
const isDark = computed({
  get: () => theme.value === "dark",
  set: () => toggleTheme(),
});
</script>

<style lang="scss" scoped>
// 样式略
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值