Material UI StepIcon 具有实际图标但保留背景圆圈
Material UI StepIcon to have actual icon but keep background circle
我已经尝试搜索堆栈溢出,但没有找到与此尝试相关的具体问题。我正在使用样式化的方式来设置 Material UI Stepper 组件的样式。我看到的所有示例都使用 withStyles、makeStyles,除了用于更改颜色的样式。但是,我也想在下面的步骤标签中有一个真正的图标,而不是文本。
每次我将图标组件添加到图标属性时,它只会显示图标并删除通常包含文本的圆圈。我想保留圆圈并添加图标以及在顶部添加文本。 active/completed 是金色,disabled/inactive 是灰色。
这是我的编码尝试,我尝试了各种组合,将演示中的示例粘贴在 Material UI 网站上,但仍然没有太多运气让图标显示在圆圈内.我是否需要放弃 StepIcon 组件并将图标包装在 Avatar 组件或其他组件中?
const TimelineIcon = styled(StepIcon)(({ theme }) => ({
root: {
color: theme.palette.primary.light,
display: "flex",
height: 22,
alignItems: "center",
"&$active": {
color: theme.palette.success.main,
},
"&$completed": {
backgroundColor: theme.palette.primary.light,
color: theme.palette.success.main,
zIndex: 1,
fontSize: 18,
},
},
}));
const stepIconComponent = () => {
return (
<div>
<TimelineIcon icon={<Check />} />
</div>
);
};
<Stepper
orientation={"horizontal"}
alternativeLabel
style={{ width: "100%" }}
>
{stepper.steps.map((step: TimelineStepProps) => {
return (
<Step key={step.title}>
<StepLabel StepIconComponent={stepIconComponent}>
{step.title}
</StepLabel>
</Step>
);
})}
</Stepper>
由于 StepIcon 的设计,如果传递的是实际图标而不是文本或数字,则它不适用 类。这会强制它只显示图标而不是圆圈背景。这是组件:implementation of StepIcon
仅当“图标”是数字或字符串时强制应用 StepIcon 类 的代码是这样的:
if (typeof icon === 'number' || typeof icon === 'string') {
const className = clsx(classes.root, {
[classes.active]: active,
[classes.error]: error,
[classes.completed]: completed,
});
所以我要做的就是重新创建带有圆圈的图标,并为激活或禁用提供两种不同的外观。如果顶部有文本(在示例中圆圈上方的数字)或没有文本(因为在这种情况下可能是可选的),我还必须设置连接器的样式以将其向下推一点
const ActiveSvgIcon = styled(SvgIcon)(({ theme }) => ({
color: theme.palette.success.main,
"&.MuiSvgIcon-root": {
width: "1.2em",
height: "1.2em",
},
}));
const DisabledSvgIcon = styled(SvgIcon)(({ theme }) => ({
color: theme.palette.primary.light,
"&.MuiSvgIcon-root": {
width: "1.2em",
height: "1.2em",
},
}));
const getIcon = (step: TimelineStepProps) => {
return step.active ? (
<ActiveSvgIcon shapeRendering="circle">
<circle cx="12" cy="12" r="12" />
{step.icon}
</ActiveSvgIcon>
) : (
<DisabledSvgIcon shapeRendering="circle">
<circle cx="12" cy="12" r="12" />
{step.icon}
</DisabledSvgIcon>
);
};
const iconStepComponent = (step: TimelineStepProps) => {
return (
<div style={{ marginTop: step.superScript === "" ? "20px" : 0 }}>
<StepperText>{step.superScript}</StepperText>
{getIcon(step)}
<StepperTitle>{step.title}</StepperTitle>
<StepperText>{step.subTitle}</StepperText>
</div>
);
};
我已经尝试搜索堆栈溢出,但没有找到与此尝试相关的具体问题。我正在使用样式化的方式来设置 Material UI Stepper 组件的样式。我看到的所有示例都使用 withStyles、makeStyles,除了用于更改颜色的样式。但是,我也想在下面的步骤标签中有一个真正的图标,而不是文本。
每次我将图标组件添加到图标属性时,它只会显示图标并删除通常包含文本的圆圈。我想保留圆圈并添加图标以及在顶部添加文本。 active/completed 是金色,disabled/inactive 是灰色。
这是我的编码尝试,我尝试了各种组合,将演示中的示例粘贴在 Material UI 网站上,但仍然没有太多运气让图标显示在圆圈内.我是否需要放弃 StepIcon 组件并将图标包装在 Avatar 组件或其他组件中?
const TimelineIcon = styled(StepIcon)(({ theme }) => ({
root: {
color: theme.palette.primary.light,
display: "flex",
height: 22,
alignItems: "center",
"&$active": {
color: theme.palette.success.main,
},
"&$completed": {
backgroundColor: theme.palette.primary.light,
color: theme.palette.success.main,
zIndex: 1,
fontSize: 18,
},
},
}));
const stepIconComponent = () => {
return (
<div>
<TimelineIcon icon={<Check />} />
</div>
);
};
<Stepper
orientation={"horizontal"}
alternativeLabel
style={{ width: "100%" }}
>
{stepper.steps.map((step: TimelineStepProps) => {
return (
<Step key={step.title}>
<StepLabel StepIconComponent={stepIconComponent}>
{step.title}
</StepLabel>
</Step>
);
})}
</Stepper>
由于 StepIcon 的设计,如果传递的是实际图标而不是文本或数字,则它不适用 类。这会强制它只显示图标而不是圆圈背景。这是组件:implementation of StepIcon
仅当“图标”是数字或字符串时强制应用 StepIcon 类 的代码是这样的:
if (typeof icon === 'number' || typeof icon === 'string') {
const className = clsx(classes.root, {
[classes.active]: active,
[classes.error]: error,
[classes.completed]: completed,
});
所以我要做的就是重新创建带有圆圈的图标,并为激活或禁用提供两种不同的外观。如果顶部有文本(在示例中圆圈上方的数字)或没有文本(因为在这种情况下可能是可选的),我还必须设置连接器的样式以将其向下推一点
const ActiveSvgIcon = styled(SvgIcon)(({ theme }) => ({
color: theme.palette.success.main,
"&.MuiSvgIcon-root": {
width: "1.2em",
height: "1.2em",
},
}));
const DisabledSvgIcon = styled(SvgIcon)(({ theme }) => ({
color: theme.palette.primary.light,
"&.MuiSvgIcon-root": {
width: "1.2em",
height: "1.2em",
},
}));
const getIcon = (step: TimelineStepProps) => {
return step.active ? (
<ActiveSvgIcon shapeRendering="circle">
<circle cx="12" cy="12" r="12" />
{step.icon}
</ActiveSvgIcon>
) : (
<DisabledSvgIcon shapeRendering="circle">
<circle cx="12" cy="12" r="12" />
{step.icon}
</DisabledSvgIcon>
);
};
const iconStepComponent = (step: TimelineStepProps) => {
return (
<div style={{ marginTop: step.superScript === "" ? "20px" : 0 }}>
<StepperText>{step.superScript}</StepperText>
{getIcon(step)}
<StepperTitle>{step.title}</StepperTitle>
<StepperText>{step.subTitle}</StepperText>
</div>
);
};