reactjs – CSS模块组成

前端之家收集整理的这篇文章主要介绍了reactjs – CSS模块组成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个关于作文的问题,我希望有人可以帮助我.
我正在使用带有Sass的react-css-modules,我想知道为我们的一个基本底层组件编写内容的最佳方法.

这是我们的组件:

  1. import React,{PropTypes} from 'react'
  2. import cssModules from 'react-css-modules'
  3. import styles from './style.sass'
  4.  
  5. const Button = ({children = 'Submit',...props}) => {
  6. const align = props.align ? `-${props.align}` : ''
  7. const type = props.type ? `-${props.type}` : ''
  8. const styleName = `button${type}${align}`
  9.  
  10. return (
  11. <button onClick={props.onClick} {...props} styleName={styleName}>
  12. {children}
  13. </button>
  14. )
  15. }
  16.  
  17. Button.propTypes = {
  18. align: PropTypes.string,onClick: PropTypes.func.isrequired,type: PropTypes.string,}
  19.  
  20. export default cssModules(Button,styles)

到目前为止这是样式表:

  1. @import "~components/styles/variables"
  2.  
  3. .button
  4. color: $button-default
  5. background-color: transparent
  6. font-family: $font-family
  7. font-size: $default-font-size
  8. font-weight: $font-regular
  9. line-height: $default-button-height
  10. margin: 0 $pad 0 0
  11. outline: none
  12. padding: 0 $pad*2
  13.  
  14. .left
  15. float: left
  16.  
  17. .right
  18. float: right
  19.  
  20. .primary
  21. color: $background-interaction
  22. background-color: $button-default
  23.  
  24. .button-left
  25. composes: button,left
  26.  
  27. .button-right
  28. composes: button,right
  29.  
  30. .button-primary
  31. composes: button,primary
  32.  
  33. .button-primary-left
  34. composes: button,primary,left
  35.  
  36. .button-primary-right
  37. composes: button,right

现在,这很痛苦.我们添加的每个可配置道具都会以指数方式增加我们必须提供的合成类的数量.我们当前可以配置align和type,因为两者都可以为null,所以我们有6种可能的组合,因此除了base .button之外还要创建5个类.
如果我们只添加一个道具,比如只是一个布尔粗体,我们现在必须添加一大堆新的组合类名:.button-bold,.button-left-bold,.button-right-bold,.button- primary-bold,.button-primary-left-bold,.button-primary-right-bold.

我知道使用react-css-modules,我们可以启用allowMultiple设置,允许我们指定多个模块应用于元素,但我的理解是反对最佳实践.我觉得我们必须在这里遗漏一些东西.我们做错了什么?

解决方法

我想也许这个例子中存在各种各样的问题,这就是为什么它不符合“每个元素一个类”的规则.为每个元素规则强制执行一个类的原因之一是,我们可以轻松地更改元素状态的外观而不实际触及元素. (基本上是CSS本身的承诺,最终实现了.)如果元素上有多个类,则很难在不更改元素的情况下控制外观.如果使用外观(而不是语义)类,则尤其如此.

像“button-primary-left-bold”这样的类具有一些语义含义(“button-primary”),但它也有一些布局含义(“left”)和一些文本外观含义(“bold”). Button组件可能没有业务控制自己的布局.请记住,您也可以编写React组件!所以你可以有更多的东西:

  1. <Left><Button type="primary">Click Me!</Button></Left>

现在,Button组件的CSS模块可以担心按钮的类型. Button组件可以在任何地方使用,可以使用任何布局,而不仅仅是基于浮动的布局.

更好的是,浮动也可以被推入更加语义的组件中.也许是这样的:

  1. <ButtonBar>
  2. <Button>Cancel</Button>
  3. <Button type="primary">Save</Button>
  4. </ButtonBar>

ButtonBar可以有自己的CSS模块来完成布局.之后你可以换掉那个时髦的浮动布局,以获得时髦的flexBox布局.

猜你在找的CSS相关文章