본문 바로가기
React

2021.07.24 React styling

by 해맑은 코린이 2021. 7. 24.

2021.07.24 React styling_정리노트

 

ㅎㅎㅎㅎ 오늘은 9장 정리 웃는 이유는 내가 유일..하게 재밌었던 부분이 스타일 컴포넌트였기 때문..^^ ㅎ 그냥 css 만 사용해서 그런지 몰라도 오늘은 모르는거 위주로 정리!

 

리액트 스타일링 방식

CSS

Sass

CSS Module

styled-component

 

생각보다 많이..^^ 다양하네...ㅎ..

https://korinkorin.tistory.com/48?category=974678

 

2021.02.04 React Style 적용,Styled Components 정리

2021.02.04_React Style 적용, Styled Components_정리노트 드디어 프로젝트가 시작됨 ㅊㅊㅊㅊ 근데 아직 쓰면서도 많이 헷갈리는 것 같다. 오늘은 그나마 스타일 컴포넌트라서 괜찮았는데.. 아마도 다음

korinkorin.tistory.com

 

여기서 기본 CSS,styled-component 쵸콤 정리했으니까 여기 없는 내용 위주로 오늘은 정리갑씨단!

 

먼저 오늘도 프로젝트 새로 생성해주겠음.

 

$ yarn create react-app styling-react
$ cd styling-react
$ yarn start

 

 

Sass ( Syntactically Awesome Style Sheet )

CSS 전처리기로 복잡한 작업을ㄹ 쉽게 할 수 있도록 해주고, 스타일 코드의 재활용성을 높여줄 뿐만 아니라 코드의 가독성을 높여서 유지 보수를 더욱 쉽게 해준다.

단어 그대로 문법적으로 매우 멋진 스타일시트 ..! 

 

.scss .sass 의 두 가지 확장자를 지원

 

// .sass

$font-stack:Helvetica, san-serif
$primary-color : #333


body
	font: 100% $font-stack
    color : $primary-color

 

// .scss

$font-stack:Helvetica, san-serif;
$primary-color : #333;


body{
	font: 100% $font-stack
    color : $primary-color 
    }

 

이렇게 형태가 사뭇 다른데,  좀 더 자바스크립트랑 유사한 .scss 확장자를 써보자!

 

 

Sass 를 css 로 변환해주는 node-sass 라는 라이브러리를 설치해줄 예정인데, 2021년 1월 기준 해당 라이브러리의 최신 버전이 create-react-app 에서 지원되지 않아 구버전으로 설치할 것임!

 

$ yarn add node-sass@4.14.1

 

설치하고 

 

src/SassComponent.scss ( 새로 생성 )

 

// 변수 사용하기
$red: #fa5252;
$orange: #fd7e14;
$yellow: #fcc419;
$green: #40c057;
$blue: #339af0;
$indigo: #5c7cfa;
$violet: #7950fc;
// 믹스인 : 재사용되는 스타일 블록을 함수처럼 사용할 수 있음.
@mixin square($size) {
  $calculated: 32px * $size;
  width: $calculated;
  height: $calculated;
}
.SassComponent {
  display: flex;

  .box {
    background: red; // 일반 CSS 에선 .SassComponent .box 와 마찬가지
    cursor: pointer;
    transition: all 0.3s ease-in;
    &.red {
      // .red 클래스가 .box 와 함께 사용 됐을 때
      background: $red;
      @include square(1);
    }
    &.orange {
      background: $orange;
      @include square(2);
    }
    &.yellow {
      background: $yellow;
      @include square(3);
    }
    &.green {
      background: $green;
      @include square(4);
    }
    &.blue {
      background: $blue;
      @include square(5);
    }
    &.indigo {
      background: $indigo;
      @include square(6);
    }
    &.violet {
      background: $violet;
      @include square(7);
    }
    &:hover {
      // .box 에 마우스 올렸을 때
      background: black;
    }
  }
}

 

이렇게 생성해주고, 

 

src/SassComponent.js ( 새로 생성 )

 

import React from "react";
// scss import
import "./Sasscomponent.scss";

const SassComponent = () => {
  return (
    <div className="SassComponent">
      <div className="box red" />
      <div className="box orange" />
      <div className="box yellow" />
      <div className="box green" />
      <div className="box blue" />
      <div className="box indigo" />
      <div className="box violet" />
    </div>
  );
};

export default SassComponent;

 

이렇게 컴포넌트도 생성해주자.

 

 

