зависящий от реквизита переключатель цвета в материале-UI

#javascript #reactjs #material-ui #uiswitch

#javascript #reactjs #материал-пользовательский интерфейс #uiswitch

Вопрос:

Следующий код, адаптированный из Material-UI docs для настройки Switch , позволяет установить цвет переключателя на синий:

 import React from 'react'

import Switch from '@material-ui/core/Switch'
import {withStyles} from '@material-ui/core/styles'


const ColoredSwitch = withStyles({
  switchBase: {
    'amp;$checked': {
      color: 'blue',
    },
  },
  checked: {},
  track: {},
})(Switch)
  

Синий переключатель

Но при попытке адаптировать его так, чтобы цвет можно было задавать свойствами компонента, он просто не работает. Событие следующий код (который является только псевдодинамическим) отображается для переключателя по умолчанию:

 const ColoredSwitch = withStyles({
  switchBase: {
    'amp;$checked': {
      color: props => 'blue',
    },
  },
  checked: {},
  track: {},
})(Switch)
  

Переключатель по умолчанию

Наверное, я делаю что-то не так, но не могу понять, что.

Ответ №1:

Следуйте этому примеру для передачи реквизита, если вы должны использовать withStyles HOC: https://material-ui.com/styles/basics/#adapting-the-higher-order-component-api

 const ColoredSwitch = withStyles({
  switchBase: {
    "amp;.Mui-checked": {
      color: (props) => props.customchecked
    }
  },
  checked: {},
  track: {}
})((props) => {
  const { classes, ...other } = props;
  return <Switch classes={{ switchBase: classes.switchBase }} {...other} />;
});
  

Редактировать демонстрационный материал (разветвленный)


Вы также можете использовать makeStyles

 const useStyles = makeStyles({
  switchBaseChecked: {
    "amp;.Mui-checked": {
      color: (props) => props.color
    }
  }
});

export default function Switches() {
  const props = { color: "green" };
  const classes = useStyles(props);
  return (
    <Switch
      color="primary"
      classes={{
        checked: classes.switchBaseChecked
      }}
    />
  );
}
  

Редактировать демонстрационный материал (разветвленный)

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

1. Спасибо, это решает мою проблему. Есть ли у вас какие-либо объяснения, почему мое решение не сработало? Я не понимаю, почему изменение color: 'blue на color: props => 'blue' нарушает код. Разве это не так, как withStyles обычно работает?

2. Документы, на которые вы ссылались, не содержали никакой информации об адаптации на основе реквизита, поэтому я взглянул на документ, на который я ссылался. Однако основная проблема, по-видимому, связана со ссылкой на имя локального правила checked при использовании реквизита. На самом деле, если вы замените amp;$checked на amp;.Mui-checked в своей реализации, это должно сработать. Я в основном использовал makeStyles для стилизации компонентов (при использовании MUI) — я пропустил свой пример в этом отношении и внес изменения в свой ответ, чтобы продемонстрировать передачу реквизита с использованием makeStyles .