在样式化组件中共享样式的惯用方式?

idiomatic way to share styles in styled-components?

尝试将一些代码从 jss 移植到样式组件, jss 代码看起来像:

//...
const styles = {
  myStyles: {
    color: 'green'
  }
}

const {classes} = jss.createStyleSheet(styles).attach()

export default function(props) {
  return (
     <div>
       <Widget1 className={classes.myStyles}/>
       <Widget2 className={classes.myStyles}/>
     </div>
  )
}

我的问题是,实现跨多个组件共享相同样式的惯用方法是什么?

您可以共享实际的 CSS 个字符串或共享 styled-components 个组件:

  • 分享 CSS 个字符串:
import {css} from 'styled-components'
const sharedStyle = css`
  color: green
`

// then later

const ComponentOne = styled.div`
  ${sharedStyle}
  /* some non-shared styles */
`
const ComponentTwo = styled.div`
  ${sharedStyle}
  /* some non-shared styles */
`
  • 实际分享 styled-components:
const Shared = styled.div`
  color: green;
`

// ... then later

const ComponentOne = styled(Shared)`
  /* some non-shared styles */
`
const ComponentTwo = styled(Shared)`
  /* some non-shared styles */
`

更新:根据评论中的问题,我创建了一个示例来说明将 props 传递给 styled-components 的 css 函数与将 props 传递给组件本身的方式相同:https://codesandbox.io/s/2488xq91qj?fontsize=14styled-components 的官方建议是始终将要传递给 styled-components 的字符串包装在 css 标记函数中。在此示例中,Test 组件通过嵌入在 cssString 变量中的 passed-in 道具接收背景和前景色,该变量是通过调用 css 函数创建的。

除了已发布的答案之外,您还可以创建一个接受 props / theme 和 returns 和 css`` 的函数。

styled-components 将检查提供的值的类型,例如:${shared},如果它是 function,它将使用相关的 props / [=12 调用它=].

import styled, {css} from 'styled-components';

const shared = ({theme, myProp}) => css`
  color: ${theme.color};
`

/* ------------   */

const Component1 = styled.div`
  ${shared};
  /* more styles ... */
`
const Component2 = styled.div`
  ${shared};
  /* more styles ... */
`