✔️ React에서 사용자 입력 처리하기
- const [state, setState] = useState()의 파라미터로 객체를 전달하여 함수 재사용
- useState("초기값") 지정, input 태그에서 그 값을 활용할 때 onChange 이벤트 내 setState 함수를 호출해야 키보드 입력 시 state 변화
- 객체의 기본 값을 활용할 때 스프레드 연산자(...객체명) 이용, 스프레드 연산자는 변경하고자 하는 프로퍼티 앞에 사용
- setState({ ...state, [e.target.name]: e.target.value });
✔️ React에서 DOM 조작하기 - useRef
- useRef() 호출 반환 값 = React.MutableRefObject<undefined> : HTML DOM 요소 접근
- <input ref="레퍼런스객체"/> 레퍼런스객체.current : 현재 가리키는 값
✔️ React에서 배열 사용하기 1 - 리스트 렌더링(조회)
- map( (it) => { // 반복할 내용 } )
- map으로 반복 시 각 반복 시 고유한 id(또는 idx) 지정해야 함 -> 자식 컴포넌트에 id 부여 ex. <div key={it.id}>
- 컴포넌트명.defaultProps 로 초기값을 지정하면 props로 undefined가 내려와도 에러 방지
- 렌더링된 아이템을 별도의 컴포넌트로 분리할 수 있음
✔️ React에서 배열 사용하기 2 - 데이터 추가하기, 데이터 삭제하기
- 리액트에서는 같은 레벨(트리)끼리 데이터 주고받기 불가 -> 단방향 데이터 흐름
- 데이터를 공통 부모요소로 끌어 올리기(State 끌어 올리기) : 자식요소에 data(state) 렌더링 및 setData(setState) Props로 전달
- Event(UP 자식->부모) Data(Down 부모->자식)
✔️ React의 Lifecycle 제어하기 - useEffect
- Component Mount(ex. 초기화 작업) -> Update(re-render, ex. 예외 처리 작업) -> Unmount(ex. 메모리 정리 작업)
- Class React Component Only(cf. 함수형 컴포넌트 X) : Mount(ComponentDidMount), Update(ComponentDidUpdate), Unmount(ComponentWillUnmount)
- 본래 State도 클래스 컴포넌트만 사용할 수 있는 기능이지만, 함수형 컴포넌트에서는 'Hooks'(useState, useEffect, useRef)를 통해 클래스형 컴포넌트 기능을 사용
- 굳이 클래스형 컴포넌트 대신 함수형 컴포넌트를 사용하는 이유 : 컴포넌트 코드 길이 문제, 중복 코드 및 가독성 문제 해결
- useEffect를 통해 컴포넌트의 Lifecycle를 관리
- useEffect( () => { // to do.. CALLBACK함수 }, [Dependency Array 의존성 배열] ); // 의존성 배열 내의 값이 변화하면 콜백 함수가 수행됨
- Mount : 의존성 배열에 빈 배열 [] 을 전달하게 되면, 컴포넌트가 마운트 되는 시점에만 콜백 함수 동작
- Update : 컴포넌트가 업데이트 될 때 1) State 변경 2) 부모로부터 내려받는 Props 변화 3) 부모 컴포넌트 리렌더 -> 의존성 배열 없이 콜백 함수만 작성하는 경우 Update될 때 마다 콜백 함수 동작 OR 의존성 배열에 [state] 의 형태로 작성하는 경우 state가 변화할 때 마다 콜백 함수 동작
- UnMount : 콜백 함수 내 return값 부여
✔️ React에서 API 호출하기
- async, fetch 함수 이용해서 더미 데이터 넣기
✔️ React Devloper Tools
✔️ 최적화 1 - useMemo
- Memoization : 이미 계산한 연산 결과를 기억해 두었다가, 동일한 계산 시 다시 연산하지 않고 기억해 두었던 데이터를 반환하는 방법
- object의 경우 비원시(객체) 타입이라 값이 저장될 때 마다 메모리 주소가 달라짐, 이를 해결하기 위해 useMemo 사용
- return을 가지고 있는 함수를 Memoization해서 연산 최적화
- useMemo : Memoization하고 싶은 함수를 콜백 함수 형태로 감싸서 사용 + Dependency array
- useMemo는 함수가 아니라, 콜백 함수 내에서 return하는 값을 리턴 cf. 콜백함수(); - (X)
✔️ 최적화 2 - React.memo
- 부모 컴포넌트 업데이트 시 자식 컴포넌트가 무조건 렌더링 되지 않고, 조건부로 렌더링하기 위해 사용 -> 성능 최적화
- React.memo : 함수형 컴포넌트에 업데이트 조건 걸기, HOC
- HOC(Higher Order Component) : 컴포넌트를 가져와(매개변수) 새로운 컴포넌트 반환, 컴포넌트 로직 재사용
- React.memo로 조건부로 렌더링할 컴포넌트를 감싸서 사용
- 다만 부모가 아닌 자신의 state가 업데이트 되는 경우 리렌더링
- 자바스크립트는 비원시 타입의 자료형(ex. 객체, 함수, 배열)을 비교할 때 얕은 비교를 함(객체의 메모리 주소에 의한 비교)
✔️ 최적화 3 - useCallback
- 메모이제이션된 콜백 반환 cf. useMemo : 값 반환
- Dependency Array [a, b] 중 두 번째 인자인 b가 변하지 않는다면 첫 번째 인자로 전달한 콜백 함수 a를 계속 재사용 할 수 있게 해줌
- 함수가 컴포넌트가 재생성될 때 다시 생성되는 되는 이유 : 현재의 State값을 참조하기 위해
- 함수형 Update : 상태 변화 set 함수에 값 대신 함수 전달 -> Dependency array로 빈 배열 [] 을 전달해 마운트 시점에만 업데이트 되도록 설정해도, 업데이트 시 기존 data 값을 잃지 않고 최신의 state를 인자를 통해 참조
✔️ 복잡한 상태의 로직 분리하기 - useReducer
- useReducer : 컴포넌트 밖으로 상태 변화 로직 분리
- const [state, dispatch] = useReducer(reducer, 초기값);
- dispatch : 상태를 변화시키는 action을 발생시키는 함수, 상태 변화 raise
- reducer : 상태 변화를 처리하는 함수
- dispatch(action 객체) -> action 객체 = { type : '처리 구분값', action에 필요한 데이터 }
✔️ 컴포넌트 트리에 데이터 공급하기 - Context
- context : 문맥, 컴포넌트 트리에 전역적으로 데이터 공급
- props drilling 방지
- Context 생성 : const MyContext = React.createContext(defaultValue);
- Context Provider를 통한 데이터 공급 : <MyContext.Provider value={ 전역으로 전달하고자 하는 값 }> { /*Context 안에 위치할 자식 컴포넌트들*/ } </MyContext.Provider>
참고) 한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
'React' 카테고리의 다른 글
리덕스 기본 개념 : Redux Essentials Tutorial (0) | 2022.11.21 |
---|---|
React 실전 프로젝트 - 감정 일기장 만들기 (0) | 2022.10.21 |
React.js 기초 (0) | 2022.10.02 |
Node.js 기초 (0) | 2022.10.02 |
React study log (0) | 2022.09.19 |