Styled Components Theme 如何作为 Props 传递给 Material UI 组件?

How can a Styled Components Theme be passed as Props to a Material UI component?

我已经花了 9 个小时寻找解决这个问题的方法,但我在任何地方都找不到似乎有效的方法。

我正在用打字稿写一个 React 组件。

我简单的使用了MaterialUI手风琴:

const Accordion = withStyles({

root:{
    backgroundColor: 'rgb(193, 195, 191)',
    
},
rounded:{
    '&:last-child':{
    borderBottomLeftRadius:'0px',
    borderBottomRightRadius:'0px',
    },
    '&:first-child':{
        borderTopLeftRadius:'0px',
        borderTopRightRadius:'0px',
        }
}
})(MuiAccordian);

我想做的就是传入我的 Styled Components 主题,这样我就可以将它应用为 root=>backgroundColor 值。

我相信这里的一些向导会立即发现我的问题 - 我可以请某人简单地展示如何将 DefaultTheme 对象类型的主题作为道具传递给 withStyles 方法吗?

非常感谢您的帮助。

编辑 - 代码解决方案

感谢下面的@filippofilip,他的回答中的链接指向的信息使我能够解决这个问题。

工作代码是:

const Accordion = withStyles(
    {
      root: (props:DefaultTheme) => ({
        backgroundColor: props.colors.backgroundColor,
    }),
      rounded: {
        '&:last-child': {
          borderBottomLeftRadius: '0px',
          borderBottomRightRadius: '0px',
        },
        '&:first-child': {
          borderTopLeftRadius: '0px',
          borderTopRightRadius: '0px',
        },
      },
    },
    { withTheme: true },
  )(MuiAccordian);

您会注意到在解析 Styled Components 中类型为 DefaultTheme 的类型化道具时存在细微差别。

为了从实现中调用它,我使用了 useContext 挂钩来检索样式化组件主题并将其传递给道具:

export default function MyAccordianComponent() {
  
  const themeContext = useContext(ThemeContext);
  const classes = useStyles(themeContext);

  return (
    <div className={classes.root}>
      <Accordion {...themeContext} defaultExpanded >

---fill in the rest of the component below

我希望这有助于其他人寻找这个或类似的东西来使用样式化组件、Typescript 和 Material UI

我认为您应该尝试查看此文档示例 https://material-ui.com/styles/basics/#adapting-based-on-props

通常主题在 props 参数内部或作为来自该函数的第二个参数。

编辑: 我在文档中找到它,您应该明确指定您希望在 props 对象中包含主题。

所以就这样使用它:

const Accordion = withStyles(
  {
    root: {
      backgroundColor: props => props.theme.backgroundColor,
    },
    rounded: {
      '&:last-child': {
        borderBottomLeftRadius: '0px',
        borderBottomRightRadius: '0px',
      },
      '&:first-child': {
        borderTopLeftRadius: '0px',
        borderTopRightRadius: '0px',
      },
    },
  },
  { withTheme: true },
)(MuiAccordian);

要查看所有其他可用选项,请查看 HERE