使用the docs/examples覆盖使用样式组件的Material UI样式,我设法在ExpansionPanel
和ExpansionPanelDetails
中设置根和“更深层元素”的样式。
然而,当我使用相同的技术从传递给ExpansionPanelSummary
的函数返回被重写的styled()
时,ExpansionPanelSummary
在DOM中移动并且整个ExpansionPanel
不再正确渲染。
有问题的技术,适用于ExpansionPanel
(这可以按预期工作在容器ExpansionPanel
上):
import MUIExpansionPanel from '@material-ui/core/ExpansionPanel';
export const ExpansionPanel = styled(props => (
<MUIExpansionPanel
classes={{expanded: 'expanded'}}
{...props}
/>
))`
&& {
...root style overrides
}
&&.expanded {
...expanded style overrides
}
`;
ExpansionPanel
和朋友的典型DOM(类名缩写):
<div class="MuiExpansionPanel...">
<div class="MuiExpansionPanelSummary..." />
<div class="MuiCollapse-container...>
<div class="MuiCollapse-wrapper...>
<div class="MuiCollapse-wrapperInner...>
<div class="MuiExpansionPanelDetails..." />
</div>
</div>
</div>
</div>
当我将上述技术应用于ExpansionPanelSummary
时的DOM:
<div class="MuiExpansionPanel...">
<div class="MuiCollapse-container...>
<div class="MuiCollapse-wrapper...>
<div class="MuiCollapse-wrapperInner...>
<div class="MuiExpansionPanelSummary..." />
<div class="MuiExpansionPanelDetails..." />
</div>
</div>
</div>
</div>
为了完整性,这里是我对ExpansionPanelSummary
所做的最小重复,它触发了DOM切换:
export const ExpansionPanelSummary = styled(props => (
<MUIExpansionPanelSummary
{...props}
/>
))``;
我的JSX是标准的ExpansionPanel
设置:
<ExpansionPanel>
<ExpansionPanelSummary>
Summary Label
</ExpansionPanelSummary>
<ExpansionPanelDetails>
<div>Some Content</div>
</ExpansionPanelDetails>
</ExpansionPanel>
这种困难与使用样式组件无关,只需将ExpansionPanelSummary
包装在另一个组件中即可。
您可以使用以下ExpansionPanelSummary
包装来重现这一点:
const MyCustomSummary = props => {
return (
<ExpansionPanelSummary {...props} expandIcon={<ExpandMoreIcon />}>
<Typography>{props.text}</Typography>
</ExpansionPanelSummary>
);
};
像这样有几个组件组,其中Material-UI父组件查找特定类型的子组件并特别处理该子组件。例如,您可以在ExpansionPanel
中找到以下块
if (isMuiElement(child, ['ExpansionPanelSummary'])) {
summary = React.cloneElement(child, {
disabled,
expanded,
onChange: this.handleChange,
});
return null;
}
幸运的是,Material-UI有一种直截了当的方式告诉它你的自定义组件应该通过muiName
属性被视为与特定的Material-UI组件相同:
MyCustomSummary.muiName = "ExpansionPanelSummary";
或者在你的情况下,它看起来像:
export const ExpansionPanelSummary = styled(props => (
<MUIExpansionPanelSummary
{...props}
/>
))``;
ExpansionPanelSummary.muiName = "ExpansionPanelSummary";