Skip to content

Setup redux like a pro in your reactjs project

Lilhuy

Introduction

Redux and core concepts

Redux core concepts
Redux core concepts flow

The core components of Redux are:

In reactJs, Redux usually use when you need a global state that can be access across all components in your app. Such as the information about logged-in user,…etc.

Let’s code

yarn create vitebash
yarn add @reduxjs/toolkit react-reduxbash
src
│   main.tsx
│   App.tsx    

└───state
│   │   index.ts
│   └───user
│       │   reducer.ts
│       │   hooks.ts
│       │   index.ts

└───components
│   Home.tsx
│   ...tree
//src/user/reducer.ts
import { createSlice } from "@reduxjs/toolkit";
export type UserStateType = {
    name: string;
    address: string;
    role: string;
}

const initialState: UserStateType = {
    address: "",
    name: "",
    role: "",
}
const userSlice = createSlice({
    initialState,
    name: "user",
    reducers: {
        setUser: (state, action) => {
            return action.payload
        },
    }
})
const { actions, reducer } = userSlice;
export const {
    setUser
} = actions
export default reducer;reducer.ts
// src/state/user/hook.ts
import { useDispatch, useSelector } from "react-redux"
import { AppState } from "../index"
import { useCallback } from "react"
import { UserStateType, setUser } from "./reducer";
export const useUser = () => {
    const user = useSelector((state: AppState) => state.user)
    const dispatch = useDispatch()
    const onSetUser = useCallback((user: UserStateType) => {
        dispatch(setUser(user))
    }, [dispatch])
    return {
        user,
        onSetUser
    }   
}
hook.ts
import userReducer from "./reducer"
export * from "./hook"
export default userReducerindex.ts
import { configureStore } from "@reduxjs/toolkit"

import userReducer from "./user"

const rootReducer = {
    user: userReducer,
//add more reducer later below
}
const store = configureStore({
    reducer: rootReducer,
    devTools: true,
})
export default store
export type AppState = ReturnType<typeof store.getState>index.ts
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "react-redux";
import store from "./state";

ReactDOM.createRoot(document.getElementById("root") as HTMLElement)
.render(
<React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
</React.StrictMode>
);main.tsx
import React from "react";
import { useUser } from "./state/user/hook";

function App() {
const { user, onSetUser } = useUser();
const updateUser = () => {
    onSetUser({
      name: "John Doe",
      address: "123 Main St",
      role: "admin",
    });
};
return (
    <div>
      <h1>React Redux TS</h1>
      <h2>current user state in redux: {JSON.stringify(user)}</h2>
      <br />
      <button onClick={updateUser}>Update User</button>
    </div>
);
}
export default App;App.tsx

Conclusion

References

https://redux-toolkit.js.org/

https://redux.js.org/

https://vitejs.dev/guide/

Edit this post