마지막으로 App 에서 불러오기!

 

src/App

 

 

Sass 는 작업한 후 개발 서버를 재시작해야 적용된다. 다시 yarn start!

오오 이쁘댠.. 잘 적용이 되는 모습..!! 까만 호버도 잘 적용된다! ㅎ

 

이렇게 적은 Sass 변수 및 믹스인은 다른 파일로 따로 불니하여 작성한 뒤 필요한 곳에서 쉽게 불러와 사용할 수 있음.

 

 

 

 

분리를 시켜주기 위해 src 에 styles 라는 폴더를 만들고 util.scss 파일 생성!

 

src/styles/util.scss ( 새로 생성 )

 

이렇게 변수와 믹스인을 잘라서 가지고 왔다. 

 

 

Sasscomopnent에서 불러와보자.

 

 

 

 

이렇게 @import 로 불러올 수 있음! 결과도 당연히 같움.

 

 

 

Sass 장점 중 하나는 라이브러리를 쉽게 사용할 수 있다는 점이다. 

 

@import '../../../node_modules/library/styles' ;

 

기본적으로 node_modules 까지 들어가서 사용하는 방법이 있지만, 

 

@import '~library/styles';

 

이렇게 물결 ( ~ ) 을 사용하면 자동으로 node_modules 에서 라이브러리 디렉토리로 들어가서 스타일을 불러올 수 있다! 

 

한번 쓰윽 써보자

 

$ yarn add open-color include-media

 

open-color 

색상 팔레트 라이브러리

include-media 

반응형 디자인 라이브러리

 

 

두개 같이 설치 꼬고

 

 

src/styles/utill.scss

 

설치해주고 이렇게 불러와서 

 

 

 

src/Sasscomponent.scss

 

해당 부분 추가!

 

 

 

 

 

 

개발자 도구를 이용해서 찍어보면, 768 이하인 화면에서는 배경이 검은색으로 변한다! 굿...

 

 


 

 

CSSModule

CSS 를 불러와서 사용할 때 클래스 이름을 고유한 값,  [파일이름]_[클래스이름]__[해시값] 형태로 자동으로 만들어서 컴포넌트 스타일에서 클래스 이름이 중첩되는 현상을 방지하는 기술.

v2 버전부터는 .module.css 확장자로 파일을 저장하면, 별도의 설치가 필요없다.

 

 

src/CSSModule.module.css ( 새로 생성 )

 

 

 

이렇게 작성할 수 있는데, CSS Module 을 사용하면 클래스 이름을 지을 때 고유성에 대해 고민하지 않아도 된다. 해당 클래스는 우리가 방금 만든 스타일을 직접 불러온 컴포넌트의 내부에서만 작동하기 때문!!!!

만약 CSS Module 안에 전역적으로 사용하고 싶은 css 가 있다면, 앞에 :global 만 적어주면 되는 것이다

 

 

src/CSSModule.js ( 새로 생성 )

 

 

이제 해당 컴포넌트를 만들어주고 불러와주면 되는데, 객체를 전달받는다는게 뭔 말인가 해서 styles 를 찍어보았음.

 

 

 

 

아아 아까 말한 형태대로,  [파일이름]_[클래스이름]__[해시값] 이 객체의 형태로 전달된다는 말이균.

 

그러면 객체니까 JSX 에서 {styles.클래스이름} 이렇게 받아올 수 있는거다!

something 은 전역적으로 생성해주었으니까 그냥 문자열로 넣어주어도 적용된다.

 

 

하이하이 잘 적용이 되는군

 

 

 

만약 두 개를 적용하고 싶다면 ? 

 

 

 

이렇게 템플릿 리터럴 방식을로 적으면 된다. 만약 이 문법을 사용하지 않으면 해당 위의 주석처럼 join을 이용!

 

템플릿 리터럴

ES6 신문법으로 해당 문법을 사용하면 문자열 안에 자바스크립트 레퍼런스를 쉽게 넣어줄 수 있다.

 

const name = 'react';
// const message = '제 이름은'+name + '입니다' ; 
const message = `제 이름은 +${name} + 입니다` ;

 

여기서 사용되는 `` 요 문자는 백틱이라고 하고, 1 옆에 있는 키인데 그냥 원화 표시라면 알트누르고 ( 맥북은 옵션 ) 하면 백틱 나옴 ㅇㅇ!

 

요롷게 새로운 스타일도 잘 적용되었슴다

 

 

CSS 클래스를 조건부로 설정할 때 또 유용한 라이브러리 하나!

