๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš€ Development/React Native

[React Native] ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง

by Jay Din 2023. 6. 15.
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

CSS

import “./style.css”;๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ, css๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํƒ€์ผ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

CSS๋กœ ์Šคํƒ€์ผ๋ง์„ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ์ด๋Ÿด ๋• SASS ๋˜๋Š” SCSS ๋“ฑ์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Sass(syntactically awesome stylesheet)

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” css ์ „์ฒ˜๋ฆฌ๊ธฐ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. css3์˜ ํ™•์žฅ์œผ๋กœ Dart๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๋” ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์Šคํƒ€์ผ ์ฝ”๋“œ์˜ ์žฌํ™œ์šฉ์„ฑ์„ ๋†’์—ฌ์ฃผ๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜์— ๋„์›€์ด ๋œ๋‹ค.

ํ™•์žฅ์ž๋Š” .scss์™€ .sass ๋‘๊ฐ€์ง€๋ฅผ ์ง€์›ํ•œ๋‹ค.

.sass

Importํ•˜๊ธฐ ์œ„ํ•ด์„œ node-sass๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

$ yarn add node-sass
//utils.scss
@import '../../../node_modules/library/styles';
@import '~library/styles';

node_modules ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

$font-stack:    Helvetica, sans-serif
$primary-color: #333
// ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„
body
  font: 100% $font-stack
  color: $primary-color

์ค‘๊ด„ํ˜ธ({})์™€ ์„ธ๋ฏธ์ฝœ๋ก (;)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

.scss

๊ธฐ์กด css ์ž‘์„ฑ๋ฒ•๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.

utilsํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  importํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

ํด๋ž˜์Šค ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์Šคํƒ€์ผ ์ ์šฉ์ด๋‹ค.

// ๋ณ€์ˆ˜ ์‚ฌ์šฉ
$red: #fa5252;
$orange: #fd7e14;

// mixin ๋งŒ๋“ค๊ธฐ (์žฌ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ€์ผ ๋ธ”๋ก์„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ)
// CSS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค.
@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);  
      // mixin์œผ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์„ include๋กœ ์ ์šฉ
    }
    &.orange {
      background: $orange;
      @include square(2);
    } }

 

Css Module

CSS๋ฅผ ์ „์—ญ์ ์ด์ง€ ์•Š๊ณ  ์ง€์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค.

CSSํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ํŒŒ์ผ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ด๋ฆ„๊ฐ’ ์˜ต์…˜์ด๋‹ค.

์ฆ‰, [ํŒŒ์ผ ์ด๋ฆ„]_[ํด๋ž˜์Šค ์ด๋ฆ„]_[ํ•ด์‹œ๊ฐ’]ํ˜•ํƒœ๋กœ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ ํด๋ž˜์Šค ์ด๋ฆ„์ด ์ค‘์ฒฉ๋˜๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

[ํŒŒ์ผ์ด๋ฆ„].module.cssํ™•์žฅ์ž๋กœ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด CSS Module์ด ์ ์šฉ๋œ๋‹ค.

 

๋ฐ˜์‘ํ˜•

 

styled-components

์•กํŠธ์™€ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์˜ ์ปดํฌ๋„ŒํŠธ์— ์Šคํƒ€์ผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์„ ์“ฐ๋“ฏ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ styled-components๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

CSSํŒŒ์ผ์„ import ํ•˜์ง€ ์•Š์•„๋„ CSS์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.(CSS ๋ฌธ๋ฒ• ์‚ฌ์šฉ)

// styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ import ํ•ด์˜จ styled๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค
// ์•„๋ž˜์™€ ๊ฐ™์ด div ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐฑํ‹ฑ(‘)๋‚ด๋ถ€์— ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ด์ฃผ๋ฉด Text, Container๋ผ๋Š” ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
import React from "react";
import styled from "styled-components";
function App() {
  return (
// Container, Text๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋ฏ€๋กœ props๊ฐ’์„ ํ†ตํ•ด ์ „๋‹ฌ ๋ฐ›์€ ๊ฐ’์„ ์œ ๋™์ ์œผ๋กœ ์Šคํƒ€์ผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
 <Container>
   <StyledButton type="primary"> test Button </StyledButton>
 </Container>
  );
}

// Styled-Component๋กœ ๋งŒ๋“ค์–ด์ง„ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์Šคํƒ€์ผ ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
// ๊ธฐ์กด divํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด์„œ ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค.(๊ธฐ์กด divํƒœ๊ทธ์˜ ์†์„ฑ์„ ๊ทธ๋Œ€๋กœ ์ƒ์† ๋ฐ›๋Š”๋‹ค.)
// divํƒœ๊ทธ๋Š” ๋ธ”๋ก๋‹จ์œ„๋กœ ๋ฌถ์–ด ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
// const ์ปดํฌ๋„ŒํŠธ ๋ช… = styled.์†์„ฑ ํƒœ๊ทธ(div, span, button....๋“ฑ)`
//  ์†์„ฑ ์ •์˜ `;
const Container = styled.div` 
  background-color: #f6e58d;
`;

const StyledButton = styled(Button)`
  margin: 30px;
  background-color: blue;
`;
export default App;

์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

tagged template literal ๋ฐฑํ‹ฑ(‘ ’)์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž…์— ์ƒ๊ด€์—†์ด Function, Number, Array, Object ๋“ฑ์„ ์ „๋‹ฌํ•˜๊ณ  ์ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•