Material UI 嵌套主题提供程序与Styles HOC 中断

Posted

技术标签:

【中文标题】Material UI 嵌套主题提供程序与Styles HOC 中断【英文标题】:Material UI nested theme providers breaks withStyles HOC 【发布时间】:2020-07-26 07:39:52 【问题描述】:

我有一个使用 Create React App 创建的 React 应用程序,我使用 @material-ui/core npm 包进行主题化。

为了自定义组件,我使用 MaterialUI 提供的 withStyles 高阶组件。

根据文档,它支持嵌套的 ThemeProviders https://material-ui.com/customization/theming/#nesting-the-theme。

但在子 ThemeProvider withStyles 内部不会应用类。

这是一个演示问题的基本应用程序 -> https://codesandbox.io/s/vibrant-tree-eh83d

ExampleComponent.tsx

import React,  FunctionComponent  from "react";
import 
  WithStyles,
  withStyles,
  createStyles,
  StepButton,
  Step,
  Stepper,
  Box
 from "@material-ui/core";

const styles = createStyles(
  button: 
    "& .MuiStepIcon-root.MuiStepIcon-active": 
      fill: "red"
    
  
);

interface Props extends WithStyles<typeof styles> 
  title: string;


const ExampleComponent: FunctionComponent<Props> = ( title, classes ) => 
  console.log(title, classes);
  return (
    <Box display="flex" alignItems="center">
      <span>title</span>
      <Stepper activeStep=0>
        <Step>
          <StepButton className=classes.button>Test</StepButton>;
        </Step>
      </Stepper>
    </Box>
  );
;

export default withStyles(styles)(ExampleComponent);

App.tsx

import * as React from "react";
import  ThemeProvider, createMuiTheme  from "@material-ui/core";
import ExampleComponent from "./ExampleComponent";

const theme = createMuiTheme();

function App() 
  return (
    <ThemeProvider theme=theme>
      <ExampleComponent title="Root" />
      <ThemeProvider theme=theme>
        <ExampleComponent title="Nested" />
      </ThemeProvider>
    </ThemeProvider>
  );


export default App;

在 ExampleComponent 中,我 console.log 生成的类对象。

我想使用嵌套的 ThemeProviders 并覆盖组件内的类,而不管 ThemeProvider 是什么。 我错过了什么还是不可能?

【问题讨论】:

【参考方案1】:

当您使用嵌套主题时,您无法可靠地使用 Material-UI 的全局类名称(例如 .MuiStepIcon-root.MuiStepIcon-active)。在嵌套主题中,“Mui...”类名必须不同,以避免与***主题的 CSS 类冲突,因为嵌套主题会导致“Mui...”类的某些 CSS与众不同。

您可以使用以下语法来成功匹配嵌套主题中出现的 Mui 类名称的后缀版本:

const styles = createStyles(
  button: 
    '& [class*="MuiStepIcon-root"][class*="MuiStepIcon-active"]': 
      fill: "red"
    
  
);

相关答案:

How reliable are MUI Global Class names in JSS?

【讨论】:

以上是关于Material UI 嵌套主题提供程序与Styles HOC 中断的主要内容,如果未能解决你的问题,请参考以下文章

与gatsby一起使用gatsby-plugin-material-ui时放置主题文件的位置?

Material-UI 主题化组件库

如何在样式化组件中访问 Material-ui 的主题

React 和 Material UI,对 props 和组件嵌套的大致了解

如何重构分享主题信息的material-ui demo

IDEA 猛男程序媛/猿必备主题 Material Theme UI /Solarized Light