ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • React) styled-component
    Java Script/React 2020. 11. 4. 00:27
    반응형

    styled-components

    • props 값으로 전달 값을 스타일에 입힐 수 있음

    •       import React from 'react';
          import styled, { css } from 'styled-components';
      
          const Box = styled.div`
              /* props로 넣어준 값을 직접 전달해줄 수 있음 */
              background: ${props => props.color || "blue"};
              padding: 1rem;
              display: flex;
          `;
      
          const Button = styled.button`
            background: white;
            color: black;
            border-radius: 4px;
            padding: 0.5rem;
            display: flex;
            align-items: center;
            justify-content: center;
            box-sizing: border-box;
            font-size: 1rem;
            font-weight: 600;
      
            /* & 문자를 사용하여 Sass처럼 자기 자신 선택 가능 */
            &:hover {
              background: rgba(255, 255, 255, 0.9);
            }
      
            /* 다음 코드는 inverted 값이 true일 때 특정 스타일을 부여해 줍니다. */
            ${props =>
              props.inverted &&
              css`
              background: none;
                border: solid;
                color: white;
                &:hover {
                  background: white;
                  color: black;
                }
                & + button {
                  margin-left: 1rem;
                }
              `}
          `;
      
          const StyledComponent = () => (
            <Box color="black">
              <Button>안녕하세요</Button>
              <Button inverted={true}>테두리만</Button>
            </Box>
          );
      
          export default StyledComponent;
      • Tagged 템플릿 리터럴을 이용하기 때문에 styled-components로 만든 컴포넌트의 props를 스타일 쪽에서 쉽게 조회하도록 구성됨
    • 스타일링된 엘리먼트 만들기

      • ```javascript

          import styled from 'styled-components';
        
        const Sample = ({ className }) => {
          return <div className={className}>Sample</div>;
        };
        
        const StyledSample = styled(Sample)`
          font-size: 2rem;
          background: gray;
          min-width: 100px;
        `;
        
        export default StyledSample;
        ```
      • <StyledSample className ="zin0"/>

        • 스타일링된 태그를 styled tag로 생성하는데, 부모 컴포넌트에서 props를 설정해서 값을 받도록 한다.
    • props에 따른 조건부 스타일링

      •       ${props =>
                props.inverted &&
                css`
                background: none;
                  border: solid;
                  color: white;
                  &:hover {
                    background: white;
                    color: black;
                  }
                  & + button {
                    margin-left: 1rem;
                  }
                `}
      • 앞서 작성한 예시를 보면, props의 inverted 값이 true일 때 위의 css를 부여하고 있다.
      • props를 참조하지 않는다면 CSS를 불러와서 사용하지 않아도 되지만, props를 참조한다면 반드시 CSS로 감싸주어 Tagged 템플릿 리터럴을 이용해야함
    • 반응형 디자인

      • 일반 CSS와 동일하게 @media를 이용한다.

      •       const Box = styled.div`
              /* props 로 넣어준 값을 직접 전달해줄 수 있습니다. */
              background: ${props => props.color || 'blue'};
              padding: 1rem;
              display: flex;
              /* 기본적으로는 1024px 에 가운데 정렬을 하고
                가로 크기가 작아짐에 따라 사이즈를 줄이고
                768px 미만으로 되면 꽉 채웁니다 */
              width: 1024px;
              margin: 0 auto;
              @media (max-width: 1024px) {
                width: 768px;
              }
              @media (max-width: 768px) {
                width: 100%;
              }
            `;
      • 위의 media 작업 또한 함수화를 통해 쉽게 구현할 수 있음

      •       import React from 'react';
            import styled, { css } from 'styled-components';
        
            const sizes = {
              desktop: 1024,
              tablet: 768
            };
        
            // 위에있는 size 객체에 따라 자동으로 media 쿼리 함수를 만들어줍니다.
            // 참고: https://www.styled-components.com/docs/advanced#media-templates
            const media = Object.keys(sizes).reduce((acc, label) => {
              acc[label] = (...args) => css`
                @media (max-width: ${sizes[label] / 16}em) {
                  ${css(...args)};
                }
              `;
        
              return acc;
            }, {});
        
            const Box = styled.div`
              /* props 로 넣어준 값을 직접 전달해줄 수 있습니다. */
              background: ${props => props.color || 'blue'};
              padding: 1rem;
              display: flex;
              width: 1024px;
              margin: 0 auto;
              ${media.desktop`width: 768px;`}
              ${media.tablet`width: 768px;`};
            `;
        • target device에 따라 반응형 디자인을 쉽게 제공할 수 있다.

    Reference

    리액트를 다루는 기술

    반응형

    'Java Script > React' 카테고리의 다른 글

    React) useMemo & useCallback  (0) 2020.11.04
    React Hooks 알아보기  (0) 2020.11.04
    React 컴포넌트 알아보기  (0) 2020.11.04
    JSX란 무엇인가  (0) 2020.11.03

    댓글

Designed by Tistory.