React 组件中的 require css 也会影响其他组件

Mar*_*tus 11 css reactjs

我的render“主要”组件中有以下内容:

import ComponentA from './component-a.js'; 
import ComponentB from './component-b.js'; 
const App = React.createClass({
    render: function() {
        return (
            <div>
                <ComponentA/>
                <ComponentB/>
            </div>
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

ComponentA需要一个css文件。所以我有以下内容component-a.js

require ('./component-a.css');
const ComponentA = React.createClass({
    render: function() {
        return (
            <div>component a</div>
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

......而ComponentB没有。所以我有以下内容component-b.js

const ComponentB = React.createClass({
    render: function() {
        return (
            <div>component b</div>
        );
    }
});
Run Code Online (Sandbox Code Playgroud)

(仅)css所需的文件ComponentA是:

div {
    width: 100px;
    height: 30px;
    border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)

即使它只是ComponentA需要cssComponentB也会受到影响。这是在浏览器中呈现的内容:

在此处输入图片说明

似乎div页面中的所有元素都受到ComponentA. 包括所述div后续组件的ComponentB(它不是所需要的css样式),以及所述div包含ComponentAComponentB和另一个div由阵营加入:

在此处输入图片说明

  1. css文件不是只影响需要它们的组件吗?如果不是,并且它们实际上是全局的,那么css从特定组件中要求文件的语义究竟是什么?

  2. 除了使用内联样式并将所有内容放在 JS 代码中之外,还有没有办法将 CSS 文件分隔开,以便它们只影响需要它们的 React 组件?如果要使用类名来实现这种效果,则不能保证当一个组件与其他组件一起使用时,类名是唯一的。

nar*_*oxx 15

CSS 仍会加载到浏览器中以影响整个页面。css文件的导入只是为了将你的css和js一起模块化,这样当你最大限度地使用你的模块加载器时,不仅不会加载不必要的js,也不会加载不必要的css。

编辑:关于 Instagram 如何处理模块加载的视频:https :
//www.youtube.com/watch?v=VkTCL6Nqm6Y&noredirect=1

您最好的解决方案仍然是命名您的 css。关于冲突问题,您可以使用比我在下面使用的更详细的类名mjb-appname-componentname

让您的 ComonentA 渲染为:

render: function() {
    return (
        <div className="component-a">component a</div>
    );
}
Run Code Online (Sandbox Code Playgroud)

它的css文件是

.component-a div {
    width: 100px;
    height: 30px;
    border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)

最好使用 css 预处理器,如lesssass

.component-a {
    div {
        width: 100px;
        height: 30px;
        border: 1px solid red;
    }
}
Run Code Online (Sandbox Code Playgroud)

额外的:

关于 js 中内联样式的有趣讨论:http : //blog.vjeux.com/2014/javascript/react-css-in-js-nationjs.html

关于使用这种内联样式方法引发的问题的讨论:

https://github.com/callemall/material-ui/issues/4066