How to make React CSS import component-scoped?

后端 未结 4 432
粉色の甜心
粉色の甜心 2020-11-30 03:37

I have several components which have the following CSS/component structure

About/style.css

.AboutContainer {
    # Some style
}

p >          


        
4条回答
  •  夕颜
    夕颜 (楼主)
    2020-11-30 04:32

    It sounds like CSS Modules, or many of the other CSS-in-JS packages, does what you want. Others include Emotion (my current favorite), Styled Components, or many of the packages here.

    A CSS Module is a CSS file in which all class names and animation names are scoped locally by default. All URLs (url(...)) and @imports are in module request format (./xxx and ../xxx means relative, xxx and xxx/yyy means in modules folder, i. e. in node_modules).

    Here's a quick example:

    Let's say we have a React component like:

    import React from 'react';
    import styles from './styles/button.css';
    
    class Button extends React.Component {
      render() {
        return (
          
        );
      }
    }
    export default Button;
    

    and some CSS in ./styles/button.css of:

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

    After CSS Modules performs it's magic the generated CSS will be something like:

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

    where the _3DjDE is a randomly generated hash - giving the CSS class a unique name.

    An Alternative

    A simpler alternative would be to avoid using generic selectors (like p, code, etc) and adopt a class-based naming convention for components and elements. Even a convention like BEM would help in preventing the conflicts you're encountering.

    Applying this to your example, you might go with:

    .aboutContainer {
      # Some style
    }
    
    .aboutContainer__code {
      # Some style
    }
    

    Essentially all elements you need to style would receive a unique classname.

提交回复
热议问题