You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS+Tailwind项目中React Iconify图标主题色适配问题排查

问题原因

你的checkTheme函数返回的是MediaQueryList对象,而非布尔值。在JavaScript中,对象属于“真值”,所以无论系统主题是什么,checkTheme()都会被判定为true,导致图标颜色始终为白色。


解决方案

方案一:修复基础判断逻辑

修改函数,通过matches属性获取系统主题的布尔匹配结果:

function checkTheme() {
  return typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches;
}

注意:该方案仅依赖系统主题偏好,若你通过手动添加/移除dark类切换主题(符合Tailwind darkMode: "class"配置),此函数无法同步页面实际主题状态。

方案二:适配Tailwind的class模式

因为你配置了darkMode: "class",页面主题由根元素的dark类控制,直接检测该类是否存在更准确:

function checkTheme() {
  if (typeof window === "undefined") return false; // 服务端渲染时默认返回浅色
  return document.documentElement.classList.contains('dark');
}

方案三:支持动态主题切换的状态监听

若用户可手动切换主题,静态函数无法触发组件重新渲染,需用useState和useEffect监听主题变化:

import { useState, useEffect } from 'react';

function useTheme() {
  const [isDark, setIsDark] = useState(false);

  useEffect(() => {
    // 初始化主题:优先使用页面dark类,其次使用系统偏好
    const updateTheme = () => {
      const hasDarkClass = document.documentElement.classList.contains('dark');
      const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
      setIsDark(hasDarkClass || prefersDark);
    };

    updateTheme();

    // 监听系统主题变化(仅无手动设置时跟随系统)
    const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
    const handleSystemChange = (e) => {
      if (!document.documentElement.classList.contains('dark')) {
        setIsDark(e.matches);
      }
    };
    mediaQuery.addEventListener('change', handleSystemChange);

    // 监听页面dark类的手动修改
    const classObserver = new MutationObserver((mutations) => {
      mutations.forEach(mut => {
        if (mut.attributeName === 'class') {
          setIsDark(document.documentElement.classList.contains('dark'));
        }
      });
    });
    classObserver.observe(document.documentElement, { attributes: true });

    // 清理监听
    return () => {
      mediaQuery.removeEventListener('change', handleSystemChange);
      classObserver.disconnect();
    };
  }, []);

  return isDark;
}

在组件中使用该Hook:

const isDark = useTheme();

<Icon
  className="cursor-pointer"
  icon="entypo-social:linkedin-with-circle"
  width={24}
  color={isDark ? "white" : "black"}
  height={24}
  onClick={() => openInNewTab("https://www.linkedin.com/")}
/>

方案四:用Tailwind类直接控制颜色(最简洁)

无需手动判断主题,利用Tailwind的dark变体直接设置颜色,完全符合Tailwind设计思路:

<Icon
  className="cursor-pointer text-black dark:text-white"
  icon="entypo-social:linkedin-with-circle"
  width={24}
  height={24}
  onClick={() => openInNewTab("https://www.linkedin.com/")}
/>

只要页面根元素存在dark类,图标自动变为白色,否则为黑色,无需额外逻辑。


内容的提问来源于stack exchange,提问作者Abhishek AN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:25:24