reactjs 在React中通过ClassName Prop扩展样式

u7up0aaq  于 2023-04-11  发布在  React
关注(0)|答案(1)|浏览(126)

我有一个自定义框组件,我希望用户能够通过传递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导入下面,使得背景总是“红色”。

ioekq8ef

ioekq8ef1#

这是因为CSS文件导入的顺序。以实施例A和实施例B为例:
实施例A:

.base {
  background-color: blue;
}

.red {
  background-color: red;
}

实施例B:

.red {
  background-color: red;
}

.base {
  background-color: blue;
}

在示例A中,.red类将优先于.base类,无论className应用于Box中的div的顺序如何;实施例B的情况正好相反。
为了解决这个问题,像MUI这样的样式库经常使用“样式引擎”,它允许你编写看起来像内联样式的代码,但编译成CSS文件,用户可以选择稍后“注入”,允许他们自己的CSS覆盖库的CSS。你可以尝试寻找其中的一种解决方案,比如emotion,或者,如果这超出了您要查找的范围,您可以:
A)让最终用户在导入自己的CSS之前导入Box文件
B)让您的最终用户自己导入Box的CSS文件,并将其传递给Box
C)让你的最终用户提升他们CSS的特性,降低你自己的特性(可能使用:where选择器)

相关问题