如何在 React 的本地存储中保存暗模式?
How to save darkMode in local storage in React?
我想在 local storage 中保存用户选择的主题 - 浅色或深色,以便在页面刷新时主题仍然与用户的选择一致。我尝试为此使用 useEffect 挂钩,但我可能做错了什么。
我包含了以下代码:
function App() {
// Theme
const [theme, setTheme] = useState('light');
const checkTheme = () => theme === 'light' ? setTheme('dark') : setTheme('light') ;
// Amount of Portions
const [amountOfPortions , setAmountOfPortions] = useState(1);
const updateAmountOfPortions = (dataFromChild) => {
setAmountOfPortions(dataFromChild);
};
return (
<div className={`app wrapper app__bgc--${theme}`}>
<Switch onChange={checkTheme} color="primary"/>
<MainCard update={updateAmountOfPortions}/>
<Recipe value={amountOfPortions}/>
</div>
)};
您只是在设置状态,该状态将在组件刷新后丢失
您需要使用 localStorage 编写一个函数 api。类似于:
const setThemeInStorage = (theme) => {
localStorage.setItem('theme', theme)
}
然后像这样称呼它
setThemeInStorage('light')
并像这样检索它:
const getThemeInStorage = () => {
localStorage.getItem('theme') // returns 'light' in this case
}
如果你想运行立即执行此代码
const theme = getThemeInStorage()
那么theme
就是localStorage
的值
最简单的方法是使用像 useLocalStorage 这样的自定义挂钩。如果你不想使用钩子,他们仍然有实现 localStorage
writing/reading 部分的代码,并附有注释解释他们是如何做到的,这样你就可以用不同的方式做到这一点(虽然我想不出你为什么会这样)。
这个怎么样?
function persistItem(key: string, value: string) {
localStorage.setItem(key, value)
return value
}
function usePersistState(key: string, initialValue?: string) {
const [state, setState] = useState(
() => localStorage.getItem(key) || persistItem(key, initialValue)
)
const setStateAndPersist = useCallback(
(newState: string) => {
setState(newState)
return persistItem(key, newState)
},
[key, setState]
)
return [state, setStateAndPersist]
}
在您的组件中,只需 const [theme, setTheme] = usePersistState("theme", "light")
。如果在 localStorage
.
中没有找到任何内容,这将默认为“light”
我想在 local storage 中保存用户选择的主题 - 浅色或深色,以便在页面刷新时主题仍然与用户的选择一致。我尝试为此使用 useEffect 挂钩,但我可能做错了什么。 我包含了以下代码:
function App() {
// Theme
const [theme, setTheme] = useState('light');
const checkTheme = () => theme === 'light' ? setTheme('dark') : setTheme('light') ;
// Amount of Portions
const [amountOfPortions , setAmountOfPortions] = useState(1);
const updateAmountOfPortions = (dataFromChild) => {
setAmountOfPortions(dataFromChild);
};
return (
<div className={`app wrapper app__bgc--${theme}`}>
<Switch onChange={checkTheme} color="primary"/>
<MainCard update={updateAmountOfPortions}/>
<Recipe value={amountOfPortions}/>
</div>
)};
您只是在设置状态,该状态将在组件刷新后丢失
您需要使用 localStorage 编写一个函数 api。类似于:
const setThemeInStorage = (theme) => {
localStorage.setItem('theme', theme)
}
然后像这样称呼它
setThemeInStorage('light')
并像这样检索它:
const getThemeInStorage = () => {
localStorage.getItem('theme') // returns 'light' in this case
}
如果你想运行立即执行此代码
const theme = getThemeInStorage()
那么theme
就是localStorage
最简单的方法是使用像 useLocalStorage 这样的自定义挂钩。如果你不想使用钩子,他们仍然有实现 localStorage
writing/reading 部分的代码,并附有注释解释他们是如何做到的,这样你就可以用不同的方式做到这一点(虽然我想不出你为什么会这样)。
这个怎么样?
function persistItem(key: string, value: string) {
localStorage.setItem(key, value)
return value
}
function usePersistState(key: string, initialValue?: string) {
const [state, setState] = useState(
() => localStorage.getItem(key) || persistItem(key, initialValue)
)
const setStateAndPersist = useCallback(
(newState: string) => {
setState(newState)
return persistItem(key, newState)
},
[key, setState]
)
return [state, setStateAndPersist]
}
在您的组件中,只需 const [theme, setTheme] = usePersistState("theme", "light")
。如果在 localStorage
.