我写了 hook useTheme
,我们将有标准主题:黑暗和光明。但我还想添加一个“创建主题”按钮,当您单击它时,将新主题添加到自定义主题;默认情况下,我们添加的所有主题都被禁用。如果我们已经包含了自定义主题,则不需要添加属性data-theme
,而只需获取其中的所有内容details
并将其传递给setProperty
.键是我们的类型--background, --color
,值是颜色。您能帮助实施吗?))
我假设我们需要添加每个主题active: false
,当您单击分离的主题时,更改状态并检查主题的整个列表,以确定包含哪个主题并更改它。
使用主题.js
export const useTheme = () => {
// Получить системную тему пользователя
const getSystemTheme = () => window?.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
const [theme, setTheme] = useState(localStorage.getItem('app-theme') || getSystemTheme());
// Получить кастомные темы пользователя
const getCustomThemes = () => JSON.parse(localStorage.getItem('custom-themes')) || [];
// Добавить обьект темы в LocalStorage custom-themes
// Example: addCustomTheme({name: 'Название тема', details: [background: 'orange']})
const addCustomTheme = obj => {
if (getCustomThemes().find(t => t.name === obj.name)) return false;
localStorage.setItem(
'custom-themes',
JSON.stringify(
[
...getCustomThemes(),
{ ...obj, active: false }
]
)
);
}
useLayoutEffect(() => {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
}, [theme]);
return { currentTheme: theme, setTheme, addCustomTheme };
}
您需要添加toggleCustomTheme功能: