🌈React
⭐개념, 장점
개념: UI를 구축하기 위한 JS 라이브러리
장점:
단점:
⭐컴포넌트(Component)
개념: App UI 구축의 기반
특징:
⭐클래스형(Class) 컴포넌트 (❌)
class App extends React.Component { render() { return; } }
- State, LifeCycle 기능
- render() 필수 작성
👀 LifeCycle (Method)
개념: 컴포넌트가 페이지에서 렌더링되기 전인 준비 과정에서 시작하여 페이지에서 사라질 때까지의 과정
- componentDid
Mount
:컴포넌트 나타남- componentDid
Update
:데이터 변경- componentDid
Unmount
:컴포넌트 사라짐
단점:- 상태(State)관련 로직이 한 공간 안에 묶여 있음
- 컴포넌트 재사용 어려움
⭐함수형(Function) 컴포넌트 (⭕)
export default function App() { return; }
특징:
- Hook 사용 -> State, LifeCycle 기능 이용
👀 useEffect
(LifeCycle 대신)개념: 컴포넌트가 렌더링 될 때마다 특정 작업을 실행할 수 있도록 하는 Hook
특징:
- 계층 변화 없이 상태 관련 로직 재사용 가능
- 서로 비슷한 것을 하는 작은 함수의 묶음으로 컴포넌트를 나눔
- 화면에 렌더링이 완료된 후 수행 || defendency 변경 시 수행
⭐Hooks
개념: 함수 컴포넌트에서 State, LifeCycle을 연동 가능하게 하는 함수
(클래스 컴포넌트의 장점을 가져온 것)
특징:
종류
-기본
useState
(동적 상태 관리): 렌더링하려면 setState 사용(직접 수정하면 안 됨), state의 불변성 유지,
useEffect
(side effect 수행 -mount/unmount/update)
useContext
(컴포넌트를 중첩하지 않고도 전역 값 쉽게 관리)
useReducer
(복잡한 컴포넌트들의 state를 관리 -분리)
useCallback
(특정 함수 재사용)
useMem
(연산한 값 재사용)
useRef
(DOM선택, 컴포넌트 안에서 조회/수정할 수 있는 변수 관리)
useImperativeHandle
useLayoutEffect
useDebugValue
-그외
custom hook
⭐상태(State)관리 라이브러리
Redux
- action, reducer, selector, store를 세팅하는 보일러플레이트 코드로 구성
- 오직 하나의 store만 가지며 하나의 객체 트리를 가져서 디버깅 용이
- store 내부 상태는 action이라는 객체에 의해서만 변경할 수 있다.
Recoil
- atom과 selector로 이루어져 있음
- Context API와 다르게 업데이트된 state 부분만 리렌더링
Rest API → react-query: API로부터 데이터 불러오기, 저장 자동화 + Recoil
GraphQL API → apollo-client + Recoil 이용
⭐Virtual DOM(Document Object Model)
개념:
UI의 이상적, 가상적 표현을 메모리에 저장
→ ReactDOM과 같은 라이브러리에 의해 실제 DOM과 동기화(재조정)하는 프로그래밍
특징: 효율성
⭐JSX(JavaScript XML)
개념: JS 문법의 확장(HTML처럼 보이는 코드를 작성할 수 있도록 함)
사용법: 컴포넌트는 대문자로 시작, props의 기본값은 true ...
Tip: JS <-> JSX 사이트 babeljs
⭐Context
React Context 공식 문서
프롭스 드릴링(Props Drilling)을 피하고 싶을 때 사용
개념: 중간 과정없이 props를 전달할 수 있는 API
특징: 컴포넌트 안에서 전역적으로 데이터를 공유할 수 있음
API 종류:
createContext
: context 생성Provider
: value
prop을 받아서 이 값을 하위 컴포넌트에게 전달Consumer
: 함수 컴포넌트안에서 context를 구독displayName
: context를 개발자 도구에서 어떻게 보여줄 지 결정import { createContext } from "react";
function App() {
const ThemeContext = React.createContext('light'); // 기본값 'light'
ThemeContext.displayName = 'MyTheme'; //"MyTheme.Provider" in DevTools
return (
<ThemeContext.Provider value="dark">
<Toolbar />
</ThemeContext.Provider>
);
}
// 중간에 낀 컴포넌트
// props 전달할 필요 X
function Toolbar() {
return (
<div>
<ThemedButton />
</div>
);
}
// 전달할 컴포넌트
import { ThemeContext } from './theme-context';
import { useContext } from "react";
function ThemedButton() {
const theme = useContext(ThemeContext);
return (
<div>
<Button color={theme} />
<div/>;
);
}
⭐성능 최적화
렌더링: UI를 어떻게 구성할지 컴포넌트에 요청하는 작업
리렌더링: 해당 컴포넌트의 모든 객체(함수 포함) 재생성
#tip JS에서는 값이 동일해도 참조 주소가 다르면 다른 객체로 인식
- 부모 컴포넌트 렌더링, props 변화, state 변화 있을 때
- UI 변화가 없는데 렌더링된다면 불필요한 시간이 소요됨
→ 이러한 불필요한 리렌더링을 막는 것이 성능 최적화
→ React가 실제로 DOM을 변화시키는지 확인
useMemo
: 메모이제이션 된 값 반환useCallback
: 메모이제이션 된 함수 반환React.Memo
: 컴포넌트 메모이제이션key
값으로 index
사용하지 않기// Bad Example
Array.map((value, index) =>
<Component key={index}>)
useState
함수형 업데이트useCallback
의 디펜던시에 값을 넣지 않아도 됨// Example
useCallback(() => {
setState((state)=>state + 1)
}, [])
// Bad Example
useCallback(() => {
setState(state + 1)
}, [state])
state & props
state
: 컴포넌트 내부에서 선언하며 내부에서 값을 변경
props
: 부모 컴포넌트가 자식 컴포넌트에게 주는 값(자식 컴포넌트에서 수정 불가)
프롭스 드릴링(Props Drilling)
개념: 해당 props가 필요없는 자식 컴포넌트까지 통해서 전달하는 상황
해결: context API, Redux, Recoil 등 사용
스타일링 방식
제어(Controlled)/비제어(Uncontrolled) 컴포넌트