잘못 된 내용에 대한 지적은 언제든 환영입니다.
useReducer
와 함께 사용하면 상태 관리 도구의 역할 또한 수행한다.createContext()
: 컨텍스트를 생성한다. // 인자에는 기본 값이 들어간다.
// 외부에서 조회해야 하므로 export 해준다.
export const Context = createContext(null);
👉 createContext().Provider
: 해당 컨텍스트를 통해 전역으로 사용할 값을 설정하고, 자식 컴포넌트에 전달하는 컴포넌트
// 자식들은 모두 컨텍스트의 값을 사용할 수 있다.
return (
<Context.Provider value=true>
{children}
</Context.Provider>
);
useContext()
: 컨텍스트를 조회하여 사용한다. const contextExample = useContext(Context);
설명의 편의를 위한 용어 정리(실제 사용되는 용어 아님 주의)
생성 컴포넌트 : 컨텍스트가 생성 될 컴포넌트
조회 컴포넌트 : 컨텍스트가 조회 될 컴포넌트
생성 파일 : 1이 위치한 파일
조회 파일 : 2가 위치한 파일
createContext
를 import 해준다. import { createContext } from "react";
생성 컴포넌트에서 컨텍스트로 지정할 변수를 생성하여 createContext()
함수를 통해 컨텍스트로 만들어준다.
export const Name = createContext(null);
생성 컴포넌트에서 Provider
컴포넌트를 통해 전역으로 사용할 값을 지정하고, 렌더링 할 컴포넌트들을 감싸서 반환해준다.
value
값을 지정하지 않을 경우, 위에서 지정한 기본값이 넘겨진다. return <Name.Provider value="백괴">{children}</Name.Provider>;
useContext
와 컨텍스트 변수를 import 해준다. import { useContext } from "react";
import { Name } from "./components/GetName";
useContext
함수를 넣어주고, import해준 context 변수를 파라미터로 넘겨준다. const myName = useContext(Name);
// 출력 : 제 이름은 백괴 입니다.
console.log(`제 이름은 ${myName} 입니다.`);
useReducer
를 활용한 상태 관리useReducer
의 reducer
함수에 객체를 전달하는 dispatch
함수로 설정해 주면, 전역적으로 상태 관리가 가능하다. useReducer
에 대한 내용은 챕터 14 참고) const [state, dispatch] = useReducer(reducer, initialState);
...
return (
<UserDispatch.Provider value={dispatch}>
<PassComponent />
</UserDispatch.Provider>
)
// 생성 컴포넌트
// 컨텍스트가 존재하지 않을 경우 호출
const notCtx = () => {
throw new Error("Context를 찾을 수 없습니다.");
};
// 컨텍스트 조회용 커스텀 Hook
export const useNameCtx = () => {
return useConetxt(Name) || notCtx();
};
// 조회 컴포넌트
import { useNameCtx } from "../context";
...
const name = useNameCtx();
References
"20. useReducer 를 사용하여 상태 업데이트 로직 분리하기" .velopert
"React Hooks : useReducer() 함수" .xiubindev