import { createContext } from "react";
const GameBoardStateContext = createContext(initState});
export type Action = { type: "UPDATE"; payload };
액션에 따라 state를 변경시키는 로직을 작성할 수 있습니다.
import { Action } from "@/actions/gameBoardAction";
import { GameBoardState } from "@/contexts/gameBoardContext";
const gameBoardReducer = (state: GameBoardState, action: Action): GameBoardState => {
switch (action.type) {
case "UPDATE":
return {
...action.payload,
// 변경되는 payload 로직 작성
};
default:
throw new Error("Unhandled action");
}
};
export const ContextProvider = ({ children }: { children: React.ReactNode }) => {
const [gameBoard, gameBoardDispatch] = useReducer(gameBoardReducer, initState);
return (
<GameBoardStateContext.Provider value={gameBoard}>{children}</GameBoardStateContext.Provider>
);
};
const App = () => {
return (
<>
<ContextProvider>// 하위 컴포넌트들</ContextProvider>
</>
);
};
import { useContext } from "react";
const state = useContext(GameBoardStateContext);
export const focusChange = (payload) => {
return {
type: "focusChange",
payload,
};
};
Copy to clipboard
Reducer 생성
초기 상태를 설정하고, Action을 type으로 구별하여 상태를 업데이트하는 로직을 Reducer로 작성합니다.
const initialState = {
startDate: null,
endDate: null,
focusedInput: START_DATE,
};
const datePickerReducer = (state = initialState, action) => {
switch (action.type) {
case "focusChange":
return { ...state, focusedInput: action.payload };
default:
return state;
}
};
import { createStore } from "redux";
const store = createStore(datePickerReducer);
Copy to clipboard
react-redux의 Provider로 root에 store 등록
Entry 파일에서 Provider에 store를 등록합니다.
import { Provider } from "react-redux";
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
rootElement
);
상태 값을 사용하고자 하는 컴포넌트에서 useSelector로 상태 객체를 꺼내서 사용할 수 있습니다.
아래는 state를 distructuring한 모습입니다.
import { useSelector } from "react-redux";
const {
datePickerReducer: { startDate, endDate },
} = useSelector((state) => state);