Styled Components

Doyoon Lee·2020년 9월 6일
0
// styled-components 라이브러리에서 import 해온 styled라는 객체를 이용합니다
// 아래와 같이 h1 태그를 만들어 Title이라는 스타일드 컴포넌트를 만들 수 있습니다

import styled from 'styled-components'

render(
  <Wrapper>
    <Title>
      Hello World!
    </Title>
  </Wrapper>
);

// html 태그 이름 뒤 Tagged Templete 문법을 활용해 CSS 속성을 정의하고 있습니다
// 앞서 학습했던 Templete Literals 문법(``)의 확장이라고 생각해도 좋습니다 ([링크](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals))

const Wrapper = styled.section`
  padding: 4em;
  background: papayawhip;
`;

const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: palevioletred;
`;

함수형 컴포넌트로 한 덩어리의 컴포넌트로 만들어서 넣듯이 똑같이 밑에서 스타일컴포넌트로 정의해주고 위에서 쓰는것.

<Button primary width="100"> Primary Button </Button>
<Button> Normal </Button>

const Button = styled.button`
background: ${(props)  (props.width <200 ? "white" : "black"")};
color: ${(props) => (props.primary ? "white" : "violet")}; 
`

props 를 내려줄 때 styled Component 에다가 달아줘야한다. 그 안에 있는 일반 html 태그에 붙이면 안됨!

<Container prop={1} /> 
	<div> this is title </div>
</Container>

GlobalStyles.js

import { css } from "styled-components";

export const MoveCenter = css`
  display: flex;
  align-items: center;
  justify-content: center;
`;

export const FlexRow = css`
  flex-direction: row;
`;

export const FlexCenter = css`
  display: flex;
  justify-content: center;
`;

export const Font = (name, size) => css`
  font-family: ${name};
  font-size: ${size}px;
  /* Khand, Spartan, Inconsolata */
`;

export const Theme = {
  lightBeige: "#fdf9f2",
  darkBeige: "#eee9e3",
  lightGrey: "#a9a6a0",
  mediumGrey: "#4d4d4d",
  darkGrey: "#2d2d2d",
};

styled 컴포넌트 연습!!! GlobalStyles 에 있는것을 아래와같이 import해오고,

아래서 쓸때는 아래와같이 사용하면 된다!

const Title = styled.h1`
  color: ${Theme.darkBeige};
  margin: 0.5rem;
  ${Font("spartan", 100)}
`;
import React, { Component } from "react";
import styled from "styled-components";
import Slide from "./Slide/Slide";
import GlobalStyles, {
  MoveCenter,
  Font,
  Theme,
} from "../../../Styles/GlobalStyles";

export default class ShopDetail extends Component {
  state = {
    width: 99,
  };

  changeNum = () => {
    this.setState({ width: 200 });
  };

  render() {
    return (
      <div className="shopDetail">
        {/* <Slide /> */}
        <Wapper>
          <Title>why</Title>
          <Btn width="100">이게 버튼이다</Btn>
          <Btn width={this.state.width} onClick={this.changeNum}>
            이게 next 버튼이다
          </Btn>
        </Wapper>
      </div>
    );
  }
}

const Wapper = styled.div`
  ${MoveCenter}
`;

const Title = styled.h1`
  color: ${Theme.darkBeige};
  margin: 0.5rem;
  ${Font("spartan", 100)}
`;

const Title1 = styled.h3`
  color: "red";
`;

const Btn = styled.button`
  background-color: ${function (props) {
    if (props.width > 100) {
      return "red";
    } else {
      return "yellow";
    }
  }};
`;

0개의 댓글