将 MUI 主题应用于创建的 DOM 节点

Posted

技术标签:

【中文标题】将 MUI 主题应用于创建的 DOM 节点【英文标题】:Apply MUI Theme to Created DOM Node 【发布时间】:2020-08-07 02:09:33 【问题描述】:

我是 React-Material 主题功能的忠实拥护者,并且已广泛使用它,但今天我被难住了。要使用主题设置弹出窗口的样式,通常我将弹出窗口(使用display: none)隐藏在我的主组件文件中,如下所示:

function App() 

  return (
    <Fragment>
      <Popup /> // ie here
      <LeftPanel />
      <Map />
    </Fragment>
  );

然后我的 themeProvider 包装了 &lt;App/&gt;:

<ThemeProvider theme=theme>
  <App />
</ThemeProvider>

但是现在我正在尝试设置不在&lt;App/&gt; 内的弹出窗口的样式,并且 not 在加载时在 DOM 上 - 我正在从 @ 返回一个节点987654326@。当我尝试访问makeStyles 中的主题时,它使用了MUI 的默认主题(即默认主调色板颜色为紫色),而不是我创建的自定义主题(假设主调色板颜色为绿色)。我尝试从index 文件中导出自定义createMuiTheme 主题对象并将其直接传递给弹出组件,但它一直使用MUI 的默认主题,即:

弹出按钮,我正在尝试访问我的自定义 MUI 主题:

import React,  FunctionComponent  from 'react';
import  makeStyles  from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';


const useStyles = makeStyles(theme => 
  return 
    text: 
      color: 'white',
      fontSize: theme.typography.pxToRem(14),
    ,
    tab: 
      backgroundColor: theme.palette.primary.light
      // This comes back as the default MUI theme :(
    
  
);

interface PopupButtonProps  

export const PopupButton: FunctionComponent<PopupButtonProps> = (props) => 
  const classes = useStyles();
  return (
    <div className= `$classes.tab 'custom-popup__view-details pointer'`>
      <Typography variant='button' classes= root: classes.text>
        VIEW DETAILS
      </Typography>
    </div>
  );

弹出窗口:

const Popup = (props: PopupProps) => 
  const node: htmlElement = document.createElement('div');

  render(
    <>
      <div className="custom-popup__container">
        <PopupElement text=props.attributes.ServiceName Icon=ProviderIcon />
        <PopupElement text=props.attributes.Attribute_1 Icon=AddressIcon />
        <PopupElement text=props.attributes.Attribute_2 Icon=PhoneIcon />
      </div>
      <PopupButton />
    </>,
    node
  );
  return node;


export default Popup;

是否有人对如何在组件内使用特定 主题有任何想法,例如useTheme 挂钩将特定自定义主题放入组件中?

Versions:
React: 16.13.1
MUI: 4.9.9 (I'll try upgrading to 4.9.11 in the meantime)

【问题讨论】:

【参考方案1】:

就像你在App 周围使用ThemeProvider 一样,你应该在Popup 中使用ThemeProvider

import theme from "./whereever_you_define_your_theme_using_createMuiTheme";

const Popup = (props: PopupProps) => 
  const node: HTMLElement = document.createElement('div');

  render(
    <ThemeProvider theme=theme>
      <div className="custom-popup__container">
        <PopupElement text=props.attributes.ServiceName Icon=ProviderIcon />
        <PopupElement text=props.attributes.Attribute_1 Icon=AddressIcon />
        <PopupElement text=props.attributes.Attribute_2 Icon=PhoneIcon />
      </div>
      <PopupButton />
    </ThemeProvider>,
    node
  );
  return node;


export default Popup;

【讨论】:

谢谢瑞恩!!我曾尝试将按钮包装在&lt;ThemeProvider&gt; 中,但这不起作用,所以我什至没有费心包装整个弹出窗口 - 它有效! ?

以上是关于将 MUI 主题应用于创建的 DOM 节点的主要内容,如果未能解决你的问题,请参考以下文章

MUI createTheme 未正确将主题传递给 MUI 组件

jQuery_DOM学习之------创建节点及节点属性

如何使用 vue 渲染函数将使用 JavaScript 创建的 Dom 节点添加到 vue

DOM节点对象之创建和插入节点示例

JavaScript——Dom编程

mui-picker 增加过滤