如何使 React CSS 导入组件范围?

IT技术 css reactjs
2021-04-20 01:43:21

我有几个组件具有以下 CSS/组件结构

About/style.css

.AboutContainer {
    # Some style
}

p > code {
    # Some style
}

我在组件中导入 CSS 如下

About/index.js

import './style.css';

export default class About extends Component {
    render() {
         # Return some component
    }
}

但是,CSS 是在该<header>部分中导入的并保持全局范围。

我期待 CSS 是:

  1. 组件范围内的样式仅应用于在此组件中呈现的事物
  2. 如果组件被卸载,此组件的样式将消失。

但是,当从浏览器检查时,样式在该<header>部分指定并应用于所有组件

<header>
   // Stuff
   <style type="text/css">style for component About</style>
   <style type="text/css">style for component B</style>
   <style type="text/css">style for component C</style>
   // Stuff
</header>

如何将 CSS 导入为组件范围?似乎我错误地理解了 React ES6 中的 CSS 导入。

我正在关注本教程


编辑

布雷特的回答是正确的。但是,事实证明我的问题出在其他地方。我使用create-react-app创建了我的应用程序,它基本上简化了执行 React 所需的设置。它包括 WebPack、Babel 和其他入门内容。它使用的默认 WebPack 配置没有设置module选项css-loader因此它默认为false,因此未启用本地范围。

仅作为附加信息,似乎 create-react-app 没有直接的方法来自定义 WebPack 配置,但网络上似乎有许多操作方法。

5个回答

听起来CSS Modules或许多其他 CSS-in-JS 包可以满足您的需求。其他包括Emotion(我目前最喜欢的)、Styled Components这里的许多包

CSS module是一个 CSS 文件,其中默认情况下所有类名和动画名都在本地范围内。所有 URL (url(...)) 和 @imports 都是module请求格式(./xxx 和 ../xxx 表示相对,xxx 和 xxx/yyy 表示在module文件夹中,即在 node_modules 中)。

这是一个快速示例:

假设我们有一个 React 组件,如:

import React from 'react';
import styles from './styles/button.css';

class Button extends React.Component {
  render() {
    return (
      <button className={styles.button}>
        Click Me
      </button>
    );
  }
}
export default Button;

和一些CSS ./styles/button.css

.button {
  border-radius: 3px;
  background-color: green;
  color: white;
}

在 CSS Modules 执行后,生成的 CSS 将类似于:

.button_3GjDE {
  border-radius: 3px;
  background-color: green;
  color: white;
}

其中_3DjDE是随机生成的散列 - 为 CSS 类提供唯一名称。

替代

一个简单的替代方法是避免使用通用选择器(如pcode等),并采用了组件和元件基于类的命名约定。即使是像BEM这样的约定也有助于防止您遇到的冲突。

将此应用于您的示例,您可能会选择:

.aboutContainer {
  # Some style
}

.aboutContainer__code {
  # Some style
}

基本上,您需要设置样式的所有元素都将获得唯一的类名。

也许react-scoped-css会有所帮助。顺便说一句,我是这个库的作者,如果你发现任何问题或只是想改进它,你可以随时提出问题或发送公关。

那很好,但是 sass 呢。
2021-06-13 01:43:21
您实际上可以根据需要添加任何预处理器
2021-06-20 01:43:21
谢谢。它的伟大惊人!
2021-06-21 01:43:21

您可以使用 SASS (.scss) 来模仿作用域 CSS。

假设您只需要在一个组件中使用引导程序(以避免冲突)。将组件包裹起来<div className='use-bootstrap'>,然后创建一个 .scss 文件,如下所示:

.use-bootstrap {   
  // Paste bootstrap.min.css here
}
这对我来说很好。我使用 .use-bulma { @import "bulma"; }
2021-05-27 01:43:21
这并不能解决整个问题——CSS 选择器将被连接起来(如果使用了 sass 嵌套),但是标记呢?内部选择器仍然有不唯一的危险
2021-05-31 01:43:21
这会起作用,但是用于的相关路径@font-face会导致控制台出错...
2021-06-08 01:43:21

因为您提到您使用了create-react-app,所以这里的解决方案很容易更改style.cssstyle.module.css,它看起来像这样:

import styles from "./style.css"
<button className={styles.button}>blabla</button>

关于本文的更多信息:https : //blog.bitsrc.io/how-to-use-sass-and-css-modules-with-create-react-app-83fa8b805e5e

使用此文件命名约定[name].module.css 并查看文档:https : //create-react-app.dev/docs/adding-a-sass-stylesheet

JSX 文件

import React from 'react';
import styles from './index.module.scss';

const MyPage = () => {
    return (
        <div className={styles}>
            <h1>My Page</h1>
        </div>
    );
};

export default MyPage;

样式文件

    h1 {
        color: #f3f3f3;
        font-family: "Cambria";
        font-weight: normal;
        font-size: 2rem;
    }