$ yarn add classnames

 

설치 ㄲㄲ

 

import classNames from 'classnames';


classNames('one','two') ;
>>'one two'

classNames('one',{'two' :true });
>>'one two'

classNames('one',{'two' :false }); 
>>'one'

classNames('one',['two' ,'three']);
>> 'one two three'



const myClass = 'hello';
classNames('one',myClass,{myCondition:true}); 
>> 'one hello myCondition'



// highlighted true 면 highlighted 클래스 적용, false 면 적용 안됨. 
//theme 전달받는 문자열은 내용 그대로 클래스에 적용

const myComponet = ({highlighted, theme}) =>(
	<div className={classNames('myComponent',{highlighted },theme)}>Hello</div>

);

 

이렇게 예시로 적어봤고, 여러 종류의 파라미터를 조합해서 css 클래스를 설정할 수 있기 때문에 props 값에 따라 정해주기 겁나 쉽겠규만.

 

 

src/CSSModule

 

이렇게 주석이랑 비교하면서 보면 될 듯하다! 점점 가독성이 좋아지고 있는게 보이는균 ㅎㅅㅎ

 

 

마지막으로 Scss 랑 css 같이 적용하기!

 

 

src/CSSModule.module.css >> src/CSSModule.module.scss ( css >> scss 로 변경 )

 

 

주석도 자바스크립트껄로 바꼈단 ㅎㅅㅎ 이렇게 적고, 

 

 

src/CSSModules 

여기도 고쳐주면 똑같은 화면 완성~~

 

 

굿굿 

 

 

참고로 일반 .css / .scss 파일에서도 :local 을 적어주고 사용하면, CSS Module 사용 가능!

 

 

 


 

 

styled-component

CSS-in-JS (자바스크립트 파일 안에 스타일을 선언하는 방식) 중 개발자들이 가장 선호하는 라이브러리 

 

$ yarn add styled-components

 

자 설치하고,

 

https://korinkorin.tistory.com/48?category=974678 

 

2021.02.04 React Style 적용,Styled Components 정리

2021.02.04_React Style 적용, Styled Components_정리노트 드디어 프로젝트가 시작됨 ㅊㅊㅊㅊ 근데 아직 쓰면서도 많이 헷갈리는 것 같다. 오늘은 그나마 스타일 컴포넌트라서 괜찮았는데.. 아마도 다음

korinkorin.tistory.com

 

예전에 적었던 글은 너무 조약하길래 보충해서 적어야겠단

 

 

// styled import 
import styled from 'styled-components';


// styled.태그명 으로 사용
const MyComponent = styled.div`
	font-size:2rem;
`

// 태그의 타입을 styled 함수의 인자로 전달
const MyInput = styled('input')`
	bacground:gray;
`



//아예 컴포넌트 형식의 값을 넣어줌

cosnt StyledLink = styled(Link)`
 color:blue;
`

 

음음 간단하게 형태 정리를 해보았다 styled.태그명 형태 기본으로 하면서 유동적인 태그명이나 특정 컴포넌트 자체에 스타일링을 해주고 싶으면 styled 함수에 직접 넣어주면 된다!

 

 

자 이제 본격적으로 해볼까나

 

 

src/StyledComponent.js ( 새로 생성 )

import React from "react";
// styled,css import
import styled, { css } from "styled-components";

const Box = styled.div`
  /* props 로 넣어준 값 직접 전달 가능 */
  background: ${(props) => props.color || "blue"};
  padding: 1rem;
  display: flex;
  width: 1024px;
  margin: 0 auto;
`;

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: 2px solid white;
      color: white;
      &:hover {
        background: white;
        color: black;
      }
    `};
     /* 버튼과 버튼이 맞닿아 있는 부분 margin-left */
  & + button {
    margin-left: 1rem;
  }
`;

const StyledComponent = () => (
    // props 로 color 값 전달. 기본은 위에서 설정해준 blue
  <Box color="black">
    <Button>안녕하세요</Button>
    <Button inverted={true}>테두리만</Button>
  </Box>
);

export default StyledComponent;

 

 

위 포스팅에 적었지만, 백틱을 사용해서 쓰는 형태이고, 가장 큰 장점 중 하나는 역시 props 값으로 전달해 주는 값을 쉽게 스타일에 적용할 수 있다는 점!!!

 

 

 

 

해당 컴포넌트가 잘 뜬다면 성공쓰~

 

