부품 단위로 UI 컴포넌트를 만들어 나가는 개발 진행(상향식 개발)
재활용할 수 있는 UI컴포넌트
프로젝트의 규모나 복잡도 심화 + 다양한 디바이스들의 등장으로 복잡해진 CSS
➡️ CSS 전처리기 등장 (CSS Preprocessor - CSS 구조적으로 작성될 수 있게 도움주는 도구)
➡️ 구조화된 CSS 필요도 증가 (각 CSS 전처리기에 맞는 Compiler 사용하여 CSS 문서로 변환)
➡️ 코드의 재사용성, 간결화(유지보수 용이), 확장성, 예측성(클래스명으로 의미 예측 가능)
① SASS (Syntactically Awesome Style Sheets)
② BEM
|Block| |-Element-| |Modifier|
.header__navigation--navi-text{
color:red;
}
③ Styled-Component (CSS in JS)
터미널 명령
npm install --save styled-componenets
yarn add styled-componenets
package.json에 다음 코드 추가 ➡️ 여러 버전의 Styled Componenes 가 설치되어 발생하는 문제 방지
{
"resolutions": {
"styled-components": "^5"
}
}
import styled from "styled-components"백틱 ` 사용 const 컴포넌트이름 = styled.태그종류`
css속성:속성값;
...
`;
styled()에 재활용할 컴포넌트 전달 const 컴포넌트이름 = styled(재활용할 컴포넌트)`
추가할 css속성:속성값;
...
`;
${ } 사용 const 컴포넌트이름 = styled.태그종류`
css속성: ${(props) => 함수코드 };
`;
createGlobalStyle 함수 불어오와 컴포넌트 GlobalStyle에 스타일 작성 후 최상후 컴포넌트로 사용해줌 import { createGlobalStyle } from "styled-componenets";
const GlobalStyle = createGlobalStyle`
//스타일
`;
const Button = styled.button`
padding: 1rem;
font-size: 2rem;
background: powderblue;
border-radius: 1rem;
transition: 0.5s;
//& 사용
&:hover {
background: cornflowerblue;
color: white;
transition: 0.5s;
}
`;
✅ 저장공간
State의 변화 ➡️ 렌더링 ➡️ 컴포넌트 내부 변수들 초기화 (원하지 않는 렌더링)
Ref의 변화 ➡️ No 렌더링 ➡️ 변수들의 값이 유지됨 (불필요한 렌더링 막음)
State의 변화 ➡️ 렌더링 ➡️ 그래도 Ref의 값은 유지됨
const refContainer = useRef(initialValue);
useRef 는 .current 프로퍼티로 전달된 인자(initialValue)로 초기화된 변경 가능한 ref 객체를 반환한다. 반환된 객체는 마운트되고 언마운트 되기 전까지 컴포넌트의 전 생애주기를 통해 유지된다.
useState 는 값이 바뀌는 것이 렌더링될 때마다 확인가능하지만,
useRef는 .current 프로퍼티를 변형하는 것이 렌더링과 상관없이 값이 바뀐다.
그렇다면 ref 대신 변수를 써도 되지 않냐 싶지만!
useRef는 마운팅한 이후 언마운팅하기 전까지 유효한 값이 유지된다.
var는 렌더링이 될 때마다 0으로 재할당되기 때문에 유효한 값을 앱을 사용할 때까지 유지시키려면 useRef를 사용한다.
✅ DOM 요소에 접근
<div ref={Ref} />를 사용하여 React 로 ref 객체를 전달한다면, React 는 노드가 변경될 때마다 변경된 DOM 노드에 그것의 .current 프로퍼티를 설정할 수 있다.
첫 렌더링시, input 태그에 focus 설정이 되어 있고 텍스트를 입력하고 로그인 버튼을 누른 후에도 focus 설정이 되도록 함
function App() {
const inputRef = useRef()
useEffect(()=>{
inputRef.current.focus();
},[]);
const logIn = () => {
alert(`환영합니다 ${inputRef.current.value}`);
inputRef.current.focus();
};
return(
<>
<input ref={inputRef} type="text" placeholder="username"/>
<button onClick={logIn}>로그인</button>
</>
);
}