[예시]
기획자가 요청한 웨데이터의 버튼이 같은 모양으로 다른 위치에 옮기는 걸 요청할때,
새로운 버튼을 만들고 전체 페이지를 렌더링하는게 아니라 버튼 컴포넌트를 만들어놓고 재사용하면서 위치만 변경 시킴
< 구조화된 CSS가 필요하게 된 이유 : CSS 단점 >
< 문제 해결 >
💡 전처리기란?
처리에 있어서 중심적인 처리를 수행하는 부분을 위해 준비적인 계산을 함
: CSS 전처리기의 문제를 보완하기 위해 BEM, OOCSS, SMACSS 같은 CSS 방법론이 나옴
.header>.logo
-> 이로 인해 개발자들이 유일한 클래스명을 선택하는 것에 의존
애플리케이션으로 개발 방향이 진화되면서 컴포넌트 단위의 개발은 캡술화의 중요성이 대두
-> CSS를 컴포넌트 방식으로 만들기 위해 CSS-in-JS 탄생
class, id 작명에 대한 고민
CSS 파일 안에서 찾고자 하는 부분 찾기 힘듬
CSS 파일안의 용량이 너무 많아 파일을 쪼개서 관리
스타일 속성이 겹쳐서 내가 원하는 결과가 나오지를 않음
➡️ 이런 단점들을 해결해줄 라이브러리가 바로 Styled Components
CSS in JS 라이브러리를 사용하면 CSS도 쉽게 Javascript안에 넣어줄 수 있고, HTML+JS+CSS까지 묶어서 하나의 JS파일 안에서 컴포넌트 단위로 개발을 할 수 있음
➡️ CSS in JS 라이브러리 중에서 가장 인기 있는 라이브러리가 바로 Styled Components
// with npm
npm install --save styled-components@latest
//with yarn
yarn add styled-components
컴포넌트 만들기 (링크)
styled.태그종류
를 할당하고, 백틱안에 기존에 CSS를 작성하던 문법과 동일하게 스타일 속성을 작성컴포넌트를 재활용해서 새로운 컴포넌트 만들기 (링크)
: 이미 만들어진 컴포넌트를 재활용해서 새로운 컴포넌트를 만들 수 있음
styled()
에 재활용할 컴포넌트를 전달해준 다음에 추가하고 싶은 스타일 속성 작성
props 활용하기
: Styled Component로 만든 컴포넌트를 react 컴포넌트처럼 props로 내려줄 수 있으며 내려준 props 값에 따라서 컴포넌트를 렌더링 하는 것도 가능
`${}
을 사용해서 Javascript코드를 사용할 수 있음
1) Props로 조건부 렌더링하기 (링크)
[예시]
<button>
컴포넌트에 skyblue
라는 props가 있는지 확인하고 있으면 배경색을 skyblue
로 지정, 없으면 `white
로 지정해주는 코드 작성
2) Props 값으로 렌더링하기 (링크)
[예시]
- props의 값을 통째로 활용해서 컴포넌트 렌더링에 활용
- props.color
가 없다면 white
를 props.color
가 있다면 props.color
의 값을 그대로 가져와서 스타일 속성 값으로 리턴해줌 (2개 이미지는 같은 결과값을 가져옴)
전역 스타일 설정하기
- 전역 스타일 설정을 위해 Styled Components에서 createGlobalStyle
함수를 불러옴
import { createGlobalStyle } from "styled-components";
- ccs 스타일 작성
const GlobalStyle = createGlobalStyle`
button {
padding : 5px;
margin : 2px;
border-radius : 5px;
}
`
- 컴포넌트를 최상위 컴포넌트에 사용
function App() {
return (
<>
<GlobalStyle />
<Button>전역 스타일 적용하기</Button>
</>
);
}
npx create- react-app storybook-practice
npx storybook@latest init
npm run storybook
➡️ 이럴때 사용하는 것이 바로 useRef
[예시]
import React, { useState, useRef } from 'react';
const App = () => {
const [count, setCount] = useState(0);
const countRef = useRef(0);
console.log ('🎨 렌더링..');
// useState함수를 클릭하면 전체 화면의 리렌더링이 되면서 state값이
// 올라가고 내부적으로 올라갔던 ref의 증가된 값도 나타남
const increasecounetState= () => {
setCount(count + 1);
};
// useRef는 렌더링이 되지 않기 때문에 내부적으로는
// 값이 1씩 증가하지만 표시되지 않음
const increaseCountRef = () => {
countRef.current = countRef.current + 1;
console.log('Ref: ', countRef.current);
};
return (
<div>
<p>State: {count}</p>
<p>Ref: {countRef.current}</p>
<button onClick={increaseCountState}>State 올려</button>
<button onClick={increaseCountRef}>Ref 올려</button>
</div>
);
};