我有一个自定义框组件,我希望用户能够通过传递className prop来覆盖默认样式。问题是,基本样式永远不会被覆盖,但基类中尚未存在的样式会应用到组件中。我希望这样的场景,如果基类的背景颜色为“蓝色”,而用户传递的背景颜色为“红色”,用户的值应优先
Box.js
import styles from "./Box.module.css";
const Box = ({ className }) => {
const classnames = [styles.base, className].join(" ").trim();
return <div className={classnames}></div>;
};
export default Box;
Box.module.css
.base {
height: 25rem;
width: 25rem;
background-color: blue;
}
App.js
import styles from "./App.module.css";
import Box from "./components/Box";
function App() {
return (
<div>
<Box className={styles.red} />
</div>
);
}
export default App;
App.module.css
.red {
background-color: red;
}
我注意到在App.js中将样式导入移动到Box导入下面,使得背景总是“红色”。
1条答案
按热度按时间ioekq8ef1#
这是因为CSS文件导入的顺序。以实施例A和实施例B为例:
实施例A:
实施例B:
在示例A中,
.red
类将优先于.base
类,无论className应用于Box
中的div
的顺序如何;实施例B的情况正好相反。为了解决这个问题,像MUI这样的样式库经常使用“样式引擎”,它允许你编写看起来像内联样式的代码,但编译成CSS文件,用户可以选择稍后“注入”,允许他们自己的CSS覆盖库的CSS。你可以尝试寻找其中的一种解决方案,比如emotion,或者,如果这超出了您要查找的范围,您可以:
A)让最终用户在导入自己的CSS之前导入
Box
文件B)让您的最终用户自己导入
Box
的CSS文件,并将其传递给Box
C)让你的最终用户提升他们CSS的特性,降低你自己的特性(可能使用
:where
选择器)