当前位置: 首页 > 知识库问答 >
问题:

如何在React中切换主题?

张绍晖
2023-03-14

我正在尝试实现一个按钮来在明暗之间切换。我有一个文件批准器,看起来像这样。。

const theme = getTheme(true);
const AppRouter = () => {
   return (
          <MuiThemeProvider theme={theme}>
              <ThemeProvider theme={theme}>
                 ...
                 <Switch> *all my routes are here including AppRoot, which routes to components* </Switch>
          </MuiThemeProvider></ThemeProvider>
);
}

所以当我设置getTheme(true)时,它会触发黑暗主题,而getTheme(false)会触发光明主题。问题来了,我想在Switch中的一个组件中插入一个切换按钮,允许用户在这两个主题之间切换。本质上,组件将控制AppRouter的状态。可能吗?

你知道我从哪里开始吗?我正在使用react钩子和类型脚本。我试过各种方法,但都没有用。减速器能工作吗?

更新:

认可者。tsx

const [lightTheme, setLightTheme] = React.useState(true);
const theme = getTheme(lightTheme);
const AppRouter = () => {
   return (
          <MuiThemeProvider theme={theme}>
              <ThemeProvider theme={theme}>
                 ...
                 <Switch> 
                     <PrivateRoute path="..." component={AppRoot} render{()=> <PageTitle toggleTheme={() => toggleTheme}/>}
                 </Switch>
          </MuiThemeProvider></ThemeProvider>
);
}

PageTitle.tsx

interface PageTitleProps {
  ...
  toggleTheme?: () => void;
}

const PageTitle: React.FC<PageTitleProps> = ({ ... toggleTheme}) => {
  ...
  return ( 
  ... 
  {toggleTheme && <Button OnClick={() => toggleTheme()}>Change Theme</Button>
)}

我试过运行上面的代码,但是toggleTheme没有定义,所以按钮根本没有显示出来。toggleTheme必须是可选的。

共有1个答案

阎裕
2023-03-14

在App路由器中创建一个本地状态,并将切换器传递给将切换主题的组件。

认可者。tsx:

 import React, { useState } from 'react';

 const AppRouter = () => {
 const [lightTheme, setLightTheme] = useState(true);
 const theme = getTheme(lightTheme);
 const toggleTheme = () => setLightTheme(!lightTheme);
 return (
      <MuiThemeProvider theme={theme}>
          <ThemeProvider theme={theme}>
             ...
             <Switch> 
               <Route path='your-path' render={(props) => 
                 <PageTitle toggleTheme={ toggleTheme } />} />
             </Switch>
       </MuiThemeProvider></ThemeProvider>
 );
 }

页面标题。tsx:

interface PageTitleProps {
  ...
  toggleTheme?: () => void;
}

const PageTitle: React.FC<PageTitleProps> = ({ ... toggleTheme}) => {
  ...
  return ( 
  ... 
  <button onClick={() => toggleTheme()}>Change Theme</button>
)}
 类似资料:
  • 问题内容: 我在有菜单按钮的项目中使用react。 还有一个Sidenav组件,例如: 我编写了以下代码来切换菜单: 事实是,这不是DOM元素,我无法在他上添加类。 有人可以向我解释如何像在按钮上一样在组件上切换类吗? 问题答案: 如果您想让React正确高效地渲染DOM,则必须使用组件的State来更新组件参数,例如Class Name。 更新:我更新了示例,以在单击按钮时切换Sidemenu。

  • 我尝试了不同的方法。但是不要尝试切换这个css类。当我点击它时,书签应该会变成蓝色。到目前为止,我可以用onClick更改为false,但它不会切换回来。 这是ToggleBookmark组件集:

  • 我有以下Redis/Sentinel配置: Redis主服务器+从服务器 监视的哨兵,名为 客户端应用程序查询,然后查询和修改 现在,假设过时了,我想用一个名为的新Redis master来替换它(停机时间/数据丢失最少)。在手术的最后,我想要这样: Redis主服务器+从服务器 客户端应用程序查询和修改 我可以这样做: 让哨兵开始监视,名为 让的每个从属都成为的从属 从那以后,我被困住了,因为客

  • 问题内容: 我有一个应用程序,允许用户选择一个选项,并根据用户选择从组件中删除一个JPanel,添加新的JPanel并重新验证该组件 看到代码: c是一个组件 我有几个JPanels,用户可以在它们之间切换,并且开关可以正常工作。但是,当我根据用户选择添加此JPanel时,以后添加的JPanels无法正确加载。是什么原因造成的? } 问题答案: 更好的方法是转向CardLayout。但是如果您想坚

  • 问题内容: 在和之间切换的最有效方法是什么? 问题答案: 使用NOT的解决方案 如果值是布尔值,最快的方法是使用 not 运算符: 用减法求解 如果值是数字,则从总数中减去是切换值的一种简单快捷的方法: 使用XOR的解决方案 如果值在 0 和 1 之间切换,则可以使用按位异或: 该技术可以推广到任意一对整数。异或一步被替换为预异常数: (此想法由Nick Coghlan提交,后来由@zxxc推广。

  • 相当绿色关于javas组件的东西等,所以请原谅我,如果我提供的信息是不够的! 请参阅以下代码。在框架中添加菜单和菜单显示,没有问题。我想知道何时调用gameOn()来删除菜单,而不是启动游戏。下面的代码仅使框架表面为“空白”,未添加游戏面板。 对如何修复它有何想法/建议?菜单面板上有一个鼠标听筒。