Redux

์ด๋™์–ธยท2024๋…„ 9์›” 26์ผ

new world

๋ชฉ๋ก ๋ณด๊ธฐ
50/62
post-thumbnail

9.26(๋ชฉ)

1. redux

๐Ÿ‘‰ react์—์„œ์˜ store๋ฅผ ์ด์šฉํ•œ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๐Ÿ“Œ npm install @reduxjs/toolkit : createSlice, configurestore
๐Ÿ“Œ npm install redux : redux ํ•ต์‹ฌ๊ธฐ๋Šฅ
๐Ÿ“Œ npm install react-redux : react์™€ redux๋ฅผ ์—ฐ๊ฒฐ

1-1. store

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;






1-2. rtk.ts

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




1-3. main.tsx

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>
)




1-4. countSlice.ts

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์„ ๊ด€๋ฆฌ




1-5. ํ˜ธ์ถœํ•˜๊ณ ์‹ถ์€๊ณณ

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์†์„ฑ์ด ๋ณ€ํ•˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜์žˆ๋‹ค.




2. member redux

2-1. signinSlice.ts

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




2-2. store.ts

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

3-1. useCheckAuth.ts

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์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

3-2. signinSlice.ts

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๋ฅผ ์ด์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฒ”์œ„์„ค์ •

0๊ฐœ์˜ ๋Œ“๊ธ€