在运行时更改 Material UI 反应主题的最佳方式

Posted

技术标签:

【中文标题】在运行时更改 Material UI 反应主题的最佳方式【英文标题】:The optimum way of changing Material UI react theme at runtime 【发布时间】:2021-06-06 13:32:45 【问题描述】:

我是 React 和 Material UI 的新手,但我仍在尝试掌握组合而不是继承。 我正在尝试在反应应用程序中实现在运行时切换到暗/亮主题。我以某种方式实现了它,但有很多代码重复。我确信有更好的方法。 这是我目前所拥有的:

主题.js

import  createMuiTheme  from "@material-ui/core/styles";
    
export const darkTheme = createMuiTheme(
  palette: 
    type: "dark",
  ,
 //.....a lot of items
);

export const lightTheme = createMuiTheme(
  palette: 
    type: "light",
  ,

 //.....duplicating same items as above
);

App.js

import  lightTheme, darkTheme  from "../shared/Theme";

const App = (
  theme
) => 

 return (
    <ThemeProvider theme=theme === "dark" ? darkTheme : lightTheme>
      /*Components...*/
    </ThemeProvider>
  );
;

主题道具正在使用 redux 进行注入,并且工作正常。这是可行的解决方案,但不是最好的解决方案。 我在 Material UI 文档中发现我们可以拥有 [外部和内部主题提供程序][1],我尝试执行以下操作(但没有成功):

<ThemeProvider theme=… >
  
  <ThemeProvider theme=outerTheme => ( darkMode: true, ...outerTheme )>
   ...Component
  </ThemeProvider>
</ThemeProvider>

我知道 useStyle 钩子,但它只是让您创建可以在组件中使用的类名。我想要的是:获取现有主题对象的某个部分并替换其中的一个属性。 任何帮助将不胜感激。感谢您阅读到这里! [1]:https://material-ui.com/styles/advanced/#main-content

【问题讨论】:

【参考方案1】:

当存在属性值重复时,“重复”是一个问题,否则是一种替代配置,即重复对象或其属性不是问题。如果没有属性值重复,则使用单独的对象是一种方式,MUI does it,所以你是正确的。

现在,假设您的意思是属性值重复(共享样式):

//.....duplicating same items as above

根据您的目标,在您的对象中混合使用替代配置的属性值重复:

取现有主题对象的某个部分并替换其中的一个属性

尝试工厂方法:

const createThemeOptions = (isDarkMode)=>(
   palette: 
    mode: isDarkMode? "dark" : "light", // alternate configuration
   ,
   primary: 
      main: indigo['A700'], // property-value repetition(shared styling)
   ,
   secondary: 
      main: isDarkMode? deepOrange['A200'] : deepOrange['900'], // alternate configuration
   ,
  // make your other object properties shared or alternate...
);
export const darkTheme = createMuiTheme(createThemeOptions(true));
export const lightTheme = createMuiTheme(createThemeOptions());


【讨论】:

我认为我缺少一些很酷的钩子或模式来帮助实现我想要做的事情!您的答案看起来既酷又简单。虽然工厂输入只决定了palette.type 属性: :value,但property:value 的其余部分是共享的。将在当天晚些时候尝试此操作并标记为答案!大卫干杯!

以上是关于在运行时更改 Material UI 反应主题的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在焦点、反应上更改 Material-UI 文本字段的样式

如何更改 Material-UI AppBar 的明暗主题颜色?

如何在反应中更改material-ui Textfield标签样式

更改自定义主题 Material-UI

对 Material UI Select 组件的更改做出反应测试库

更改 startIcon / endIcon Material-UI 的大小