sdabrutas
sdabrutas

Reputation: 1517

Combine multiple styled elements with styled-components

I know that we can extend or add styling to existing components with styled-components like the Link component of react-router-dom. The said feature is indicated here. But, my problem is, how can I combine two or more existing components then add some more styles?

In my case, I have a reusable component for text elements like span, p and a with standard font-size, font-weight, etc. At the same time, I want to use the react-router-dom's Link component. Currently, I have something like this:

import styled from 'styled-components';
import { Link } from 'react-router-dom';
import { TextElement } from '../common';

/*
Can I do something like this?
const MyLink = styled(Link, TextElement)`
    margin: 10px 0;
`;

or this?
const MyLink = styled([Link, TextElement])`
    margin: 10px 0;
`;
*/

const MyPage = props => (
   <>
       <MyLink to="/next-page" />
   </>
);

Any suggestion would be appreciated.

EDIT

My TextElement component is just something like this:

const Element = styled.span`
   font-size: 13px;
   font-weight: 500;
`;

// These styles are sample only. Actual styles depend on a "variant" prop.
// I did not show it here since it doesn't have to do with the question I'm asking.

export default ({ tag }) => (<Element as={tag} />);

Upvotes: 17

Views: 22944

Answers (2)

Vishnu
Vishnu

Reputation: 1701

You can use mixin for this using css helper. Let's say you put the code for TextElement in a spaced mixin like:

import { css } from 'styled-components';

const spaced = css`
  margin: 10px 0;
`;

And another mixin for Link

const styledLink = css`
  color: blue;
`;

Then you can define your MyLink as:

import styled from 'styled-components'

const MyLink = styled(Link)`
  ${spaced}
  ${styledLink}
`;

Upvotes: 30

Nico Diz
Nico Diz

Reputation: 1504

The style component could be the wrapper of your custom component. For example:

Your style component:

export const CustomSpanWrapper = styled.div`
    span {
        ...your-styles
    }
`;

Your other component:

<CustomSpanWrapper>
    <CustomSpan>
</CustomSpanWrapper>

Upvotes: -1

Related Questions