如何扩展样式组件?

Posted

技术标签:

【中文标题】如何扩展样式组件?【英文标题】:How to extend styled components? 【发布时间】:2019-03-28 17:29:45 【问题描述】:

我有一个样式组件:

interface FlexContainerProps 
    children: any;
    className?: string;

    
function FlexContainer(props: FlexContainerProps) 
    const Container = styled.div`
        display: flex;
        flex-direction: column;
        justify-content: flex-start;
    `;
    return (
        <Container className=props.className>
            props.children
        </Container>
    );

当我在组件中使用它时,我希望能够对其进行扩展。

以下不起作用,因为“扩展”类具有较低的特异性(或在代码中稍后):

const FlexContainerExtended = styled(FlexContainer)`
    flex-direction: column-reverse;
`;

以下工作但很hacky:

const FlexContainerExtended = styled(FlexContainer)`
    flex-direction: column-reverse !important;
`;

还有其他方法可以扩展样式组件吗?

【问题讨论】:

【参考方案1】:

你可以这样做:

const FlexContainer = styled.div`
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
`;


const FlexContainerExtended = styled(FlexContainer)`
    flex-direction: column-reverse;
`;

【讨论】:

【参考方案2】:
type FlexContainerProps = 
    className?: string,


const StyledFlexContainer = styled.div<FlexContainerProps>`
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
`

export const FlexContainer: React.FC<FlexContainerProps> = props => 
    return (
        <StyledFlexContainer className=props.className 
            props.children
        </StyledFlexContainer>
    );
    

在其他组件中,您可以像这样扩展您的 FlexContainer:

const FlexContainerExtended = styled.div`
        flex-direction: column-reverse;
    `;


<FlexContainerExtended as=FlexContainer/>

【讨论】:

以上是关于如何扩展样式组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将道具传递给底层 DOM 元素的情况下扩展样式组件?

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

TypeScript:为样式化的组件元素扩展 React 组件道具

如何在扩展组件上覆盖 className?

styled-components:使用额外的样式扩展现有组件

如何使用情感风格扩展风格?