부품 단위로 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>
</>
);
}