Как изменить цвет значка SVG при выборе в кнопке переключения

#reactjs #svg #material-ui #styled-components #togglebutton

Вопрос:

У меня в моем проекте 4 ButtonGroup из MUI, где у каждого из них есть значок SVG и дочерние элементы в качестве имени кнопки. Хотя фон кнопки и название работают после выбора, но значок SVG остается все время одного и того же цвета. Как заставить это работать, и значок SVG также изменит цвет при выборе?

Ниже приведен пример того, как он построен:

  <StyledToggleButtonGroup
                            color="warning"
                            value={alignment}
                            exclusive
                            onChange={handleAlignment}
                        >
                            <StyledToggleButton
                                aria-label={DetailsTranslation}
                                onClick={() => handleGoToDetails()}
                                value={Routes.TrainsDetails.path}
                                aria-pressed="true"
                            >
                                <StyledDetailsIcon />
                                {DetailsTranslation}
                            </StyledToggleButton>
                            <StyledToggleButton
                                aria-label={LinesTranslation}
                                onClick={() => handleGoToLines()}
                                value={Routes.TrainsDetailsLines.path}
                            >
                                <StyledLinesIcon />
                                {LinesTranslation}
                            </StyledToggleButton>
                            <StyledToggleButton
                                aria-label={WheelsTranslation}
                                onClick={() => handleGoToWheels()}
                                value={Routes.TrainsDetailsWheels.path}
                            >
                                <StyledWheelIcon />
                                {WheelsTranslation}
                            </StyledToggleButton>
                            <StyledToggleButton
                                aria-label={ServiceTranslation}
                                onClick={() => handleGoToService()}
                                value={Routes.TrainsDetailsService.path}
                            >
                                <StyledServiceIcon />
                                {ServiceTranslation}
                            </StyledToggleButton>
                        </StyledToggleButtonGroup>
                    </TrainsDetailsToolbarWrapper>
 

и стили для первой кнопки:

  export const StyledToggleButton = styled(ToggleButton)`
        font-size: 1.6rem;
        font-weight: bold;
        font-family: Poppins;
        margin: 0.5rem;
        padding: 0.5rem 1rem 0.5rem 1.5rem;
        border-radius: 0.4rem;
        border: none;
    `;
    export const StyledDetailsIcon = styled(MenuIcon)`
        margin-right: 1.3rem;
    `;
 

это определение меню, используемых значков

 /// <reference types="react" />
/// <reference types="react-dom" />

declare module '*.svg' {
  import * as React from 'react';

  export const ReactComponent: React.FunctionComponent<
    React.SVGProps<SVGSVGElement> amp; { title?: string }
  >;

  const src: string;
  export default src;
}

declare module '*.bmp' {
  const src: string;
  export default src;
}

declare module '*.gif' {
  const src: string;
  export default src;
}

declare module '*.jpg' {
  const src: string;
  export default src;
}

declare module '*.jpeg' {
  const src: string;
  export default src;
}

declare module '*.png' {
  const src: string;
  export default src;
}

declare module '*.webp' {
  const src: string;
  export default src;
}
 

Ответ №1:

В нем есть selected класс, ToggleButton который можно переопределить с помощью styled, sx prop или с помощью глобального переопределения темы.

 export const StyledToggleButton = styled(ToggleButton)`
  font-size: 1.6rem;
  font-weight: bold;
  font-family: Poppins;
  margin: 0.5rem;
  padding: 0.5rem 1rem 0.5rem 1.5rem;
  border-radius: 0.4rem;
  border: none;
  amp;.Mui-selected .MuiSvgIcon-root {
    color: red;
  }
`;

export const StyledDetailsIcon = styled(MenuIcon)`
  margin-right: 1.3rem;
  color: blue;
`;
 

это класс, который добавляется в ToggleButton, когда я его проверяю
введите описание изображения здесь

Комментарии:

1. к сожалению, не работает

2. не могли бы вы предоставить codesandbox с воспроизведением проблемы, это будет очень полезно

3. Я только что добавил к основному вопросу класс, который добавлен в ToggleButton. Может быть, это поможет

Ответ №2:

Смотрите список состояний компонентов и связанные с ними имена классов здесь.

 const StyledToggleButton = styled(ToggleButton)`
  amp;.Mui-selected {
    color: red;
    background-color: pink;
    /* Put your styles to apply in selected state here */
  }
`;
 

Демонстрация Codesandbox

Комментарии:

1. не работает, я считаю, что когда значок SVG находится внутри, должно быть что-то добавлено

2. @marcinb1986 можете ли вы добавить определение значка в свой вопрос?

3. это определение значка, надеюсь, это то, что вы просите: импортировать {MenuIcon, LinesIcon, WheelIcon, ServisIcon } из ‘@nevomo /shared’; экспортировать const StyledDetailsIcon = styled(MenuIcon)` margin-right: 1.3rem; `;

4. @marcinb1986 Нет, я хочу видеть MenuIcon определение, а не его оболочку.

5. Я отредактировал сообщение, надеюсь, это то, о чем вы спрашиваете