styled-components使用心得:避免过度组件化

本文转载自我的个人博客

前几天看见一位老哥在网上发了帖子抱怨说styled-component不好用,并列出了四条原因。但是我发现他所谓的不好用其实是对styled-component的使用方法了解得不够全面,从而犯的一个错误:过度组件化。

何为过度组件化?我们先看一下这位老哥的代码:

  render() {
    return (
        <HeaderWrap>
            <HeaderContainer>
                <LogoArea>
                    <h1>Mask的弹幕网站</h1>
                    <p style={{fontSize:30+"px",marginTop:10+"px"}}><LogoArrow></LogoArrow>记录生活,不忘初心</p>
                </LogoArea>
                <LoginPanel>
                    <p onclick={this.showLoginBox}>登录</p>
                    <p onclick={this.showRegisterBox}>注册</p>
                </LoginPanel>
                <UserPanel>
                    <UserFigure>
                        <p><UserIcon src={this.props.userIconUrl} alt="user-figure"/></p>
                        <p>{this.props.userName}</p>
                    </UserFigure>
                    <UserMenu>
                        <UserOption>投稿</UserOption>
                        <UserOption>空间</UserOption>
                        <UserOption>注销</UserOption>
                    </UserMenu>
                </UserPanel>
            </HeaderContainer>
        </HeaderWrap>
    );
  }

在上面这段代码中,几乎每一个HTML标签都被这位老哥写成一个组件。

然后看看他觉得styled-component不好用的四条原因:

  1. 有些组件所对应的样式可能就一两条,也要调用构造函数创建对象,这样很浪费资源,工作量也上升了。
  2. styled-components 写完之后你不知道 html 元素是啥,即语义化很差。
  3. 在 js 里写 css 没有自动补全,写得累。
  4. styled-components 生成的 html 可读性很差 (因为由 styled-component 定义的组件在生成 html 文档时会随机绑定一个 class 名称,而这个随机生成的名称不具有可读性)。

我先回答第三条,在js里写css是有自动补全的哈,很多编辑软件都有styled-component相关的插件,可以帮助你在js的环境里补全css语句。比如在VSCode中这个插件叫vscode-styled-components

然后再来回答一、二、四条。其实这三个抱怨都源于同一个原因,那就是styled-component的过度组件化。
我相信这位老哥使用styled-component的原因是想通过它对样式进行组件化,避免像传统css那样的全局污染。但是像上面那段代码,我们需要复用的组件是<Hearder>,那么我们只需要将<Hearder>组件里最外围的一个html标签用styled-component定义为一个样式组件可以了。以上面那段代码为例,我们只需要生成<HeaderWrap>这一个样式组件足矣,至于这个样式组件里面的其余标签,我们就直接用原生的html标签就好了。<HeaderWrap>组件里面的html标签的样式,我们就可以直接通过标签名和class来控制,就像正常写css那样,只不过在styled-component中语法稍稍有点区别。

这里先举一个小例子:

  const Wrapper = styled.div`
    /* 将Wrapper组件里的color设置为白色 */
    padding-left: 50px;  
    background: black;
    color: white;

    /* 将Wrapper组件里的h3标签的color设置为红色 */
    h3 {
    color: red
    }
    /* 将Wrapper组件里的className为black的标签的color设置为黄色 */
    .yellow {
    color: yellow
    }
  `

  render(
    <Wrapper>
      <p>白色 p 标签 </p>
      <h3>红色 h3 标签</h3> 
      <p className="yellow" >黄色 p 标签</p>
    </Wrapper>
  )

渲染结果如下:


styled-components-1-1.jpg

关于styled-component更详细的用法请移步我的另一片文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容