IconButton из MUI больше не меняет цвет при наведении с помощью makeStyles?

reactjs #material-ui

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

Вопрос:

Привет, я искал способ изменить цвет при наведении с помощью IconButton, однако решение-песочница, которое я нашел, похоже, больше не работает

Это то, что у меня есть код-песочница

Ответ №1:

Из https://mui.com/guides/migration-v4/#style-library:

Библиотека стилей, используемая по умолчанию в v5, — это emotion . При переходе с JSS на emotion, и если вы используете переопределения стиля JSS для своих компонентов (например, переопределения, созданные makeStyles), вам нужно будет позаботиться о порядке внедрения CSS. Для этого вам необходимо иметь StyledEngineProvider с опцией injectFirst в верхней части дерева компонентов.

Если я изменю ваш index.js в соответствии со следующим, стиль переопределяет работу:

 import { StyledEngineProvider } from "@mui/material/styles";
import ReactDOM from "react-dom";

import App from "./App";

const rootElement = document.getElementById("root");
ReactDOM.render(
  <StyledEngineProvider injectFirst>
    <App />
  </StyledEngineProvider>,
  rootElement
);
 

Редактировать с помощью JSS в версии 5

В дополнение к добавлению <StyledEngineProvider injectFirst> , я также удалил StrictMode , поскольку makeStyles не поддерживает его — стили, созданные с помощью makeStyles , не будут надежно поддерживаться в DOM в строгом режиме.

Поскольку вы используете v5, лучшим вариантом было бы полностью избежать makeStyles (который устарел в v5) и использовать styled вместо этого. Тогда вам не нужно index.js изменяется и может сохранять строгий режим.

 import React from "react";
import { styled } from "@mui/material/styles";
import IconButton from "@mui/material/IconButton";

const StyledIconButton = styled(IconButton)(`
  amp;:hover, amp;.Mui-focusVisible {
    background-color: yellow;
  }
`);
 

Редактировать переопределить стили значков кнопок

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

1. О, интересно, похоже, это «правильный» способ сделать это. Вопрос, неправильно ли тогда просто упростить его и добавить !важно в переопределяемый стиль? В чем разница между этим и !важно ?

2. @ReactPotato «Правильный» способ сделать это — makeStyles полностью избежать. Я добавил пример использования styled .

3. Да, я видел это, я собираюсь использовать это вместо этого. Но хотел бы знать, какой вред заключается в использовании одного против другого, если это имеет смысл.

4. Это почти всегда плохая идея (и ненужная) для использования !important . После добавления !important эти стили могут быть переопределены только стилями, которые также используются !important . Когда переопределения не работают без !important , это обычно происходит из-за недостаточной специфичности CSS . Когда специфика стилей в остальном одинакова, порядок, в котором отображаются их объявления, определяет, какие стили выигрывают — таким образом, использование injectFirst стилей эмоций приводит к тому, что стили JSS from makeStyles следуют и выигрывают.

5. Имеет смысл, спасибо за ответ!

Ответ №2:

Вы должны добавить !important в свой стиль, тогда он должен работать

 const useStyles = makeStyles((theme) => ({
  customHoverFocus: {
    "amp;:hover, amp;.MuiIconButton": { background: "yellow !important" }
  }
}));
 

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

1. Да, это действительно сработало. Это как новое изменение или что-то в этом роде? потому что раньше он работал без него

2. Импорт в найденном вами решении и в вашем вопросе отличается, вероятно, они имеют разницу в ядре.

3. Я уверен, что это другая версия, потому что я использую последнюю, и этот ответ был немного старше.