[패스트캠퍼스 수강 후기] 프론트엔드 인강 100% 환급 챌린지 33회차 미션 - 31강 Sass

3 minute read

리액트에서의 Sass 설치 및 초기 셋팅

css preprocessor이며 Syntactically Awesome StyleSheets 의 약자인 Sass는 Sass 가이드라인을 참고하면 좋다.
일단 Sass를 사용하면 두가지 확장자를 사용할 수 있는데 .sass와 .scss이다. Sass SCSS .sass가 먼저 나왔는데 문법이 너무 축약적이라 생소하기도 하고 잘 안쓰여서 보완하는 개념으로 .scss가 나왔다고 한다. 우리가 배우는 이 튜토리얼에서는 .scss로 사용할 것이다. 그 이유는 .scss가 더 많이 사용되고 있기 때문이다.

node-sass 설치

그럼 먼저 새로운 리액트 앱을 만들고 node-sass를 설치해준다. 리액트 안에서 Sass를 사용할 수 있게 해주는 것이다.

npx create-react-app styling-with-sass
yarn add node-sass

Settings

그리고 우리가 만든 리액트폴더 안에 components라는 폴더를 하나 더 생성하고, 그 안에 Button.js 하나를 추가하자. 그리고 이전에 만들었던 스니펫 fc를 활용하여 함수형 컴포넌트를 생성해주고 그안에 버튼을 만든다.

src/component/Button.js

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

function Button({ children }) {
  return <button className="Button">{children}</button>;
}

export default Button;

그리고 Button.scss파일도 만들어보자.

src/component/Button.scss

$blue: #228be6; //주석!
.Button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-weight: bold;
  outline: none;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  height: 2.25rem;
  padding-left: 1rem;
  padding-right: 1rem;
  font-size: 1rem;
  background: $blue;
  transition: 0.2s all;
  &:hover {
    //&은 자신을 말함.
    background: lighten($blue, 10%); //lighten 함수 생성
    box-shadow: 2px 2px 2px rgba($color: #000000, $alpha: 0.2);
    transition: 0.2s all;
  }
  &:active {
    background: darken($blue, 10%); //darken 함수 생성
    box-shadow: inset 2px 2px 5px rgba($color: #000000, $alpha: 0.1);
  }
}

src/App.js

위와 같이 스타일링을 완성했으면 이제 App.js에 Button.js를 연결하고 확인해보자.

import React from "react";
import Button from "./components/Button";
import "./App.scss";

function App() {
  return (
    <div className="App">
      <div className="buttons">
        <Button>Button</Button>
      </div>
    </div>
  );
}

export default App;

이번엔 전체적으로 레이아웃을 잡을건데 이건 App.scss를 만들어서 반영해보자.

src/App.scss

.App {
  width: 512px;
  margin: 0 auto;
  border: 1px solid #000;
  padding: 1rem;
}

Sass로 버튼 size props설정

SCSS

위에 만든 버튼에 다양한 옵션을 주는 방법을 알아보자. 먼저 구현할 기능은 버튼의 다양한 사이즈를 설정할 수 있도록 해주는 것이다.

Button.js

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

// size: large, medium, small
function Button({ children, size }) {
  return <button className={["Button", size].join(" ")}>{children}</button>;
}

export default Button;

classnames 설치

버튼에 대한 여러가지 설정을 받아와 줄 것이기때문에 classnames 라이브러리를 추가로 설치해보자.

yarn add classnames

classname
위의 그림처럼 classNames는 조건을 통해 클래스명을 불러오고 그에 따른 스타일을 설정할 수 있는 라이브러리이다. 컴포넌트 스타일링을 더욱 효율적으로 할 수 있게 해줄 것이다. classname을 설치했으면 아래와 같이 임폴트하고 기본값(defaultProps)을 설정해준다.

import React from "react";
import classNames from "classname"; //1. classname 임폴트하기
import "./Button.scss";

// size: large, medium, small
function Button({ children, size = "medium" }) {
  //2. default 설정방법1
  return (
    <button
      //3. default설정방법2
      className={classNames("Button", size || "medium")}
    >
      {" "}
      {children}
    </button>
  );
}

Button.defaultProps = {
  //4. defualt설정방법3 -> 가장 정석임. redux개발자에서도 볼 수 있음.
  size: "medium",
};
export default Button;

default 설정방법은 위의 3가지 중 하나만 하면 된다. 제일 마지막에 쓴 방법 ‘Button.defaultProps’가 제일 정석이고, redux 개발자 도구에서도 볼 수 있는 방법이라 저것을 선호한다고 한다.
자 이제 다시 Button.scss로 돌아와서 버튼 크기별 css를 만들어줘보자.

Button.scss

$blue: #228be6; //주석!
.Button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-weight: bold;
  outline: none;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  padding-left: 1rem;
  padding-right: 1rem;
  background: $blue;
  transition: 0.2s all;
  &.large {
    height: 3rem;
    font-size: 1.25rem;
  }
  &.medium {
    height: 2.25rem;
    font-size: 1rem;
  }
  &.small {
    height: 1.75rem;
    font-size: 0.875rem;
  }
  &:hover {
    //&은 자신을 말함.
    //background: lighten($blue, 10%); //lighten 함수 생성
    box-shadow: 2px 2px 2px rgba($color: #000000, $alpha: 0.2);
    transition: 0.2s all;
  }
  &:active {
    //background: darken($blue, 10%); //darken 함수 생성
    box-shadow: inset 2px 2px 5px rgba($color: #000000, $alpha: 0.1);
  }
  & + & {
    //Button뒤에 Button이 올때만.
    margin-left: 1rem;
  }
}

다 만들고나서 이제 App으로 돌아가서 버튼을 여러개 넣어주고 size props를 설정해보자.

App.js

import React from "react";
import Button from "./components/Button";
import "./App.scss";

function App() {
  return (
    <div className="App">
      <div className="buttons">
        <Button size="large">Button</Button>
        <Button>Button</Button>
        <Button size="small">Button</Button>
      </div>
    </div>
  );
}

export default App;

버튼의 사이즈 설정
잘 나오는 것을 볼 수 있다.
오늘은 여기까지..
시청 영상 31강 01~03까지

수강인증이미지

프론트엔드 개발 올인원 패키지 with React Online. 👉 https://bit.ly/31Cf1hp

Comments