- useContext는 컴포넌트에서 context를 읽고 구독할 수 있게 해주는 React 훅이다.
- useContext() 는 항상 호출하는 컴포넌트의 트리상 위의 가장 가까운 provider를 찾고, useContext()를 호출하는 컴포넌트 내의 provider는 고려하지 않는다.
Specifying a fallback default value(fallback 기본값 지정하기)
- React가 부모 트리에서 특정 context의 provider들을 찾을 수 없는 경우, useContext()가 반환하는 context 값은 해당 context를 생성할 때 지정한 기존 값과 동일하다.
const ThemeContext = createContext(null);
- 기본값은 절대 변경되지 않으며, context를 업데이트하려면 state를 사용해야 한다.
Overriding context for a part of the tree(트리 일부에 대한 context 재정의하기)
- 트리의 일부분을 다른 값의 provider로 감싸 해당 부분에 대한 context를 재정의할 수도 있다.
<ThemeContext.Provider value="dark">
...
<ThemeContext.Provider value="light">
<Footer />
</ThemeContext.Provider>
...
</ThemeContext.Provider>
- context provider들을 중첩할 때 정보를 "누적"할 수 있다.
// App.js
import Heading from './Heading.js';
import Section from './Section.js';
export default function Page() {
return (
<Section>
<Heading>Title</Heading>
<Section>
<Heading>Heading</Heading>
<Heading>Heading</Heading>
<Heading>Heading</Heading>
<Section>
<Heading>Sub-heading</Heading>
<Heading>Sub-heading</Heading>
<Heading>Sub-heading</Heading>
<Section>
<Heading>Sub-sub-heading</Heading>
<Heading>Sub-sub-heading</Heading>
<Heading>Sub-sub-heading</Heading>
</Section>
</Section>
</Section>
</Section>
);
}
// Section.js
import { useContext } from 'react';
import { LevelContext } from './LevelContext.js';
export default function Section({ children }) {
const level = useContext(LevelContext);
return (
<section className="section">
<LevelContext.Provider value={level + 1}>
{children}
</LevelContext.Provider>
</section>
);
}
// Heading.js
import { useContext } from 'react';
import { LevelContext } from './LevelContext.js';
export default function Heading({ children }) {
const level = useContext(LevelContext);
switch (level) {
case 0:
throw Error('Heading must be inside a Section!');
case 1:
return <h1>{children}</h1>;
case 2:
return <h2>{children}</h2>;
case 3:
return <h3>{children}</h3>;
case 4:
return <h4>{children}</h4>;
case 5:
return <h5>{children}</h5>;
case 6:
return <h6>{children}</h6>;
default:
throw Error('Unknown level: ' + level);
}
}
// LevelContex.js
import { createContext } from 'react';
export const LevelContext = createContext(0);
- 위 예제에서 Section 컴포넌트는 중첩의 깊이를 지정하는 LevelContext를 추적한다.
* 참고 : React 공식문서(https://react-ko.dev/learn)
'이것저것 스터디📚 > React - 공식 문서' 카테고리의 다른 글
React 공식문서 -<Suspense> (0) | 2023.09.13 |
---|---|
React 공식문서 -memo (0) | 2023.09.07 |
React 공식문서 -useReducer (0) | 2023.09.06 |
React 공식문서 -useCallback (0) | 2023.08.31 |
React 공식문서 -useMemo (0) | 2023.08.30 |