当用户重新加载,访问新页面或在浏览器上按回鼠标等等时,如何使我的亮/暗主题永久保存为一种状态。...现在非常不一致。
这是我设置主题的index.js。我将其包裹在组件周围。
index.js
import { ThemeProvider, CssBaseline } from "@material-ui/core";
import { createMuiTheme } from "@material-ui/core";
const MyThemeContext = React.createContext({});
export function useMyThemeContext() {
return useContext(MyThemeContext);
}
function MyThemeProvider(props) {
const [isDarkMode, setIsDarkMode] = useState(false);
const theme = useMemo(
() =>
createMuiTheme({
palette: {
type: isDarkMode ? 'dark' : 'light',
},
}),
[isDarkMode]
);
return (
<ThemeProvider theme={theme}>
<MyThemeContext.Provider value={{ isDarkMode, setIsDarkMode }}>
{props.children}
</MyThemeContext.Provider>
</ThemeProvider>
);
}
const routing = (
<Router>
<React.StrictMode>
<MyThemeProvider>
<CssBaseline />
<Header />
<Switch>
<Route exact path="/" component={App} />
<Route path="/register" component={Register} />
<Route path="/login" component={Login} />
<Route path="/logout" component={Logout} />
<Route path="/dash/:slug" component={Bucket} />
<Route path="/create" component={CreateBucket}/>
</Switch>
<Footer />
</MyThemeProvider>
</React.StrictMode>
</Router>
);
ReactDOM.render(routing, document.getElementById('root'));
我使用一个激活主题状态的开关,它位于我的标题中。 header.js
import React from 'react';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import CssBaseline from '@material-ui/core/CssBaseline';
import { makeStyles } from '@material-ui/core/styles';
import { NavLink } from 'react-router-dom';
import Link from '@material-ui/core/Link';
import Button from '@material-ui/core/Button';
import Switch from '@material-ui/core/Switch';
import { useMyThemeContext } from '../index';
const useStyles = makeStyles((theme) => ({
appBar: {
borderBottom: `1px solid ${theme.palette.divider}`,
},
link: {
margin: theme.spacing(1, 1.5),
},
toolbarTitle: {
flexGrow: 1,
},
}));
function Header() {
const classes = useStyles();
const {isDarkMode, setIsDarkMode} = useMyThemeContext();
return (
<React.Fragment>
<CssBaseline />
<AppBar
position="static"
color="default"
elevation={0}
className={classes.appBar}
>
<Toolbar className={classes.toolbar}>
<Switch
checked={isDarkMode}
onChange={() => setIsDarkMode(!isDarkMode)}
/>
</Toolbar>
</AppBar>
</React.Fragment>
);
}
export default Header;
如何解决状态不保存的矛盾?感谢您的帮助!
您将使用localStorage
密钥名将状态保留在内存中。在应用程序重新加载时,您的初始状态将来自存储在中的值localStorage
,如果未设置,!!
则将确保该值false
不是null
同时传递给Provider
更新状态并将新值设置为的函数localStorage
。这样一来,您无需记住在localStorage
消耗消耗的每个位置设置值setIsDarkMode
// if it's not set in localStorage value is null, then !! will set as false
const initialState = !!JSON.parse(localStorage.getItem('theme'))
function MyThemeProvider(props) {
const [isDarkMode, setIsDarkMode] = useState(initialState);
// you pass another function where you persist the value to localStorage
// given your code you may just create a toggle function where you don't need to pass a value. but you can change it to receive an argument
const toggleDarkMode = () => {
setIsDarkMode(themeMode => {
localStorage.setItem('theme', !themeMode)
return !themeMode
})
}
const theme = useMemo(
() =>
createMuiTheme({
palette: {
type: isDarkMode ? 'dark' : 'light',
},
}),
[isDarkMode]
);
return (
<ThemeProvider theme={theme}>
<MyThemeContext.Provider value={{ isDarkMode, toggleDarkMode }}>
{props.children}
</MyThemeContext.Provider>
</ThemeProvider>
);
}
然后Header
您提取toggleDarkMode
:
function Header() {
const classes = useStyles();
const {isDarkMode, toggleDarkMode} = useMyThemeContext();
return (
<React.Fragment>
<CssBaseline />
<AppBar
position="static"
color="default"
elevation={0}
className={classes.appBar}
>
<Toolbar className={classes.toolbar}>
<Switch
checked={isDarkMode}
onChange={toggleDarkMode}
/>
</Toolbar>
</AppBar>
</React.Fragment>
);
}
export default Header;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句