reactjs - React 风格的组件扩展

标签 reactjs styled-components

我正在尝试重用和扩展样式组件,但没有成功。我怀疑我还没有完全掌握如何正确使用 styled-components

我有一个组件,它根据传递给它的 icon 属性来渲染 V 形图标。我想要做的是导出这个组件,然后导入它并扩展它的样式。 ie - 在此示例中删除 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

最佳答案

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 评论中所述

关于reactjs - React 风格的组件扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45349526/

相关文章:

javascript - react 如何识别它是类组件还是功能组件?

javascript - react .js : data not getting populated

javascript - React中如何用hooks实现componentDidMount才能符合EsLint规则 "react-hooks/exhaustive-deps": "warn"?

javascript - 如何在 react , Gatsby 中从子组件内部更改父组件的背景颜色

CSS Grid 生成比现有列更多的列

javascript - 在样式组件中使用状态变量

javascript - recharts 在 MultiBarChart 中沿 Y 轴的每个条形图添加关闭按钮以关闭条形图

reactjs - 为什么我看不到子组件事件处理程序的父状态?

reactjs - 具有样式组件快速刷新的 NextJS 不起作用

javascript - React.js 子组件不更新从 props 派生的样式,为什么? (样式组件)