[React] Sass

[React] Sass

[React] Sass

안녕하세요. 배워가며 성장하는 개발자 DevRappers입니다. 이번 포스팅에서는 리액트 컴포넌트를 스타일링하는 Sass에 대해서 포스팅하려고 합니다.

Sass란 Css pre-processor로 복잡한 작업을 쉽게 할 수 있게 해주고, 코드의 재활용성을 높여주고, 코드의 가독성을 높여주는 css업그레이드 버전이라고 보시면 됩니다. Sass에서는 두가지 확장자를 지원하는데 이 포스팅에서는 .scss를 사용해보도록 하겠습니다.

먼저 프로젝트에서 sass를 사용하려면 node-sass라는 패키지를 설치해줘야 합니다.

$ yarn add node-sass

node-sass는 sass를 css로 변환해주는 역할을 수행합니다.

그런 다음 예제를 진행하기 위해서 Button컴포넌트를 만들어보도록 하겠습니다. 컴포넌트 폴더에 Button.js를 만들어줍시다.

import React from 'react'; import './Button.scss'; function Button({ children }) { return {children}; } export default Button;

Button.scss파일도 만들어줍니다.

$blue: #228be6; .Button { display: inline-flex; color: white; font-weight: bold; outline: none; border-radius: 4px; border: none; cursor: pointer; height: 2.25rem; padding-left: 1rem; padding-right: 1rem; font-size: 1rem; background: $blue; &:hover { background: lighten($blue, 10%); } &:active { background: darken($blue, 10%); } }

이런식으로 scss파일을 만들어보았는데요. css와 다르게 $를 사용하여 blue라는 변수를 만들어줄 수 있으며 &:hover즉 &는 자기 자신으로 자기자신이 hover되었을때의 효과를 보여줄 수 있게 됩니다. 그리고 lighten이나 darken같은 밝고 어둡게 해주는 함수도 사용가능합니다.

이 컴포넌트를 App컴포넌트에서 불러온 후 App.css파일을 App.scss파일로 수정해줍시다.

import React from 'react'; import './App.scss'; import Button from './components/Button'; function App() { return ( BUTTON ); } export default App;

이런식으로 수정을 하고 App.scss파일을 수정해줍시다.

.App { width: 512px; margin: 0 auto; margin-top: 4rem; border: 1px solid black; padding: 1rem; }

이렇게 하면 이런화면을 볼 수 있게 됩니다.

이번에는 버튼 사이즈를 조정해보도록 하겠습니다. props로 size를 받아와서 large, medium, small에 따라 다른 크기를 보여주도록 구현해보겠습니다. Button.js를 수정해줍니다.

import React from 'react'; import './Button.scss'; function Button({ children, size }) { return {children}; } Button.defaultProps = { size: 'medium' }; export default Button;

현재는 이런 식으로 코드 작성이 가능한데 className을 설정하기 너무 불편하기 때문에 classnames라는 라이브러를 설치해서 사용해보도록 하겠습니다.

$ yarn add classnames

이제 Button.js를 수정해보도록 하겠습니다.

import React from 'react'; import classNames from 'classnames'; import './Button.scss'; function Button({ children, size }) { return {children}; } Button.defaultProps = { size: 'medium' }; export default Button;

이런식으로 수정이 가능합니다. 이제 Button.scss를 수정해보도록 하겠습니다.

$blue: #228be6; .Button { display: inline-flex; color: white; font-weight: bold; outline: none; border-radius: 4px; border: none; cursor: pointer; &.large { height: 3rem; padding-left: 1rem; padding-right: 1rem; font-size: 1.25rem; } &.medium { height: 2.25rem; padding-left: 1rem; padding-right: 1rem; font-size: 1rem; } &.small { height: 1.75rem; font-size: 0.875rem; padding-left: 1rem; padding-right: 1rem; } background: $blue; &:hover { background: lighten($blue, 10%); } &:active { background: darken($blue, 10%); } }

이런식으로 수정해주었는데요. &.large나 &.medium이 의미하는 바는 Button클래스이면서 large클래스 Button클래스이면서 medium클래스를 선택해서 적용하겠다는 의미입니다. 이제 App.js를 수정해보도록 하겠습니다.

import React from 'react'; import './App.scss'; import Button from './components/Button'; function App() { return ( BUTTON BUTTON BUTTON ); } export default App;

이렇게 구현하게 되면 이런식으로 결과물이 나올텐데요.

버튼 컴포넌트마다 여백이 없기때문에 이 여백을 설정해보도록 하겠습니다.

