useContext
는 컴포넌트에서 context를 읽고 구독할 수 있게 해주는 React Hook이다.
const value = useContext(SomeContext)
🍪 컴포넌트의 최상위 레벨에서 사용해야 한다.
🍪 context 자체는 정보를 보유하지 않으며, 컴포넌트에서 제공하거나 읽을 수 있는 정보의 종류를 나타낸다.
🍪 useContext
를 사용하면 현재 컴포넌트에서 context 값을 반환히며. 컴포넌트는 context가 변경될 때 해당 context를 사용하는 자식 컴포넌트를 자동으로 리렌더링한다.
🍪 useContext()
호출은 항상 해당 컴포넌트 위에 있는 가장 가까운 provider에서 값을 찾으므로, 해당 <Context.Provider>
는 useContext()
호출을 수행하는 컴포넌트의 위에 있어야 한다.
이를 통해 상위에서 context 값을 가져오거나 defaultValue
를 가져오거나 할 수 있다.
🍪 context를 통해 전달된 데이터 업데이트하기
🍪 context를 통해 객체와 함수를 포함한 모든 값을 전달할 수 있다.
🍪 useContext
로 가져온 값은 렌더링마다 새로운 객체가 되고 변경된 context 값을 사용하는 모든 하위 컴포넌트도 리렌더링하게 되는데 따라서 리렌더링을 최적화를 위해 useCallback
으로 래핑하거나 객체 생성을 useMemo
로 래핑한다.
➕ useState, useReducer, useContext 차이 요약 (중간 정리)
useState
는 로컬 상태를 관리하는 데 사용되며, useReducer
는 복잡한 상태 관리와 업데이트 로직을 분리하는 데 사용된다. useContext
는 전역 상태를 공유하기 위해 사용된다.useState
는 count
라는 상태 변수와 이를 업데이트하는 setCount
함수를 제공한다. 버튼을 클릭하면 count
가 증가하고 렌더링이 업데이트된다.useReducer
를 사용하여 상태 변수 count
를 관리한다. reducer
함수를 사용하여 상태 업데이트 로직을 분리하고, 버튼을 클릭하면 dispatch
를 통해 increment
액션을 디스패치합한다.useContext
를 사용하여 ThemeButton
컴포넌트에서 테마를 읽는다. ThemeContext.Provider
로 테마 값을 제공하고 버튼의 스타일을 테마에 따라 변경한다.useRef
는 렌더링에 필요하지 않은 값을 참조할 수 있는 React 훅이다.
const ref = useRef(initialValue)
🍪 initialValue
: ref 객체의 current
프로퍼티 초기 설정값, 초기 렌더링 이후부터는 무시되는 값
🍪 컴포넌트의 최상위 레벨에서 호출하여 ref 객체를 선언합니다. 이렇게 선언한 ref 객체는 특정 요소를 가리키거나 다른 데이터를 참조할 때 사용된다.
🍪 useRef
는 ref 객체를 반환하며, 이 ref 객체는 current
라는 단일 프로퍼티를 가진다. current
프로퍼티의 초기값은 initialValue
로 설정된다.
🍪 ref.current
프로퍼티는 일반 state와 달리 직접적으로 변경 가능하다. React는 ref.current
의 변화를 감지하지 않으므로 이 값을 직접 업데이트할 때 리렌더링이 발생하지 않는다.
🍪 ref 내부 작동 방식
function useRef(initialValue){
const [ref, unused] = useState({ current, initialValue});
return ref;
} // 리렌더링 촉발X
// 로컬로 저장 (컴포넌트에 저장되는 건 X)
🍪 useRef
는 초기값으로 설정된 initialValue
로 current
프로퍼티를 가진 ref 객체를 반환합니다. useRef
의 주요 용도는 렌더링 중에는 ref.current
를 읽거나 변경하지 않는 것입니다.
🍪 렌더링 중에 어떤 값을 읽거나 쓰려면 useRef
가 아닌 상태(state)를 사용해야 한다. Ref는 주로 렌더링과 무관한 작업에서 사용된다.
❓ ref를 쓰는 경우와 state를 쓰는 경우 차이
💡"ref"는 DOM 요소나 다른 컴포넌트에 직접 액세스하고 조작할 때 사용되며, "state"는 컴포넌트의 내부 데이터 상태를 관리하고 상태 변경에 따라 UI를 업데이트할 때 사용된다.
🍪 useRef
로 input 요소 등을 참조하고, 필요한 경우 forwardRef
를 사용하여 해당 ref를 부모 컴포넌트로 노출시킬 수 있다. 이를 통해 부모 컴포넌트에서 자식 컴포넌트의 DOM 요소나 메소드를 직접 제어할 수 있다.
➕ useState, useReducer, useContext, useRef 차이 (중간 정리)
useState
훅은 함수형 컴포넌트에서 상태(state)를 관리할 때 사용, 주로 컴포넌트의 내부 데이터를 저장하고 업데이트하는 데 활용useReducer
훅은 상태 관리를 위해 사용되며, 특히 복잡한 상태 논리를 다룰 때 유용. 리듀서 함수와 초기 상태를 사용하여 컴포넌트의 상태를 업데이트하며, dispatch
함수를 통해 상태를 변경useContext
훅은 React 컨텍스트를 활용하여 컴포넌트 트리 전체에서 상태를 공유하고 접근할 때 사용, 주로 상태나 설정, 로그인 정보와 같이 여러 컴포넌트에서 공유되어야 하는 데이터를 전달하는 데 사용useRef
훅은 DOM 요소를 참조하거나 함수 컴포넌트 내에서 변수를 유지할 때 사용, 주로 DOM 조작, 애니메이션, 이전 값을 유지하는 데 사용된다. 상태 업데이트에 영향을 주지 않고 데이터를 저장하려고 할 때 유용