【问题标题】:How to toggle a theme in React?如何在 React 中切换主题?
【发布时间】:2020-09-02 05:28:45
【问题描述】:

我正在尝试实现一个按钮来在明暗之间切换。我有一个看起来像这样的文件 AppRouter..

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 的状态。有可能吗?

知道我可以从哪里开始吗?我正在使用反应钩子和类型脚本。我尝试了各种方法都无济于事。减速器会起作用吗?

更新:

AppRouter.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 必须是可选的。

【问题讨论】:

  • 在 AppRouter 中创建一个本地状态,并将 setter 传递给您希望切换主题的 Route 组件。如果不清楚,请告诉我。
  • 如何将 setter 传递给 Route 组件?有链接可以参考吗?在交换机内部,我有 。这不是我想要切换按钮所在的位置。
  • 我正在使用 typescript 和 react hooks。我试着做 const [theme, setTheme] = React.UseState(getTheme(true))。我应该如何让 setTheme 从另一个组件工作?我很困惑。

标签: reactjs typescript


【解决方案1】:

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

AppRouter.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>
 );
 }

PageTitle.tsx:

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

const PageTitle: React.FC<PageTitleProps> = ({ ... toggleTheme}) => {
  ...
  return ( 
  ... 
  <button onClick={() => toggleTheme()}>Change Theme</button>
)}

【讨论】:

  • 它对我没有任何作用。我如何获得价值?让我知道我是否做错了。所以我有一个组件 PageTitle,我做了 alert(“hello”)}/>。在我的 PageTitle 中我做了一个 const PageTitle : React.FC = ({toggleTheme}) => {...}
  • 请用您拥有的代码更新您的问题。但本质上,您需要在组件内部以某种方式调用 toggleTheme 函数。尝试记录该函数以查看它是否正在传递。
  • 我正在尝试做的警报是查看我是否从 toggleTheme 获得任何值,但事实并非如此。
  • toggleTheme 不返回任何值。它返回一个将状态设置为 true 或 false 的函数。像这样调用函数
  • 嗨 LuisMendes,很抱歉给您带来麻烦。我已经更新了上面的代码,你能帮助我吗?按钮好像没有定义,应该怎么定义呢?
猜你喜欢
  • 2021-09-10
  • 2020-05-04
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2021-09-01
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多