티스토리 뷰
5. useContext
: React의 Context API와 함께 사용
: 여러 컴포넌트에서 전역 상태를 공유 -> props drlling(props의 수직적인 전달) 회피 가능
5.1 Context
: props drlling을 극복하기 위한 개념
: 명시적인 props 전달 없이 하위 컴포넌트에서 사용 가능
5.2 Context API의 구성 및 사용 방법
- Context :: 전역 상태가 저장
- Provider :: 전역 상태를 제공, 어디까지 수평적 전달을 할지 제한, 사용할 범위를 감싸고 있어야 함
- Consumer :: 전역 상태를 사용-접근
- 3개의 절차
- Create :: createContext - DefaultValue 설정 (Provider 외부에서도 사용 가능 값)
- Provider :: CreatedContext.Provider - InitialValue 설정 (Provider 내부에서만 사용 가능 값)
- Consumer :: Provider 내부 중 Consumer 에서 전역 상태 사용
3-1) Context.Consumer
:: Consumer 내에 컴포넌트가 아닌 컴포넌트 생성 함수를 children 으로 받는다.
<Context.Consumer>{(state) ⇒ {…}}</Context.Consumer> // “전역 상태 State” 변경에 따른 리렌더 발생 시 <Context.Consumer> 내부만 리렌더
3-2) useContext
:: Consumer 내에 컴포넌트가 아닌 컴포넌트 생성 함수를 children 으로 받는다.
React.useContext(CreatedContext) // “전역 상태 State” 변경에 따른 리렌더 발생 시 해당 useContext 가진 컴포넌트 모두 리렌더
- 유의점
: 상태는 context안에 존재하여야 업데이트 시, 상관없는 것에 대한 리렌더링을 방지
: Provider의 범위와 상태 설정에 유의
- Ex)
더보기
import { createContext, useContext, useState } from 'react'
import './App.css'
function F4C() {
console.log('4')
return <>Count is</>
}
// 방법 1
// function TC() {
// console.log('3')
// const count = useContext(CreatedContext)
// return (
// <>
// <div>Count is {count}</div>
// <F4C />
// </>
// )
// }
// 방법 2
function TC() {
console.log('3')
return (
<>
<div>
<CreatedContext.Consumer>
{(item) => {
return <div>Count is {item}</div>
}}
</CreatedContext.Consumer>
</div>
<F4C />
</>
)
}
function SC() {
console.log('2')
return <TC />
}
function FC() {
console.log('1')
return <SC />
}
function NonContextComponent() {
const count = useContext(CreatedContext)
console.log('non')
return <div>Count is {count}</div>
}
const CreatedContext = createContext(-10) // default value
const CreatedContextProvider = ({ children }) => {
const [count, setCount] = useState(0)
return (
<CreatedContext.Provider value={count}>
<button onClick={() => setCount((count) => count + 1)}>count is {count}</button>
{children}
</CreatedContext.Provider>
)
}
function App() {
return (
<>
<h1>Vite + React</h1>
<div className='card'>
<CreatedContextProvider>
<div className='in-provide'>
<FC />
</div>
</CreatedContextProvider>
<div className='outside-provide'>
<NonContextComponent />
</div>
</div>
</>
)
}
export default App
참조
ASAC 수업자료
'정리용 > react' 카테고리의 다른 글
[07-React] 6-7. React Hook :: useMemo, React.memo (0) | 2025.01.17 |
---|---|
[07-React] 6-4. React Hook :: useEffect (0) | 2025.01.15 |
[07-React] 6-3. React Hook :: useRef (0) | 2025.01.15 |
[07-React] 6-2. React Hook :: useReducer (0) | 2025.01.15 |
[07-React] 6-1. React Hook :: useState (0) | 2025.01.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- useLayoutEffect
- useReducer
- asac#asac7기
- ASAC
- git
- useContext
- react
- acas#acas7기
- useCallback
- useMemo
- useState
- asac7
- useEffect
- asac7기
- acac
- Nginx
- memo
- useRef
- ssh
- asac7#asac
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함