在现代 Web 开发中,为用户提供一个适应其系统偏好的界面变得越来越重要。特别是暗黑模式(Dark Mode),它不仅能够减少眼睛的疲劳,还能在夜间提供更加舒适的阅读体验。那么,如何在 React 应用中优雅地检测用户是否启用了暗黑模式呢?
代码实现
下面是一个自定义 React Hook 的实现,它可以帮助我们检测用户的系统是否启用了暗黑模式:
import { useState, useEffect } from 'react';
export default function useDarkTheme() {
const [darkMode, setDarkMode] = useState(false);
useEffect(() => {
const colorSchemeQueryList = window.matchMedia('(prefers-color-scheme: dark)');
setDarkMode(colorSchemeQueryList.matches);
const handleChange = () => {
setDarkMode(colorSchemeQueryList.matches);
};
colorSchemeQueryList.addEventListener('change', handleChange);
return () => {
colorSchemeQueryList.removeEventListener('change', handleChange);
};
}, []);
return darkMode;
}
这个 Hook 通过监听 prefers-color-scheme
媒体查询的变化来实时更新 darkMode
状态。你可以在任何 React 组件中使用这个 Hook 来获取当前的暗黑模式状态,并据此调整你的 UI。
直接使用现有库
为了简化开发流程,你可以直接使用我们已经打包好的 npm 库 @alikia/dark-theme-hook
。这个库包含了上述 Hook 的实现,并且提供了类型定义,方便你在 TypeScript 项目中使用。
安装方法如下:
使用 npm
npm install @alikia/dark-theme-hook
# 使用 yarn
yarn add @alikia/dark-theme-hook
# 使用 pnpm
pnpm i @alikia/dark-theme-hook
# 使用 bun
bun add @alikia/dark-theme-hook
然后在你的 React 组件中导入并使用它:
import useDarkTheme from '@alikia/dark-theme-hook';
function MyComponent() {
const isDarkMode = useDarkTheme();
return (
<div>
<h1>暗黑模式检测</h1>
<p>暗黑模式 {isDarkMode ? '已启用' : '未启用'}。</p>
</div>
);
}
export default MyComponent;
通过使用这个库,你可以轻松地在你的 React 项目中实现暗黑模式的检测和响应,提升用户体验。