몇 가지의 원리를 좀 더 파보자!!

 

 Tagged Template Literal 문법

그 때는 잠시 props 를 해당 문법 때문에 쓸 수 있다고 했는데, 자세히 보면, 일반 템플릿 리터럴 문법과는 다르게 Tagged Template Literal 문법은 템플릿 사이사이에 들어가는 자바스크립트 객체나 함수의 원본 값을 그대로 추출할 수 있다. 

 

 

 

예를 들면, 

 

 

이렇게 객체나 함수를 템플릿에 넣게 되면, 형태를 잃어서 [objevt Object] 로, 함수는 문자열로 인식 되어서 나오는데, 

 

이렇게 함수를 작성하고 나서 해당 함수 뒤에 템플릿 리터럴을 사용하면 ? 

 

요롷게 온전히 값을 추출할 수 있다! 그래서 스타일 컴포넌트에서는 이러한 속성을 사용해서 props 를 쉽게 조회할 수 있도록 하는 것!!

 

 

 

이 부분도 역시 props 를 이용해 조건부로 true 이면 해당 스타일이 적용되도록 한 모습!!

 

 

그럼 반응형 디자인할 때는 ..?

 

 

물론 css 처럼 적어주어도 되지만, 

 

https://www.styled-components.com/docs/advanced#media-templates

 

styled-components: Advanced Usage

Theming, refs, Security, Existing CSS, Tagged Template Literals, Server-Side Rendering and Style Objects

styled-components.com

 

스타일 컴포넌트에 있는 유틸 함수를 써서 

 

 

 

훨씬 간편하게 쓸 수 있다..! 모듈화해서 이 역시 분리해주고 import 해오면 다 쓸 수 있겠디 !!!!!!!

역시 스타일 컴포넌트..ㅎㅅㅎ 

 

 

+++ 새로 추가(2022.04.11)

 

다시 보고 있으니 새롭군 ...음음... 스타일 컴포넌트에서는 태그를 또 지정해줄 수 있는 속성이 있음. 

예를 들어 div 태그의 스타일은 같은데 나는 이 스타일 대로 span 태그를 만들고 싶다면 ?

 

const Btn = styled.button`
  color: white;
  background-color: plum;
  border: 0;
  border-radius: 15px;
  width:100px;
  height:40px;
  margin-top:10px;
`;



function App() {
  return (
    <>
      <Btn>Login</Btn>
      // as props is property of this tag
      <Btn as="span">Login</Btn>
    </>
  );
}

 

as props 를 써주면 된다!

이렇게 하면 버튼으로 만들었던 스타일 컴포넌트가

이렇게 span 으로 바뀌는 것을 볼 수 있음!!! 와..이건 또 몰랐네 체고야~~~

 

 

또한, 컴포넌트를 재사용할 때, 속성을 똑같이 반복하고 싶다면?

const Input = styled.input.attrs({ required: true})`
  background-color: cyan;
`

function App() {
  return (
    <>
      <Input />
      <Input />
      <Input />
      <Input />
      <Input />
    </>
  );
}

이렇게 attrs 속성을 이용하면 ?

 

 

이렇게 한번에 속성들을 다 부여해서 재사용 할 수 있다는 사실! 알면 알수록 최고인 친구야.. 잘 쓰진 않지만 역시 유용할 수 있으니 이렇게 추가로 한~~~참 뒤에라도 추가한다.

 


 

 

오늘은 그래도 나름..? 리액트 중에서 제일 흥미가 있었던 부분이어서 즐겁게는 했지만 세삼 또 이해못하고 쓴게 있었다는 것에 놀라며...ㅎㅅㅎ 

그리고 나는 절대 스타일 컴포넌트를 슬기롭게 쓰지 못했다는 사실을.. 깨달았다.. 이렇게나 유용한 기능이었다니 재미도 있지만 역시 더 공부해서 요모조모로 잘 쓸 수 있도록 해야겠다 히히 오늘은 기분 좋게 새벽 포스팅까지해서 1일 반..? ㅋㅋㅋㅋ만에 2개 포스팅 성공쓰~ 

이제 자러가야지 빠잇

 

 

'React' 카테고리의 다른 글

2021.07.30 React Todo-List 성능 최적화, immer  (0) 2021.07.30
2021.07.28 React To-do List  (0) 2021.07.29
2021.07.23 React Hooks  (0) 2021.07.23
2021.07.19 React Life Cycle  (2) 2021.07.21
2021.07.19 React Component 반복  (1) 2021.07.19

댓글