隔离反应中每种成分的css

时间:2018-01-22 09:39:05

标签: css reactjs sass create-react-app stylus

我在create-react-app上构建我的react应用程序。我希望每个组件都有本地css。我正在计划使用css模块但这些是问题

如果我使用css模块

  • 我必须运行eject命令
  • 我可以使用css模块和scss文件吗?我像这样嵌入了scss

这是我的scss文件之一

$scalel: 1.7vmin;
.navbar-side {
  position: absolute;
  background: rgba(255,255,255,0.15);
  width: 17 * $scalel;
  top: 6.2 * $scalel;
  padding-bottom: 2 * $scalel;
  .tessact-logo {
    width: 50%;
    height: 12 * $scalel;
    background: url('/public/images/logo.png');
    background-repeat: no-repeat;
    background-position: center center;
    background-size: contain;
    margin-left: 25%;
  }
  .navbar-item {
    padding: 0.8 * $scalel;
    transition: all 0.2s ease;
    cursor: pointer;
    padding-left: 3 * $scalel;
    &:hover {
      background: rgba(255,255,255,0.15);
    }
    &.active {
      background: rgba(255,255,255,0.25);
    }
    .navbar-item-inside {
      display: none;
    }
  }
}

*How can use classname={style.navbar-item}? key is navbar-item is in nest.*

另外如果我不想使用css模块,有什么办法吗?在其中一个项目中,我看到有人像这样隔离了css

import c from './Reviews.styl'

<div className={c.container}>
                <ReviewSearch
                    assignIsOpen={this.state.assignIsOpen}
                    toggleAssign={this.toggleAssign}
                    selectedRows={this.props.selectedRows}
                    onSubmitProcess={this.onSubmitProcess}/>
                <ReviewTable
                    isLoading={this.props.isLoading}
                    items={this.props.list}
                    selectedRows={this.props.selectedRows}
                    onRowSelection={this.onRowSelection}
                    authToken={this.props.auth_token}
                    setCurrentItem={this.setCurrentItem}/>
            </div>

样式文件是

:local(.container)
    display block
    width 100%

.control-container
    display flex
    align-items center

    .control-label
        width 120px
    .control
        flex 1

    & + .control-container
        margin-top 30px

使用styl文件而不是css。我喜欢这种方式,因为在这里不需要在所有子div中使用style.classname。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

自提出此问题以来,发生了很多变化。自react-scripts@2.0.0起,Create React App已有一段时间支持开箱即用的 css模块 scss ,而不会弹出。

https://create-react-app.dev/docs/adding-a-css-modules-stylesheet

您要做的就是将任何文件从somestyle.css重命名为somestyle.module.css,现在它将像一个CSS模块一样。

您可以通过将someStyle.scss重命名为somestyle.module.scss来以相同的方式使用scss

答案 1 :(得分:1)

我建议使用classnames。它是一个库,您可以通过它从css文件将css导入到组件中,然后像下面一样使用它:

import styles from './your.css'
import cn from 'classnames/bind'
const cx  = cn.bind(styles)


<div className={cx('myDiv')}/>

答案 2 :(得分:0)

对CSS模块的支持一直在制作create-react-app,它应该在2.0 beta(https://github.com/facebookincubator/create-react-app/issues/3815