A straight forward example of using Redux Tool Kit with Nextjs app.
redux/hooks.js
import { useDispatch, useSelector, useStore } from "react-redux";
// Use throughout the app instead of plain `useDispatch` and `useSelector`
export const useAppDispatch = useDispatch.withTypes();
export const useAppSelector = useSelector.withTypes();
export const useAppStore = useStore.withTypes();
redux/store.js
import { configureStore } from "@reduxjs/toolkit";
import userReducer from "../features/user/userSlice";
export const makeStore = () => {
return configureStore({
reducer: {
user: userReducer,
//list more if any
}
})
}
redux/StoreProvider.js
'use client'
import { useRef } from 'react'
import { Provider } from 'react-redux'
import { makeStore } from './store'
export default function StoreProvider({ children }) {
const storeRef = useRef()
if (!storeRef.current) {
// Create the store instance the first time this renders
storeRef.current = makeStore();
}
return <Provider store={storeRef.current}>{children}</Provider>
}
features/user/userSlice.js
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
//import axiosConfig as well
const initialState = {
userInfo: {},
isUserLoggedIn: false,
isUserInfoLoading: true,
//..add more state variables
};
const reducers = {
setUserInfoResponse: (state, action) => {
state.userInfo = action.payload;
state.isUserLoggedIn = true;
state.isUserInfoLoading = false;
},
//...add more functions to update state
};
export const userSlice = createSlice({
name: "user",
initialState,
reducers,
});
export const getUserInfo = createAsyncThunk(
"user/getUserInfo",
async (params, { dispatch }) => {
const { uid } = params;
const userInfoResponse = await axiosConfig.get(
`get_user_info/${uid}`,
);
if (userInfoResponse.data.status) {
dispatch(setUserInfoResponse(userInfoResponse.data.data));
}
}
);
export const {
setUserInfoResponse,
//list other functions defined above if any
} = userSlice.actions;
export default userSlice.reducer;
_app.js
import StoreProvider from "../redux/StoreProvider";
import { SessionProvider } from "next-auth/react";
function MyApp({ Component, pageProps: { session, ...pageProps } }) {
return (
<SessionProvider session={session}>
<StoreProvider>
<Component {...pageProps} />
</StoreProvider>
</SessionProvider>
)
}
export default MyApp;
On components:
import { useAppDispatch, useAppSelector } from "../../redux/hooks";
import { getUserInfo } from "../../features/user/userSlice";
...
const dispatch = useAppDispatch();
const { isUserLoggedIn, isUserInfoLoading, userInfo } = useAppSelector(state => state.user);
inside useEffect or any logic:
dispatch(getUserInfo({ uid: 123 }));
Top comments (0)