如果模式为深色,则将 bootstrap 开关组件设置为 'checked'
Set bootstrap switch component to 'checked' if mode is Dark
我的 localStorage 中有一个用于我的 Web 应用程序的主题,如果模式设置为 'dark',我想将选中的值添加到 Switch 组件,或者如果模式为 [=21],则未选中=].
但是,当我将主题设置为 'dark' 并刷新页面时,开关会自动变为未选中状态,我该如何解决?
下面是代码:
import React, { useState,useEffect } from 'react';
import useTheme from '../custom/useTheme';
export default function Switch() {
const[active,setActive] = useState(false);
function handleTheme(){
if(active === false){
// Dark mode
useTheme(true);
setActive(true);
localStorage.setItem('mode','dark');
}else if(active === true){
// Light mode
useTheme(false);
setActive(false);
localStorage.setItem('mode','light');
}
};
return (
<div id='switchBox' className='form-check form-switch'>
<input
id="switch"
role="switch"
// checked
value={active}
type="checkbox"
onClick={()=> handleTheme()}
className="form-check-input shadow-sm"
/>
<label
className='ms-1'
htmlFor='switch'
>Dark</label>
</div>
)
};
看起来是这样,深色主题已打开,但未选中 Switch。
您可以通过对空数组使用 useEffect
挂钩来实现此目的。这将在渲染组件时触发一次内部逻辑。在里面你可以检索以前保存的 mode
属性 并用它来设置当前会话状态:
useEffect(() => {
const isLight = localStorage.getItem('mode');
if (isLight !== undefined) setActive(isLight);
}, [])
如上述答案所述,状态存储在内存中,刷新页面时会丢失。当您的解决方案将主题状态保存到 localstorage 时,您还需要 将 useState 的初始值设置为存储在 localstorage 中的值,以便在刷新后显示正确的状态。你可以尝试这样的事情:
const[active, setActive] = useState(false)
// Get stored data from local storage if available on first render
useEffect(() => {
// Get stored theme mode and set it in state manager
const storedTheme = localStorage.getItem('mode')
if(storedTheme) {
setActive(storedTheme)
}
}, [])
通过将空数组作为第二个参数传递给 useEffect,这只会 运行 初始渲染。
有关 useEffect 的更多信息,请参阅 React 文档:https://reactjs.org/docs/hooks-effect.html
我使用三元运算符解决了 checked 问题,在我想要的情况下为它赋予 True 或 False 值...
这是正确的解决方案!
<input
id="switch"
role="switch"
checked={localStorage.getItem('mode') === 'dark'?(true):(false)}
value={active}
type="checkbox"
onClick={()=> handleTheme()}
className="form-check-input shadow-sm"
/>
我的 localStorage 中有一个用于我的 Web 应用程序的主题,如果模式设置为 'dark',我想将选中的值添加到 Switch 组件,或者如果模式为 [=21],则未选中=]. 但是,当我将主题设置为 'dark' 并刷新页面时,开关会自动变为未选中状态,我该如何解决? 下面是代码:
import React, { useState,useEffect } from 'react';
import useTheme from '../custom/useTheme';
export default function Switch() {
const[active,setActive] = useState(false);
function handleTheme(){
if(active === false){
// Dark mode
useTheme(true);
setActive(true);
localStorage.setItem('mode','dark');
}else if(active === true){
// Light mode
useTheme(false);
setActive(false);
localStorage.setItem('mode','light');
}
};
return (
<div id='switchBox' className='form-check form-switch'>
<input
id="switch"
role="switch"
// checked
value={active}
type="checkbox"
onClick={()=> handleTheme()}
className="form-check-input shadow-sm"
/>
<label
className='ms-1'
htmlFor='switch'
>Dark</label>
</div>
)
};
看起来是这样,深色主题已打开,但未选中 Switch。
您可以通过对空数组使用 useEffect
挂钩来实现此目的。这将在渲染组件时触发一次内部逻辑。在里面你可以检索以前保存的 mode
属性 并用它来设置当前会话状态:
useEffect(() => {
const isLight = localStorage.getItem('mode');
if (isLight !== undefined) setActive(isLight);
}, [])
如上述答案所述,状态存储在内存中,刷新页面时会丢失。当您的解决方案将主题状态保存到 localstorage 时,您还需要 将 useState 的初始值设置为存储在 localstorage 中的值,以便在刷新后显示正确的状态。你可以尝试这样的事情:
const[active, setActive] = useState(false)
// Get stored data from local storage if available on first render
useEffect(() => {
// Get stored theme mode and set it in state manager
const storedTheme = localStorage.getItem('mode')
if(storedTheme) {
setActive(storedTheme)
}
}, [])
通过将空数组作为第二个参数传递给 useEffect,这只会 运行 初始渲染。 有关 useEffect 的更多信息,请参阅 React 文档:https://reactjs.org/docs/hooks-effect.html
我使用三元运算符解决了 checked 问题,在我想要的情况下为它赋予 True 或 False 值... 这是正确的解决方案!
<input
id="switch"
role="switch"
checked={localStorage.getItem('mode') === 'dark'?(true):(false)}
value={active}
type="checkbox"
onClick={()=> handleTheme()}
className="form-check-input shadow-sm"
/>