css - 使用 Styled Components 将多个样式属性添加到单个主题属性

标签 css reactjs react-native styled-components

我正在使用 styled components对于一个新元素,并希望使用库的主题功能。我正在努力弄清楚是否有向一个对象添加多个样式属性的好的或最佳实践方法(即创建一种继承)。想要的是:

// in the theme, define a group of styles for a given component
// e.g. all fonts have a font-family, weight, size, etc
const theme = {
  fonts: {
    font-family: ...,
    font-weight: ...,
    font-size: ...,
  }
}

// then in my styled component,
// define the multi-line theme, along with component specific styles
// or even override the theme styles
const Header = styled.span`
  ${props => props.theme.fonts};
  text-decoration: underline;
  ...
`;

现在,我很清楚您需要将主题属性传递给组件上的每个样式。是否有一种模式可以帮助减少我在上面的示例中看到的一些重复代码?

最佳答案

我通常做的是在单独的文件中定义主题样式,例如

  • 我的组件
    • index.js
    • styles.js//<-- 组件的自定义样式
  • 主题
    • spacing.js//<-- 所有组件的通用样式
    • colors.js
    • fonts.js

spacing.js 里面我会有这样的东西:

const verticalPaddingSmall = {
  paddingTop: 5,
  paddingBottom: 5,
};

const verticalPaddingMedium = {
  paddingTop: 10,
  paddingBottom: 10,
};

export default function spacing(size, direction, isPadding) {
  // some logic to return the correct object based on the params,
  // screen size (tablets vs phones), etc...
  return verticalPaddingSmall;
}

显然,该代码是根据我为不同屏幕尺寸等定义的一些配置自动生成的,但最终结果与此类似。

然后在我的自定义组件中导入常用样式,将它们应用于样式并在需要时覆盖它,在 styles.js 上是这样的:

import spacing from 'themes/spacing';
import fonts from 'themes/fonts';

const verticalPaddingSmall = StyleSheet.create({
  main: {
    ...spacing('small', 'vertical', true),
  },
  title: {
    ...spacing('xsmall', 'horizontal', false),
    ...fonts.title,
    fontSize: 25, //<--- overwrite default values from title
  },
});

我很少覆盖组件上的样式,因为我的常用样式处理表格和手机的不同样式,有点像网络上的媒体查询。

关于css - 使用 Styled Components 将多个样式属性添加到单个主题属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43252766/

相关文章:

html - 打印模式仍然显示 'hidden' 内容

javascript - 为什么我的CSS属性位置粘性不起作用?

reactjs - Chrome 上的 BetterJsPop 错误是什么?

javascript - React native paper TextInput in Modal,输入一个字符后光标向后闪烁

javascript - 使用 async/await 可能出现未处理的 Promise 拒绝

react-native - 防止 Chrome 调试器窃取 React Native 中的焦点

html - 如何向下添加元素以便能够滚动?

html - CSS3 Transition 不影响其他元素?

javascript - 尽管使用setState(),但是状态更改后,React组件不会重新呈现

javascript - 我可以使用我自己的登录表单进行 aws cognito 吗?