У меня есть следующий код для стилизации кнопки на основе поля выбора:
const buttonStyles = {
backgroundColor: buttonStyle === 'Black' ? colors.interactiveForegroundSecondary : buttonStyle === 'Green' ? colors.backgroundInverseSecondary : buttonStyle === 'White' ? colors.backgroundPrimary : buttonStyle === 'Lime Green' ? colors.graphTertiary : '',
color: buttonStyle === 'Black' ? colors.textInversePrimary : buttonStyle === 'Green' ? colors.textInversePrimary : buttonStyle === 'White' ? colors.interactiveForegroundSecondary : buttonStyle === 'Lime Green' ? colors.backgroundInverseSecondary : '',
"&:hover": {
background: buttonStyle === 'Black' ? colors.backgroundInversePrimary : buttonStyle === 'Green' ? colors.accentPrimary : buttonStyle === 'White' ? colors.errorBackground : buttonStyle === 'Lime Green' ? colors.backgroundInverseSecondary : '',
color: buttonStyle === 'Lime Green' ? colors.graphTertiary : ''
},
} as CrateStyleObject
И я пытаюсь преобразовать это в карту Enum в машинописном тексте следующим образом:
enum ButtonBackground {
Black = colors.interactiveForegroundSecondary,
Green = colors.backgroundInverseSecondary,
White = colors.backgroundPrimary,
Lime Green = colors.graphTertiary ,
}
const submitBackground = (Object.keys(ButtonBackground) as (keyof typeof ButtonBackground)[]).map(
(key, index) => {
console.info(key);
return ButtonBackground[key] + index;
},
);
then setting it here on the component:
<Button
style = {
buttonStyles
}
type = "submit">
{text}
</Button/>
Но у меня возникли проблемы с назначением colors.interactiveForegroundSecondary одному из ключей, так как это не строка.
Кроме того, цвет фона и цвет кнопки должны изменяться в зависимости от выбранного значения – нужно ли мне создавать отдельное перечисление для каждого цвета фона/цвета текста, а также цвета фона/текста при наведении?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, что было бы удобно создать отдельный enum для ButtonBackgroundColor, ButtonColor, ButtonBackgroundColorOnHover и ButtonColorOnHover.
Я не уверен, почему вы пытаетесь перебрать перечисление, когда вы действительно хотите установить buttonStyles в соответствии только со значением переменной buttonStyle. Я бы поступил так:
const buttonStyle = 'Lime Green' // For example
// You'll need to remove whitespace because enums cannot have two words
const buttonStyleWithNoWhitespace = buttonStyle.replace(/\s/g, '')
enum ButtonBackground {
Black = colors.interactiveForegroundSecondary,
Green = colors.backgroundInverseSecondary,
White = colors.backgroundPrimary,
LimeGreen = colors.graphTertiary,
}
enum ButtonColor {
Black = colors.backgroundInversePrimary,
Green = colors.accentPrimary,
White = colors.errorBackground,
LimeGreen = colors.backgroundInverseSecondary,
}
enum ButtonBackgroundOnHover {
Black = colors.backgroundInversePrimary,
Green = colors.accentPrimary,
White = colors.errorBackground,
LimeGreen = colors.backgroundInverseSecondary,
}
enum ButtonColorOnHover {
Black = '',
Green = '',
White = '',
LimeGreen = colors.graphTertiary,
}
const buttonStyles = {
backgroundColor: ButtonBackground[buttonStyle as keyof typeof ButtonBackground],
color: ButtonColor[buttonStyle as keyof typeof ButtonColor],
"&:hover": {
background: ButtonBackgroundOnHover[buttonStyle as keyof typeof ButtonBackgroundOnHover],
color: ButtonColorOnHover[buttonStyle as keyof typeof ButtonColorOnHover]
}
} as CreateStyleObject
<Button
style = {buttonStyles}
type = "submit">
{text}
</Button/>
as keyof typeof Enum делает использование перечислений слишком сложным, когда вы можете использовать простой объект для каждого из них, но, возможно, есть другие конкретные причины, которые делают использование перечислений необходимым.