How to extend styled component without passing props to underlying DOM element?
2020 UPDATE: Use transient props
With the release 5.1.0 you can use transient props. This way you do not need an extra wrapper i.e. unnecessary code is reduced:
Transient props are a new pattern to pass props that are explicitly consumed only by styled components and are not meant to be passed down to deeper component layers. Here's how you use them:
const Comp = styled.div` color: ${props => props.$fg || 'black'};`;render(<Comp $fg="red">I'm red!</Comp>);
Note the dollar sign ($) prefix on the prop; this marks it as transient and styled-components knows not to add it to the rendered DOM element or pass it further down the component hierarchy.
The new answer should be:
styled component:
const ResizableSC = styled(Resizable)``;export const StyledPaneContainer = ResizableSC.extend` flex: 0 0 ${(props) => props.$someProp}px;`;
parent component:
const PaneContainer = ({ children, someProp }) => ( <StyledPaneContainer $someProp={someProp} // '$' signals the transient prop > {children} </StyledPaneContainer>);
As suggested by vdanchenkov on this styled-components github issue you can destructure the props and only pass the relevant ones to Resizable
const ResizableSC = styled(({ someProp, ...rest }) => <Resizable {...rest} />)` flex: 0 0 ${(props) => props.someProp}px;`;
For those (like me) that landed here because of an issue with SC and react-router's Link
.
This is basically the same answer as @tskjetne, but with JS syntax style.
const StyledLink = styled(({ isCurrent, ...rest }) => <Link {...rest} />)( ({ isCurrent }) => ({ borderBottomColor: isCurrent ? 'green' : 'transparent', }),)