重复
- 我搜索了现有的问题
最新版本
- 我测试了最新版本
总结 💡
Chip
组件接受一个 color
属性,但它只能引用主题中的颜色:
<Chip label="primary" color="primary" />
可以通过 Package ThemeProvider
提供自定义颜色,例如:
export const ColorChip: React.FunctionComponent<ColorChipProps> = (props) => {
return (
<ThemeProvider
theme={(theme: Theme) =>
createTheme({
...theme,
palette: {
...theme.palette,
primary: {
main: props.color.color,
},
},
})
}
>
<Chip
color="primary"
label={props.color.name}
onClick={() => props.onSelectedChange(!props.isSelected)}
variant={props.isSelected ? 'filled' : 'outlined'}
sx={{
border: props.isSelected ? `1px solid ${props.color.color}` : undefined,
}}
/>
</ThemeProvider>
)
}
这没问题,直到同时更改多个这些芯片时-重新插入 ThemeProvider
组件非常慢(38个芯片需要5秒以上,同时UI冻结)。
另一种方法是覆盖背景颜色,例如:
export const ColorChip: React.FunctionComponent<ColorChipProps> = (props) => {
const styleOverride = props.isSelected ? {backgroundColor: props.color.color} : {}
return (
<Chip
color="primary"
label={props.color.name}
onClick={() => props.onSelectedChange(!props.isSelected)}
variant={props.isSelected ? 'filled' : 'outlined'}
sx={{
border: props.isSelected ? `1px solid ${props.color.color}` : undefined,
}}
style={styleOverride}
/>
)
}
这个选项的问题在于它需要一些关于组件实现的知识-例如,不覆盖主要颜色意味着MUI无法确定是否应该使用深色或浅色文本颜色,悬停效果会失效...
允许直接使用自定义颜色可能不会是组件本身的复杂更改,但可以解决这两个问题。
示例 🌈
可以使用以下方式:
<Chip
color="#123abc"
label='label'
/>
动机 🔦
如上所述,这是为了让组件更具灵活性。
3条答案
按热度按时间zbsbpyhn1#
我可以处理这个问题/改进吗?
k2arahey2#
我不太确定我是否理解了你的问题。根据我的理解,我建议你直接使用
sx
prop 来使用自定义颜色:例如,<Chip sx={{color: "#123abc"}} .../>
。如果这不是你要解决的问题,请提供一个精确重现问题的 CodeSandbox(https://material-ui.com/r/issue-template-latest)。
idv4meu83#
更改颜色会更改文本颜色,但不会改变其他任何东西。在轮廓变体中,这会错过更改边框。在填充中,文本的颜色永远不应该改变,相反,背景应该改变颜色。
以下是填充/轮廓与ThemeProvider/sx颜色的组合:https://codesandbox.io/s/charming-stitch-3fei4w?file=/src/App.tsx
ThemeProvider选项实现了我想要的效果,但正如问题描述中所解释的那样,在显示具有自定义颜色的30多个芯片时,性能非常差。