【发布时间】: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