Skip to content

Instantly share code, notes, and snippets.

@kotarella1110
Last active April 27, 2021 16:49
Show Gist options
  • Save kotarella1110/72fd49fa1809e6e0404f5e2ef1f06a62 to your computer and use it in GitHub Desktop.
Save kotarella1110/72fd49fa1809e6e0404f5e2ef1f06a62 to your computer and use it in GitHub Desktop.
Best way to define styled-components

以下のように、component selector パターン を使用することで、 React.Component のインスタンス (A.jsx) などの Styled Component 以外のコンポーネントをセレクターとして指定できる。

A.jsx

class A extends React.Component {
  render() {
    return <div />
  }
}

export default A;

B.jsx

import A from './A';

const StyledA = styled(A)``;

const B = styled.div`
  ${StyledA} {
  }
`

export default B;

ただし、import 元で A コンポーネントを styled() ファクトリー関数で毎度ラップするの冗長な記述である。
そのため、import 先の全てのコンポーネントは React.Component のインスタンスとして export するのではなく、 Styled Component として export する のが Best Way となる。

A.jsx

class A extends React.Component {
  render() {
    return <div className={this.props.className} />
  }
}

export default styled(A)``;

B.jsx

import A from './A';

const B = styled.div`
  ${A} {
  }
`

export default B;
import React from 'react';
import styled from 'styled-components';
const Title = styled.h1`
font-size: 1.5em;
text-align: center;
color: palevioletred;
`;
const Wrapper = styled.section`
padding: 4em;
background: papayawhip;
`;
const Hello = () => (
<Wrapper>
<Title>
Hello World!
</Title>
</Wrapper>
);
export default Hello;
import React from 'react';
import styled from 'styled-components';
const Title = styled.h1`
font-size: 1.5em;
text-align: center;
color: palevioletred;
`;
const Hello = ({ className }) => (
<div className={className}>
<Title>
Hello World!
</Title>
</div>
);
export default styled(Hello)`
padding: 4em;
background: papayawhip;
`;
import * as React from 'react';
import styled from 'styled-components';
const Title = styled.h1`
font-size: 1.5em;
text-align: center;
color: palevioletred;
`;
interface IProps {
className?: 'string';
}
const Hello: React.SFC<IProps> = ({ className }) => (
<div className={className}>
<Title>
Hello World!
</Title>
</div>
);
export default styled(Hello)`
padding: 4em;
background: papayawhip;
`;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment