
๐ react์์์ store๋ฅผ ์ด์ฉํ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ npm install @reduxjs/toolkit : createSlice, configurestore
๐ npm install redux : redux ํต์ฌ๊ธฐ๋ฅ
๐ npm install react-redux : react์ redux๋ฅผ ์ฐ๊ฒฐ
import {configureStore} from "@reduxjs/toolkit";
import CountSlice from "./slices/countSlice.ts";
const projectStore = configureStore({
reducer: {
count: CountSlice
}
})
// Infer the `RootState` and `AppDispatch` types from the store itself
export type RootState = ReturnType<typeof projectStore.getState>
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
export type AppDispatch = typeof projectStore.dispatch
export default projectStore;
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import type { RootState, AppDispatch } from '../store'
// Use throughout your app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch: () => AppDispatch = useDispatch
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
import { createRoot } from 'react-dom/client'
import './index.css'
import {RouterProvider} from "react-router-dom";
import mainRouter from "./router/mainRouter.tsx";
import {Provider} from "react-redux";
import projectStore from "./store.ts";
createRoot(document.getElementById('root')!).render(
<Provider store={projectStore}>
<RouterProvider router={mainRouter}></RouterProvider>
</Provider>
)
import {createSlice} from "@reduxjs/toolkit";
export interface ICount{
num: number
}
const initialState: ICount = {
num: 5
}
const countSlice = createSlice({
name: "count",
initialState: initialState,
reducers: {
increment: (state, action) => {
console.log(state, action)
return {num: state.num+1}
},
decrement: (state, action) => {
console.log(state, action)
return {num: state.num-1}
}
}
})
export const {increment, decrement} = countSlice.actions;
export default countSlice.reducer
๐ state: ํ์ฌ Redux์คํ ์ด์ ์ํ๋ฅผ ๋ํ๋
๐ slice : redux์คํ ์ด์ ํน์ ์ํ ์กฐ๊ฐ์ ๊ด๋ฆฌํจ. ํ์ฌ ์์์์๋ count์ num์ ๊ด๋ฆฌ
function MainPage() {
const dispatch = useDispatch();
const countState = useAppSelector(state => state.count);
console.log(countState);
const handleClick = useCallback(() => {
dispatch(increment(null))
},[])
return (
<BasicLayout>
<div>{countState.num}</div>
<button onClick={() => handleClick()}>Button</button>
</BasicLayout>
);
}
export default MainPage;
๐ dispatch : ์ก์ ์ ์คํ ์ด์ ์ ๋ฌํ๋ ํจ์๋ก, Button์ ๋๋ฌ increment์ก์ ์ ๋์คํจ์นํ์ฌ ์คํ ์ด์ ์ํ๋ฅผ ์ ๋ฌํ๋ค.
๐ useAppSelector : Redux์คํ ์ด ๋ด์์๋ count์ํ๋ฅผ ์ ํํ๋ค.
๐ countState.num : countState์์์๋ num์์ฑ์ด ๋ณํ๋๊ฒ์ ๋ณผ ์์๋ค.
import {createSlice} from "@reduxjs/toolkit";
const signinSlice = createSlice({
name: "signin",
initialState: {},
reducers: {
signin : (state, action) => {
console.log("signin")
console.log(state, action)
},
signout: (state, action) => {
console.log("signout")
console.log(state, action)
}
}
})
export const {signin, signout} = signinSlice.actions;
export default signinSlice.reducer
import {configureStore} from "@reduxjs/toolkit";
import CountSlice from "./slices/countSlice.ts";
import signinSlice from "./slices/signinSlice.ts";
const projectStore = configureStore({
reducer: {
count: CountSlice,
signin: signinSlice
}
})
// Infer the `RootState` and `AppDispatch` types from the store itself
export type RootState = ReturnType<typeof projectStore.getState>
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
export type AppDispatch = typeof projectStore.dispatch
export default projectStore;
๐ npm install react-cookie
import useSignin from "./useSignin.ts";
import {Cookies} from "react-cookie";
const cookies = new Cookies();
const useCheckAuth = () => {
const {member, doSignout, doSignin} = useSignin()
const check = () => {
const stateEmail = member.email
if(stateEmail){
return stateEmail
}
const cookieValue = cookies.get("member")
if(!cookieValue){
return null
}
}
return{check}
}
export default useCheckAuth
๐ ์ฟ ํค ๊ฐ์ฒด ๊ฐ์ ธ์์ member์ฟ ํค๊ฐ ์๋์ง ํ์ธ
import {createSlice} from "@reduxjs/toolkit";
import {IMember} from "../types/member.ts";
import {Cookies} from "react-cookie";
const cookies = new Cookies();
const initialState:IMember = {
email: "",
}
const signinSlice = createSlice({
name: "signin",
initialState: initialState,
reducers: {
signin : (state, action) => {
console.log("signin")
console.log(state, action)
const email = action.payload.username
const result = {email:email}
cookies.set("member", JSON.stringify(result), {path:"/", maxAge: 60*60*24*7}) // stringify: ์๋ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด
return {email:email}
},
signout: (state, action) => {
console.log("signout")
console.log(state, action)
return {...initialState}
}
}
})
export const {signin, signout} = signinSlice.actions;
export default signinSlice.reducer
๐ ์ฟ ํค๊ฐ์ฒด ์์ฑํ๊ณ , ๋ก๊ทธ์ธ์ชฝ์ cookie.setํ์ฌ ์ฟ ํค์ด๋ฆ ๋ฐ email๊ฐ์ฒด๊ฐ์ ์์ฑํ๊ธฐ์ํด JSON.stringify ์ฌ์ฉ
๐ path๋ฅผ ์ด์ฉํ์ฌ ์ํ๋ ๋ฒ์์ค์