사이드 프로젝트
React context를 활용하여 modal state 관리하기
jfmam
2023. 4. 1. 00:31
modal 창 달기
- modal 창 달기 시 컴포넌트가 여기저기 분리가 되어 있다.
- menu icon에 있는 state에 따라 modal창이 켜질지 말지 여부가 정해져 있다…
- modal창은 header영역의 색도 같이 변해야 한다. 때문에 또한 어떤 페이지에서도 동작해야 하기 때문에 위치해야 하는 컴포넌트는 app.tsx가 되야 될거같다.
방법
- 이번 프로젝트 중 modal창 toggle 기능을 만들어야 했다.
- modal창을 켰을 때
- menu icon 버튼 디자인 변경
- header background color 변경
- contents component 대신 modal창 켜져야함
다양한 컴포넌트에서 변경이 일어나기 때문에 modal toggle state를 전역적으로 관리하기로 변경하였다.
그래서 해결방법으로 context api를 사용할 것이다
사용방법
- context 생성하기
- context provider component만들기
- context dispatch, state hooks 만들기
Dispatch 와 State provider 분리하기
- 같이 관리 할경우 불필요한 리렌더링이 발생한다.
- 현재 Modal창을 관리할때 dispatch 함수는 리렌더링이 일어나지 않아도 되기 때문에 state만 렌더링이 일어나서 변경 될 수 있게 바꾸어준다.
예시코드
import { createContext, ReactNode, Dispatch, SetStateAction, useState, useContext } from 'react';
interface ModalContextProps {
children: ReactNode;
}
const ModalStateContext = createContext<boolean>(false);
const ModalDispatchContext = createContext<Dispatch<SetStateAction<boolean>>>(() => null);
export function ModalContext({ children }: ModalContextProps) {
const [isOpenModal, setIsOpenModal] = useState(false);
return (
<ModalDispatchContext.Provider value={setIsOpenModal}>
<ModalStateContext.Provider value={isOpenModal}>{children}</ModalStateContext.Provider>
</ModalDispatchContext.Provider>
);
}
export function useModalState() {
const state = useContext(ModalStateContext);
return state;
}
export function useModalDispatch() {
const dispatch = useContext(ModalDispatchContext);
return dispatch;
}
reference
https://react.vlpt.us/using-typescript/04-ts-context.html
4. TypeScript 와 Context API 활용하기 · GitBook
4. TypeScript 와 Context API 활용하기 이번에는 TypeScript 와 Context API 를 활용하는 방법을 배워보겠습니다. 이번에 배울 것은 3장의 섹션2 Context API를 활용한 상태관리와 매우 유사합니다. State를 위한 Co
react.vlpt.us