Add styled components - team-wedev/wedev GitHub Wiki

Theming

styled-components๋Š” wrapper component์ธ <ThemeProvider>๋ฅผ export ํ•จ์œผ๋กœ์จ full theming ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ ํ”„๋กœ๋ฐ”์ด๋”๋Š” ์ปจํ…์ŠคํŠธ API๋ฅผ ํ†ตํ•ด ์ž์‹ ์˜ ์•„๋ž˜์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ์— ํ…Œ๋งˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋” ํŠธ๋ฆฌ์—์„œ ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ๊นŠ์ด๊ฐ€ ์—ฌ๋Ÿฌ ์ˆ˜์ค€์ธ ๊ฒฝ์šฐ์—๋„ ์ œ๊ณต๋œ ํ…Œ๋งˆ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Note: <ThemeProvider> returns its children when rendering, so it must only wrap a single child node as it may be used as the root of the render() method.

Function themes

theme prop์œผ๋กœ ํ•จ์ˆ˜ ๋˜ํ•œ ๋„˜๊ฒจ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ…Œ๋งˆ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ถ€๋ชจ ํ…Œ๋งˆ๋Š” ํŠธ๋ฆฌ ์ƒ์œ„์— ์žˆ๋Š” <ThemeProvider>๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

// Define our button, but with the use of props.theme this time
const Button = styled.button`
  color: ${props => props.theme.fg};
  border: 2px solid ${props => props.theme.fg};
  background: ${props => props.theme.bg};
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border-radius: 3px;
`;
// Define our `fg` and `bg` on the theme
const theme = {
  fg: "palevioletred",
  bg: "white"
};
// This theme swaps `fg` and `bg`
const invertTheme = ({ fg, bg }) => ({
  fg: bg,
  bg: fg
});
render(
  <ThemeProvider theme={theme}>
    <div>
      <Button>Default Theme</Button>
      <ThemeProvider theme={invertTheme}>
        <Button>Inverted Theme</Button>
      </ThemeProvider>
    </div>
  </ThemeProvider>
);

Server Side Rendering

Basic API

import { renderToString } from "react-dom/server";
import { ServerStyleSheet } from "styled-components";

const sheet = new ServerStyleSheet();
try {
  const html = renderToString(sheet.collectStyles(<YourApp />));
  const styleTags = sheet.getStyleTags(); // or sheet.getStyleElement();
} catch (error) {
  // handle error
  console.error(error);
} finally {
  sheet.seal();
}

collectStyles ๋Š” ์‚ฌ์šฉ์ž์˜ element๋ฅผ provider ๋‚ด๋ถ€๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

import { renderToString } from "react-dom/server";
import { ServerStyleSheet, StyleSheetManager } from "styled-components";

const sheet = new ServerStyleSheet();
try {
  const html = renderToString(
    <StyleSheetManager sheet={sheet.instance}>
      <YourApp />
    </StyleSheetManager>
  );
  const styleTags = sheet.getStyleTags(); // or sheet.getStyleElement();
} catch (error) {
  // handle error
  console.error(error);
} finally {
  sheet.seal();
}

ํ”„๋กœ์ ํŠธ์— ์ ์šฉ

import App from "next/app";
import React from "react";
import { ThemeProvider } from "styled-components";

const theme = {
  colors: {
    primary: "red"
  }
};

export default class MyApp extends App {
  render() {
    const { Component, pageProps } = this.props;
    return (
      <ThemeProvider theme={theme}>
        <Component {...pageProps} />
      </ThemeProvider>
    );
  }
}
  • _document.js
import Document, { Html, Head, Main, NextScript } from "next/document";
import { ServerStyleSheet as StyledComponentsSheet } from "styled-components";
import { ServerStyleSheets as MaterialSheet } from "@material-ui/styles";
import CssBaseline from "@material-ui/core/CssBaseline";

export default class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const styledComponentsSheet = new StyledComponentsSheet();
    const materialSheet = new MaterialSheet();
    const originalRenderPage = ctx.renderPage;

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: App => props =>
            materialSheet.collect(
              styledComponentsSheet.collectStyles(
                <>
                  <CssBaseline />
                  <App {...props} />
                </>
              )
            )
        });

      const initialProps = await Document.getInitialProps(ctx);
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {materialSheet.getStyleElement()}
            {styledComponentsSheet.getStyleElement()}
          </>
        )
      };
    } finally {
      styledComponentsSheet.seal();
    }
  }
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