在样式化组件中使用扩展运算符

时间:2018-11-08 14:50:25

标签: react-native styled-components

在React Native中是否可以将Spread运算符与样式化组件一起使用?

我有这个组件:

const StyledHeaderText = styled.Text`
fontFamily: ${props => props.theme.font};
fontSize: ${props => props.theme.fontSizeSubtitle};
color: ${props => (props.lightMode) ? props.theme.fontColor : props.theme.fontPrimaryColor}
`;

但是可以说,在我的主题中,我有一个既具有fontFamily又具有fontSize的对象,并且在整个应用程序中重复使用。我想知道我是否可以做这样的事情,目前它不起作用:

const StyledHeaderText = styled.Text`
...${props => props.theme.fontHeader};
color: ${props => (props.lightMode) ? props.theme.fontColor : props.theme.fontPrimaryColor}
`;

例如,在iOS中设置高程也很有用,因为我必须设置4种样式。

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用css helper function生成特定的CSS,并将其作为模板文字返回。

import styled, {css} from 'styled-components/native'

const GlobalStyles = css`
 fontFamily: ${props => props.theme.font};
 fontSize: ${props => props.theme.fontSizeSubtitle};
`

const StyledHeaderText = styled.Text`
 ${GlobalStyles}
 // Other Styles
`

或有条件地

const StyledHeaderText = styled.Text`
 ${props => props.theme.fontHeader ? GlobalStyles : 'fontSize: 14'}
 // Other Styles
`

答案 1 :(得分:0)

您还可以直接从插值函数返回对象,这些对象将被视为内联样式。

const StyledHeaderText = styled.Text`
      ${props => ({...props.theme.fontHeader})};
      color: ${props => (props.lightMode) ? props.theme.fontColor props.theme.fontPrimaryColor}
`;

const StyledHeaderText = styled.Text`
          ${props => props.theme.fontHeader};
          color: ${props => (props.lightMode) ? props.theme.fontColor props.theme.fontPrimaryColor}
    `;

有关更多详细信息:reference

答案 2 :(得分:0)

要扩展先前的答案,您还可以执行以下操作:

import styled, {css} from 'styled-components/native'

// with theme
const GlobalStyles = css`
 fontFamily: ${ ({theme}) => theme.font };
 fontSize: ${ ({theme}) => theme.fontSizeSubtitle };
`

// Without theme using inherited props
const GlobalStyles = css`
 fontFamily: ${ ({font}) => font };
 fontSize: ${ ({fontSizeSubtitle}) => fontSizeSubtitle };
`

// if you wanted it to be conditional
const GlobalStyles = css`
 fontFamily: ${ ({font}) => font || 'roboto' };
 fontSize: ${ ({fontSizeSubtitle}) => fontSizeSubtitle || '14px' };
`

const StyledHeaderText = styled.Text`
 ${GlobalStyles}
 // Other Styles
`

// same can also be done with regular styled components:
export const HeaderText = styled.p`
 fontSize: ${ ({fontSizeSubtitle}) => fontSizeSubtitle || '14px' };
`
// Useage would be in your component would be like:

import react from react;
import { HeaderText } from '../component/styles'

export const FooComponent = memo(({ destructuredProps }) => {


// some other code

return (

<>
<HeaderText className={fooClass} fontSize='18px'> Here's my sample text! </HeaderText>
<>

)});