javascript - 子布局组件中的 React/MUI 暗模式切换
问题描述
在 React+MUI (JS) 中,我试图在布局组件中实现暗模式切换,但找不到任何有关状态的解决方法。目标是在布局中呈现的开关内切换模式。你会在这里找到我的 App.js(带有路由器和布局)和我的 Layout.js
// App.js (incl. routes and react-router-dom)
const [ darkMode, setDarkMode ] = useState(false)
const theme = createMuiTheme({
palette: {
type: darkMode ? "dark" : "light" ,
}
})
<ThemeProvider theme={theme}>
//...components
<Layout {...darkMode}>
//... other components
然后对于 Layout 组件:
const Layout = (props) => {
const [ darkMode, setDarkMode ] = React.useState(props.darkMode)
useEffect(() => {
setDarkMode(props.darkMode)
}, [props.darkMode])
const theme = useTheme()
...
<Switch checked={darkMode} onChange={() => setDarkMode(!darkMode)} />
...
{props.children}
任何帮助都会令人愉快,因为实际上没有任何效果。
解决方案
这对我有用:
import { useMemo, useState } from "react";
import {
Button,
createMuiTheme,
ThemeProvider,
} from "@material-ui/core";
const rootTheme = (darkMode) => ({
palette: {
type: darkMode ? "dark" : "light"
}
});
const App = () => {
const [darkMode, setDarkMode] = useState(true);
const theme = useMemo(() => createMuiTheme(rootTheme(darkMode)), [darkMode]);
const onClick = () => {
setDarkMode(!darkMode);
};
return (
<ThemeProvider theme={theme}>
<Button onClick={onClick}>Change Theme</Button>
</ThemeProvider>
);
};
export default App;
推荐阅读
- bitbucket - 如何在 Bitbucket REST API 中验证请求
- laravel - vadliator 不工作并返回 200 OK
- java - 如果元素出现,如何关闭?
- sql - 每次在主表中插入新行时如何在表中插入行?
- php - 如何从互联网访问虚拟主机?
- python - 在 VBA Outlook 中运行 Python 或 PowerShell
- json - TypeError:无法读取反应中未定义的属性“减少”
- sql-server - 从选择中调用每一行的存储过程
- vba - 在 Word 中切换“不同的奇数页和偶数页”复选框
- c++ - 解释这是如何工作的以及如何转换为 constexpr