$blue: #228be6; .Button { display: inline-flex; color: white; font-weight: bold; outline: none; border-radius: 4px; border: none; cursor: pointer; // 사이즈 관리 &.large { height: 3rem; padding-left: 1rem; padding-right: 1rem; font-size: 1.25rem; } &.medium { height: 2.25rem; padding-left: 1rem; padding-right: 1rem; font-size: 1rem; } &.small { height: 1.75rem; font-size: 0.875rem; padding-left: 1rem; padding-right: 1rem; } background: $blue; &:hover { background: lighten($blue, 10%); } &:active { background: darken($blue, 10%); } & + & { margin-left: 1rem; } }

이런식으로 & + &로 설정이 가능합니다. 이게 의미하는 바는 .Button과 .Button의 사이 입니다.

이제 크기를 지정했으니 버튼 색상을 변경해보도록 하겠습니다. 이번에는 Button컴포넌트에서 color라는 props를 받아와서 blue인지 gray인지 pink인지 구분해보도록 하겠습니다.

import React from 'react'; import classNames from 'classnames'; import './Button.scss'; function Button({ children, size, color }) { return ( {children} ); } Button.defaultProps = { size: 'medium', color: 'blue' }; export default Button;

이런식으로 Button.js를 수정해주고 이번에는 Button.scss를 수정해보도록 하겠습니다.

$blue: #228be6; $gray: #495057; $pink: #f06595; .Button { display: inline-flex; color: white; font-weight: bold; outline: none; border-radius: 4px; border: none; cursor: pointer; // 사이즈 관리 &.large { height: 3rem; padding-left: 1rem; padding-right: 1rem; font-size: 1.25rem; } &.medium { height: 2.25rem; padding-left: 1rem; padding-right: 1rem; font-size: 1rem; } &.small { height: 1.75rem; font-size: 0.875rem; padding-left: 1rem; padding-right: 1rem; } // 색상 관리 &.blue { background: $blue; &:hover { background: lighten($blue, 10%); } &:active { background: darken($blue, 10%); } } &.gray { background: $gray; &:hover { background: lighten($gray, 10%); } &:active { background: darken($gray, 10%); } } &.pink { background: $pink; &:hover { background: lighten($pink, 10%); } &:active { background: darken($pink, 10%); } } & + & { margin-left: 1rem; } }

이런식으로 수정이 가능한데요. 여기서 보시면 blue밑에 gray밑에 pink밑에 부분들이 반복되는걸 확인할 수 있습니다. 이러한 문제는 mixin과 include를 사용하여 코드를 간단하게 바꿀 수 있습니다.

$blue: #228be6; $gray: #495057; $pink: #f06595; @mixin button-color($color) { background: $color; &:hover { background: lighten($color, 10%); } &:active { background: darken($color, 10%); } } .Button { display: inline-flex; color: white; font-weight: bold; outline: none; border-radius: 4px; border: none; cursor: pointer; // 사이즈 관리 &.large { height: 3rem; padding-left: 1rem; padding-right: 1rem; font-size: 1.25rem; } &.medium { height: 2.25rem; padding-left: 1rem; padding-right: 1rem; font-size: 1rem; } &.small { height: 1.75rem; font-size: 0.875rem; padding-left: 1rem; padding-right: 1rem; } // 색상 관리 &.blue { @include button-color($blue); } &.gray { @include button-color($gray); } &.pink { @include button-color($pink); } & + & { margin-left: 1rem; } }

이런식으로 자바스크립트 함수다루듯이 비슷하게 구현해서 코드를 단축시킬 수 있습니다. 이제 App.js에서 불러와보도록 하겠습니다.

import React from 'react'; import './App.scss'; import Button from './components/Button'; function App() { return ( BUTTON BUTTON BUTTON BUTTON BUTTON BUTTON BUTTON BUTTON BUTTON ); } export default App;

이러면 이러한 결과물을 확인할 수 있습니다.

근데 보기가 굉장히 좋지 않게 Button들이 서로 붙어있죠? App.scss를 수정해보겠습니다.

.App { width: 512px; margin: 0 auto; margin-top: 4rem; border: 1px solid black; padding: 1rem; .buttons + .buttons { margin-top: 1rem; } }

이런 결과물을 확인할 수 있습니다.

이번 포스팅에서는 React를 스타일링할 수 있는 첫번째 방법 Sass에 대해 알아보았습니다. 이상 DevRappers입니다. 감사합니다.

from http://devrappers.tistory.com/73 by ccl(A)

댓글

이 블로그의 인기 게시물

[React] - 18) 프로젝트 빌드하기(+코드 스플리팅)

입트영(2020.03.23) - Iced Drinks / 아이스 음료

Redux + React