useDarkMode
具有自动数据持久性的深色模式。
Tips
点击展开
对于服务端渲染的应用程序而言,由于无法在服务端获取到用户的颜色偏好。所以第一 次渲染的时候可能会出现闪烁。想要避免此问题,你可以参考一下步骤。
- 在你的内容渲染前增加一个脚本。
<script
dangerouslySetInnerHTML={{
// 增加一个自执行的函数
__html: `
(function () {
function setDark(dark) {
dark && document.documentElement.classList.add('dark');
}
let store;
try {
store = JSON.parse(localStorage.getItem('reactuses-color-scheme'));
} catch (err) { }
let dark;
if(store === null){
const darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
dark = darkQuery.matches;
}else {
dark = store;
}
setDark(dark)
})();
`,
}}
></script>
- 为了方便统一管理主题颜色,我们推荐使用
context
来存储它们。
import { useDarkMode } from "@reactuses/core";
import React, { createContext, useContext } from "react";
type ThemeContext = { theme: boolean; toggleTheme: () => void };
const ThemeContext = createContext<ThemeContext | undefined>(undefined);
export function ThemeProvider({ children }: { children: React.ReactNode }) {
const [dark, setDark] = useDarkMode({
classNameDark: "dark",
classNameLight: "light",
defaultValue: false,
});
return (
<ThemeContext.Provider value={{ theme: !!dark, toggleTheme: setDark }}>
{children}
</ThemeContext.Provider>
);
}
export function useTheme() {
const context = useContext(ThemeContext);
if (context === undefined) {
throw new Error("useTheme must be used within a ThemeProvider");
}
return context;
}
Usage
实时编辑器
function Demo() { const [theme, toggleDark] = useDarkMode({ classNameDark: "dark", classNameLight: "light", defaultValue: false, }); return ( <div> <div>theme: {theme ? "dark" : "light"}</div> <br /> <div> <button onClick={toggleDark}>toggleDark</button> </div> </div> ); };
结果
Loading...
API
UseDarkOptions
参数名 | 描述 | 类型 | 默认值 |
---|---|---|---|
selector | 适用于目标元素的 CSS 选择器 | string | 'html' |
attribute | 应用到目标元素的 html 属性 | string | 'class' |
defaultValue | 默认值 | boolean | false |
storageKey | 将数据持久保存到 localStorage/sessionStorage 的键值 | string | 'reactuses-color-scheme' |
storage | 存储对象,可以是localStorage或sessionStorage | () => Storage | localStorage |
classNameDark | 应用到目标元素上黑色类名称 | string (必填) | - |
classNameLight | 应用到目标元素上的亮色类名称 | string (必填) | - |
useDarkMode
Returns
readonly [boolean | null, () => void, React.Dispatch<React.SetStateAction<boolean | null>>]
: 包含以下元素的元组:
- 黑暗状态的当前值。
- 切换黑暗状态的功能。
- 更新黑暗状态的功能。
Arguments
参数名 | 描述 | 类型 | 默认值 |
---|---|---|---|
options | - | UseDarkOptions (必填) | - |