Предисловие
Я задал похожий вопрос на этот вопрос несколько дней назад, и хотя я считаю, что решение в конечном итоге будет другим, поэтому я спрашиваю снова в другой теме.
CodeSanbox Пример (обновлен для отражения принятого ответа)
Проблема:
Я бы хотел, чтобы любые внешние стили, передаваемые с помощью className
, имели более высокую специфичность, чем мой собственный стиль внутренних компонентов. Таким образом, кто-то может использовать поля и отступы. Однако внутренний стиль по умолчанию для моих компонентов перезаписывает мой внешний стиль, и я бы хотел, чтобы он был наоборот.
Подробности :
Я создаю библиотеку пользовательских компонентов, созданную поверх материала-интерфейса. Я бы хотел, чтобы пользовательские компоненты API были похожи на @material-ui
, чтобы нашим разработчикам было проще их использовать. У каждого компонента, который я создаю, есть свой собственный внутренний стиль, перезаписывающий стили материала-интерфейса по умолчанию, в этом случае он определяется как класс button
. Кроме того, как @material-ui
Я принимаю цветную опору <TestButton color={'default'}/>
. Наконец, я бы хотел, чтобы мою пользовательскую кнопку можно было перезаписать внешними стилями, если когда-либо возникнет такая необходимость. Я использую библиотеку clsx
для создания строк className.
Код:
import React, { useState } from "react";
import { makeStyles } from "@material-ui/styles";
import InputLabel from "@material-ui/core/InputLabel";
import MenuItem from "@material-ui/core/MenuItem";
import FormControl from "@material-ui/core/FormControl";
import { Button } from "@material-ui/core";
import clsx from "clsx";
const useAppStyles = makeStyles({
gButton: { margin: "150px" }
});
export default function App() {
const classes = useAppStyles();
return (
<div className={classes.example}>
<div className={classes.separator}>
<div>Buttons:</div>
<TestButton
className={classes.gButton}
color={"default"}
>
Default
</TestButton>
<TestButton
className={classes.gButton}
color={"primary"}
>
Primary
</TestButton>
</div>
);
}
function TestButton(props) {
const classes = GrangeButtonStyles();
let color = props.color === 'default' ? classes.default : classes.primary
const GrangeButtonStyles = makeStyles({
button: {
height: "45px",
padding: "13px 30px 13px 30px",
borderRadius: "5px",
border: "none",
margin: "15px",
},
default: {
backgroundColor: "black",
border: 'solid #2e7d32 1px',
color: "white",
},
primary: {
backgroundColor: 'white',
color: 'black',
fontFamily: 'Montserrat, sans-serif',
border: 'solid black 1px',
}
});
return (
<Button
className={clsx(classes.button, color, props.className)}
variant="contained"
disabled={props.disabled}
disableElevation
>
{props.children}
</Button>
);
}
ПРИМЕЧАНИЕ:
Я упростил в этом вопросе и в примере с песочницей кода используйте код для большого пространства Пожалуйста, не комментируйте, что вы думаете, что я делаю не имеет смысла из-за примера.