Передача пустых реквизитов изменяет цвет кнопки в группе кнопок

#reactjs #material-ui

Вопрос:

Я использую настроенный IconButton элемент с ButtonGroup помощью .

При передаче пустого реквизита также изменяется цвет и форма наведения элемента. Я хочу знать, почему это произошло? Для меня HOC не должно быть другого эффекта рендеринга при передаче пустой опоры.

Я разместил минимальную среду со страницами GitHub. Этот вопрос показан во второй и третьей главах.

настроенный компонент без передачи quot;{...реквизита}quot;

Использование нового настроенного компонента.

Неправильное поведение: кнопки белые и не в группе. Смотрите выделение при наведении второго и третьего «G», на котором основан компонент IconButton , без передачи {...props} .

настраиваемый компонент с {...реквизитами}.

Использование нового настроенного компонента. Все хорошо.

Компонент также основан на IconButton передаче но {...props} . Хотя реквизит не передается, следовательно, он должен быть пустым(?). Возможно useStyles , изменился цвет, но форма фона при наведении тоже изменилась.

Также я поднял соответствующий вопрос об официальном репо и в своей учебной записке

Ответ №1:

Все наоборот, если вы не передадите реквизит IconButton :

 function IconButtonWrapper(props /* unused props */) {
  return (
    <IconButton>
      <DeleteIcon />
    </IconButton>
  );
}
 

Затем стили не применяются, и IconButton изображение отображается простым белым цветом, поэтому ничего не меняется.

Хотя реквизит не передан

Реквизит передается автоматически из ButtonGroup , даже если вы ничего не передаете. Способ, которым это работает, заключается в том, что ButtonGroup клонирует дочерний компонент и передает им свой собственный набор реквизитов, поэтому, когда вы сами ничего не передаете, как это:

 <ButtonGroup variant="contained">
  <IconButtonWrapper />
  <IconButtonWrapper />
  <IconButtonWrapper />
</ButtonGroup>
 

У дочернего компонента все еще есть реквизиты, предоставленные родителем, вы можете увидеть это, зарегистрировав реквизиты:

 function IconButtonWrapper(props) {
  console.log(props);
  return (
    <IconButton {...props}>
      <DeleteIcon />
    </IconButton>
  );
}
 

Демо-версия Codesandbox

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

1. Это объясняет мой вопрос. Теперь ты ясно дал мне это понять, и я чувствую себя глупо, спрашивая об этом. Может быть, раньше я сам себя сбивал с толку. Может быть, я могу отредактировать вопрос и добавить все связанные с ним вещи сюда?

2. Кроме того, могу ли я связать ваш ответ с моей страницей в песочнице?

3. @Pablion не расстраивайся, никто не знает всего, я тоже знаю об этом только после того, как ты задал этот вопрос. И да, ты можешь.

4. Я на самом деле хочу спросить, должен ли я задать 4 отдельных вопроса? Или я должен задавать все вопросы здесь? Я думаю, что сделать 4 отдельных из них понятнее.

5. @Pablion, задав 4 вопроса в одном посте, вероятно, закроет ваш вопрос по причине «требуется больше ясности», поэтому в большинстве случаев это плохая идея.