css - 如何在现有的 React 站点上实现主题切换器
问题描述
我目前有两个主题文件,theme.js
和theme-dark.js
. 我还有一个已经设置好的基于 React 的复杂站点,我找不到一种方法来实现用户通过站点上的某些切换器在两个主题文件之间切换的方法。
这是我的index.js
渲染函数的样子:
const rootElement = document.getElementById('root')
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
rootElement
)
这就是App.tsx
文件中的相关代码的样子:
<ThemeProvider theme={theme}>
<CssBaseline />
<SnackbarProvider
.....
</SnackbarProvider>
</ThemeProvider>
文件中的上述代码App.tsx
嵌套在一些自定义上下文提供程序组件中,并包含一些用于加载站点初始组件的数据。
我在使用现有代码实现主题切换器以在theme.js
和之间切换时遇到了一些麻烦theme-dark.js
。如果有人能给我推动正确的方向,我将不胜感激。不幸的是,由于我公司的安全原因,这是关于我可以粘贴的所有实际代码,但我认为这里的主要问题是提供自定义主题提供程序时<Provider>
元素中断。index.js
解决方案
一个简单的状态就足够了,但您可能需要在应用程序的深处切换状态,即开关/按钮所在的位置。
你可以通过 Context,但既然你已经在使用 redux,为什么要重新发明轮子。
为您的主题类型创建一个减速器,
// isDarkModeReducer.js
export default function isDarkModeReducer(state = false, action) {
switch (action.type) {
case 'toggleDarkMode': {
return !state;
}
default:
return state;
}
}
将其添加到您的rootReducer
// rootReducer.js
...
import isDarkModeReducer from '<location of your isDarkModeReducer reducer>';
...
const rootReducer = combineReducers({
...
isDarkMode: isDarkModeReducer
})
...
在您App.tsx
访问isDarkMode
创建的商店中的值时,并使用它有条件地传递theme.js
或theme-dark.js
归档。
// App.tsx
...
import theme from 'theme.js';
import theme-dark from 'theme-dark.js';
import { useSelector } from 'react-redux'
const isDarkMode = useSelector(state => state.isDarkMode);
...
return (
<ThemeProvider theme={isDarkMode ? theme-dark : theme}>
<CssBaseline />
<SnackbarProvider
.....
</SnackbarProvider>
</ThemeProvider>
);
...
对于切换,您所要做的就是从您的切换按钮所在的任何位置dispatch
进行操作toggleDarkMode
。
// SwitchButton
import { useDispatch } from 'react-redux'
const dispatch = useDispatch();
const toggleTheme = () => {
dispatch({ type: 'toggleDarkMode' });
};
return (
<button onClick={toggleTheme}>Switch Theme</button>
);
您可能还希望将值保存到 localStorage 以进行持久化,您可以按照文档中的说明轻松执行此操作。
推荐阅读
- python-2.7 - 使用 matplotlib.pyplot.imshow 像 cv2.imshow 一样按比例显示图像
- ios - 在窗口中删除和添加视图时键盘/工具栏中断
- javascript - 如何使用 containsLocation + searchBox 地图 API?
- javascript - 在嵌套函数中返回一个函数(Javascript)
- iis - 通过 HTTPS 请求的 IIS 网站不断显示登录提示,而不是加载站点
- c# - Entity Framework Core:列、参数或变量#4:找不到数据类型 bool
- android - HttpURLConnection 在发送 POST 请求正文之前有一些延迟
- regex - 如何在前面有一个可选字符串的同时阻止负前瞻失败?
- python - 如何将flappy bird(在python 3.9上用pygame制作)分数保存到sql数据库中
- imagemagick - 使用 imagemagick 将 jpeg 从 3 通道 sRGB 转换为单通道灰度