首页 文章

反应样式组件扩展

提问于
浏览
5

我正试图重复使用并扩展 styled-component 而没有运气 . 我怀疑我还没有完全掌握如何正确使用 styled-components

我有一个组件,根据传递给它的 icon prop呈现一个V形图标 . 我想要做的是导出此组件,然后导入它并扩展其样式 . 即 - 在此示例中删除 Header.jsx 中的填充:

Chevron.jsx

import React from 'react'
import styled from 'styled-components'

const StyledChevron = styled.i`
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 14px;
    cursor: pointer;
    border-left: 1px solid #efefef;
    transition: all .1s linear;
    transform: rotate(0deg);
    ${props=>props.closed && ``};
    &:hover {
        background: #f7f4f4;
    }
`

const Chevron = (props) => {

    return (
        <StyledChevron closed={props.item.closed} onClick={()=>{props.openSubMenu(props.item.id)}} className={props.icon}/>
    )

}

export default Chevron

Header.jsx

import React from 'react'
import styled from 'styled-components'
import cssvars from '../../js/style/vars'
import Chevron from './Chevron'

const StyledHeader = styled.div`
    display: flex;
    align-items: center;
    padding: 11px;
    justify-content: space-between;
    background: ${cssvars.primaryColor};
    h2 {
        font-size: 19px;
        color: #fff;
        display: flex;
        align-items: center;
    }
`

const BackChevron = Chevron.extend`
    padding: 0
`

const Header = (props) => {

    return (
        <StyledHeader>
            <h2>{props.item.title}</h2>
            <BackChevron {...props} icon="icon-arrow-left"/>
        </StyledHeader>
    )

}

export default Header

使用上面的代码,我得到控制台错误: Uncaught TypeError: _Chevron2.default.extend is not a function

1 回答

  • 1

    styled-components 有某种继承

    Chevron.jsx

    import React from 'react'
    import styled from 'styled-components'
    
    const StyledChevron = styled.i`
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 14px;
        cursor: pointer;
        border-left: 1px solid #efefef;
        transition: all .1s linear;
        transform: rotate(0deg);
        ${props => props.closed && ``};
    
        &:hover {
            background: #f7f4f4;
        }
    `
    
    const Chevron = (props) => (
        <StyledChevron
          closed={props.item.closed}
          onClick={() => props.openSubMenu(props.item.id)}
          className={props.icon}
        />
    )
    
    export default Chevron
    

    Header.jsx

    import React from 'react'
    import styled from 'styled-components'
    import cssvars from '../../js/style/vars'
    import Chevron from './Chevron'
    
    const StyledHeader = styled.div`
        display: flex;
        align-items: center;
        padding: 11px;
        justify-content: space-between;
        background: ${cssvars.primaryColor};
    
        h2 {
            font-size: 19px;
            color: #fff;
            display: flex;
            align-items: center;
        }
    `
    
    const BackChevron = styled(Chevron)`
        padding: 0
    `
    
    const Header = (props) => (
        <StyledHeader>
            <h2>{props.item.title}</h2>
            <BackChevron {...props} icon="icon-arrow-left"/>
        </StyledHeader>
    )
    
    export default Header
    

    正如@ yury-tarabanko评论中所述

相关问题