Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 맥북백틱입력
- 디지털교육
- 백틱
- 스나이퍼팩토리
- 맥북백틱
- kdt
- s3
- udemy
- 유데미
- 깃허브 레포지토리와 로컬 코드 연결하기
- 개발자교육과정
- github
- 디지털하나로입학식
- 프론트엔드배포
- 부트캠프
- 네이버로그인창만들기
- DIGITALHANARO
- 웅진씽크빅
- `
- 버전생성프로세스
- 하나은행
- 프로젝트캠프
- 디지털취업
- 미래내일일경험
- 디지털하나로
- 취준생
- 프론트엔드개발자양성과정
- Next.js
- 배포
Archives
- Today
- Total
Land of Joe
session에 대한 전역상태관리 useContext 흐름 이해하기(react, ts) 본문
(시작하기에 코드의 흐름이 아닌, useContext 원리의 흐름임을 명시한다.)
예시는 웹에서 기본이 되는 로그인 정보를 담는 session에 대한 전역상태이다.
1. session-context 만들기
context를 만드는 뼈대는 다음과 같다.
// session-context.tsx
const SessionContext = createContext(); // [1]
export const SessionProvider = ({ children }: PropsWithChildren) => {
return ()
}; // [2]
export const useSession = () => useContext(SessionContext); // [3]
[1] 일단 session을 담을 context를 create할 것
[2] create한 것을 Provider로 제공해줄 것
[3] 사용하는 쪽을 위해 useSession을 만들어줄 것
이걸 시작으로 세부 내용을 채워보자.
(1) createContext() 안에 초기값을 채워줄 것
// session-context.tsx
const CounterContextInitValue = {
count: 0,
plusCount: () => {},
minusCount: () => {},
};
type TCounterContext = typeof CounterContextInitValue;
const CounterContext = createContext<TCounterContext>(CounterContextInitValue);
초기값 객체 자체를 createContext()안에 넣어주어도 되나, type 정의의 간편성을 위해
초기값을 contextInitValue로 변수화하고, 타입은 typeof를 사용해 간단하게 처리할 수 있다.
(초기값이 복잡하지 않은 경우 굳이 그럴 필요가 없겠지?!)
(2) Provider 안에 상태와, 그 상태를 조작할 함수를 생성하고, 이를 원하는 컴포넌트에 전달할 것
// session-context.tsx
export const SessionProvider = ({ children }: PropsWithChildren) => {
...(state) // [2-1]
const session = ...; // [2-2]
const logout = ...;
const login = ...;
return (
<SessionContext.Provider value={{ session, logout, login }}> // [2-3]
{children} // [2-4]
</SessionContext.Provider>
);
};
[2-1] useState를 이용해 (전역에서 사용할) 상태관리를 한다
(참고)
state가 변경되면 해당 상태를 이용하는 모든 컴포넌트는 리랜더링된다.
주의! state뿐만 아니라, ([2-2]에서 만들어진)‘함수’를 전달받아 사용하고 있는 컴포넌트 또한 리랜더링된다
왜냐? state를 가지고 있는 Provider가 새로운 function object로 재할당 → 주소가 바뀌기 때문
그래서! Provider 안에 있는 함수를 useCallback을 통해 메모이제이션할 예정임
[2-2] 상태를 조작하는 함수를 생성한다
[2-3] value를 통해 전역에 전달하고 싶은 것들(값 또는 함수)을 싣는다
[2-4] 전역상태를 받게 하고싶은 컴포넌트들을 {children}이라고 명시한 것,
전역상태를 받아서 사용할 컴포넌트들은 <SessionProvider> </SessionProvider>로 감싸줄 예정
(3) 사용하는 쪽을 위해 useSession을 만들어줄 것
전역상태를 받아서 사용할 컴포넌트들에서의 편의를 위한 코드이다.
이렇게 해놓지 않을 경우, 전역상태를 받아서 사용할 때마다 ~~을 해주어야 한다.
(주의)
export const useSession = () => useContext(SessionContext);
화살표 함수로 생성된 이유는,
useContext 자체가 아닌, useContext를 실행한 결과값이 useSession이어야 하기 때문이다.
2. session-context 사용하기
'🌐 Web > ⚛️ React' 카테고리의 다른 글
메모이제이션과 상태 관리 (useCallback, useMemo, React.memo, useReducer, ContextAPI) (0) | 2024.07.25 |
---|---|
리액트에서 로그인 처리하는 방법 (1) | 2024.07.23 |
Link와 useNavigate의 활용도 차이 (Link태그 내 이벤트 존재 시 이벤트 작동 안 함 문제 해결을 위한 useNavigate 활용) (0) | 2024.04.18 |
CRA 생성 안됨 오류 Unknown command: "create-react-app" (0) | 2024.03.01 |
[react-redux] Actions must be plain objects. 오류 (0) | 2024.01.17 |