如何组织React组件中的样式

#1

看了一篇文章 https://medium.com/@rofrischmann/react-component-styling-without-limitations-84e5e776fd44

对于css的组织,我现在的项目是在代码中引入,使用webpack打包的。从一个组件的角度来看,我都是暴露一个class,然后用css做任意的实现。但有时写内联样式似乎会更好,比如说像一个滚动条组件:

<div className={this.props.className} style={position: relative; overflow:hidden}>
    {this.props.chilren}
    <div className="scrollbar"></div>
</div>

因为我总是希望它拥有 position: relative; overflow:hidden; 这个样式。

不知道大家在项目中是如何组织组件的样式的,另外我在顶上贴的文章中似乎搞的很复杂,大家怎么看?

1 Like
React中对于css的使用
#2

https://medium.com/seek-ui-engineering/the-end-of-global-css-90d2a4a06284
个人觉得 local 的方式更好

2 Likes
#3

local很赞啊,我对css in js无感,主要存在几个问题,无法为同一个属性添加多个值,例如

style = {{
  display: "-webkit-box",
  display: "-moz-box",
  display: "-ms-flexbox",
  display: "-webkit-flex",
  display: "flex",
}}

这种情况,只能引用autoprefixer了。#2020
还有就是animation不好写,css in js的写法一般用setTimeout加transition来处理

#4

@fe 嗯 css in js确实有许多局限,比如伪类什么的,根据 @lobos 贴出来的文章找到一个CSS Modules的概念,主要利用webpack来实现default local scoped css,相比less等预处理工具,不需要name convention来实现模块化的css,是一个不错的解决方案。

现有的方式:

// style.less

@module-prefix foo;

.@{module-prefix}-title {
}

.@{module-prefix}-article {
}

// myglobal.less
.ibox {}
.clearfix {}

不过现有方式也可以曲线救国,而且CSS Module中的Compose功能,预处理器基本都支持,不知道CSS Module的普及前景会怎样。

我是个正准备转职(不务正业)的后端,不知道你们在前段项目中是如何实践的? :smile:

1 Like
#5

:joy: 我自己也是在探索阶段,css-loader的Local scope特性很符合我的口味,准备切过去。

#6

css in js,可以用cssobj, repo地址 https://github.com/cssobj/cssobj

cssobj中的多个值很简单:(配合default-unit插件)

var ret = cssobj({ p: { fontSize:12, display:[ "-webkit-box", "-moz-box", "flex" ] } })

动画也很简单:

setInterval(function(){ ret.obj.p.fontSize++ })

使用CSSOM更新单个属性值,效率很高。