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
);
В дополнение к добавлению <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 frommakeStyles
следуют и выигрывают.5. Имеет смысл, спасибо за ответ!
Ответ №2:
Вы должны добавить !important
в свой стиль, тогда он должен работать
const useStyles = makeStyles((theme) => ({
customHoverFocus: {
"amp;:hover, amp;.MuiIconButton": { background: "yellow !important" }
}
}));
Комментарии:
1. Да, это действительно сработало. Это как новое изменение или что-то в этом роде? потому что раньше он работал без него
2. Импорт в найденном вами решении и в вашем вопросе отличается, вероятно, они имеют разницу в ядре.
3. Я уверен, что это другая версия, потому что я использую последнюю, и этот ответ был немного старше.