【问题标题】:require css in React component affects other components tooReact 组件中的 require css 也会影响其他组件
【发布时间】:2016-10-25 14:05:08
【问题描述】:

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

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

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

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

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

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

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

div {
    width: 100px;
    height: 30px;
    border: 1px solid red;
}

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

页面中的所有div元素似乎都受到ComponentA所要求的样式的影响。这包括后续组件ComponentBdiv 需要css 样式)以及包含ComponentAComponentBdiv 和另一个div 由 React 添加:

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

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

【问题讨论】:

  • React 以 HTML 格式呈现组件,因此您的 HTML 文件中链接的任何样式表都会影响呈现的组件

标签: css reactjs


【解决方案1】:

CSS 仍然加载到浏览器中以影响整个页面。 css文件的导入只是为了让你的css和你的js一起模块化,这样当你充分利用你的module loader时,你不仅不会加载不必要的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>
    );
}

及其css文件

.component-a div {
    width: 100px;
    height: 30px;
    border: 1px solid red;
}

最好使用 lesssass 等 css 预处理器

.component-a {
    div {
        width: 100px;
        height: 30px;
        border: 1px solid red;
    }
}

额外的:

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

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

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

【讨论】:

  • 如果你最终选择了冗长的类名路线,BEM 是一个很好的方法。我倾向于在它上面使用一个轻微的变体,如果它对应于一个组件,则将块名称大写。例如Component__element--modifier.
  • > "这样当你充分使用你的模块加载器时,你不仅不会加载不必要的 js,也不会加载不必要的 css"。 ¿ 什么时候发生?因为我在未渲染的组件中有 css 导入会影响 被渲染的组件。至少在开发中
  • @Madacol 查找“代码拆分”,仅适用于大型应用
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多