DEV Community

Cover image for Redux combineReducers
Shubham Tiwari
Shubham Tiwari

Posted on

Redux combineReducers

Hello guyz today i am going to show you the use of combineReducers in Redux.
So, I was creating a MERN project and wanted to use 2 separate reducers to perform CRUD operation on 2 different database , then i read about combineReducers which helped me to implement the logic i was trying to find

I am assuming you have already know about redux so, i am going to show the combineReducer directly without telling about the whole process of redux setup

Lets get started...

Reducers -

ContactReducer.js

import axios from 'axios'

const contactReducer = (state = [], action) => {
    switch (action.type) {
        case "FETCH":
            state = action.payload
            return state
        case "ADD_CONTACT":
            axios
                .post("http://localhost:3001/Register", action.payload)
                .then((res) => console.log(res))
                .catch((err) => console.log(err));
            return state
        case "UPDATE_CONTACT":
            axios
                .put("http://localhost:3001/update", action.payload)
                .then((response) => console.log(response))
                .catch((err) => console.log(err));
            return state
        case "DELETE_CONTACT":
            console.log(action.payload)
            axios             
         .delete(`http://localhost:3001/delete/${action.payload}`)
                .then((response) => console.log(response))
                .catch((err) => console.log(err));
            return state
        default:
            return state;
    }
}

export default contactReducer;
Enter fullscreen mode Exit fullscreen mode

SignupReducers.js

import axios from 'axios'

const contactReducer = (state = [], action) => {
    switch (action.type) {
        case "FETCH_USER":
            state = action.payload
            return state
        case "ADD_USER":
            axios
                .post("http://localhost:3001/RegisterUser", action.payload)
                .then((res) => console.log(res))
                .catch((err) => console.log(err));
            return state
        default:
            return state;
    }
}

export default contactReducer;
Enter fullscreen mode Exit fullscreen mode

I have created 2 separate reducers and each reducers perform the action on different database and return the response separately

Reducers.js

import { combineReducers } from "redux";
import contactReducer from "./contactReducer";
import signupReducer from "./signupReducer";

const rootReducer = combineReducers({ contact: contactReducer, signup: signupReducer })

export default rootReducer
Enter fullscreen mode Exit fullscreen mode

As you can see i have created a rootReducer which contains both the reducers namely contact and signup and these identifiers will be used to access the reducer from state (like state.contact).

Using the reducers separately

index.js - Here we create the store for redux

import { createStore } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import rootReducer from './redux/Reducers';
import { Provider } from 'react-redux';

const store = createStore(rootReducer, composeWithDevTools());
Enter fullscreen mode Exit fullscreen mode

As you can see , we have created the store using our rootReducer which have both the reducers states.

Accessing the States of each reducer

AddContact.js

import { useSelector, useDispatch } from 'react-redux'

const AddContact = () => {
const contacts = useSelector(state => state.contact);
//getting the data from initial state of contact
const dispatch = useDispatch();//for dispatching the method
.
.
.
.
  const data = {
    uniqueId,
    name,
    email,
    number
}
dispatch({ type: "ADD_CONTACT", payload: data });
//this will perform the operation in contact reducers
.
.
.
}
Enter fullscreen mode Exit fullscreen mode

Signup.js

import { useSelector, useDispatch } from 'react-redux'

const Signup = () => {
.
.
const dispatch = useDispatch();

useEffect(() => {
        axios.get("http://localhost:3001/SignupInfo")
            .then((response) => {
//this will perform the operation on signup reducer
                dispatch({ type: "FETCH_USER", payload: response.data })
            })
            .catch((err) => console.log(err));
    }, [dispatch])
    const users = useSelector((state) => state.signup);
//getting the data from initial state of signup
}
Enter fullscreen mode Exit fullscreen mode

Thats it for this post.
THANK YOU FOR READING THIS POST AND IF YOU FIND ANY MISTAKE OR WANTS TO GIVE ANY SUGGESTION , PLEASE MENTION IT IN THE COMMENT SECTION.
^^You can help me by some donation at the link below Thank you👇👇 ^^
☕ --> https://www.buymeacoffee.com/waaduheck <--

Also check these posts as well
https://dev.to/shubhamtiwari909/css-claymorphism-2pkd

https://dev.to/shubhamtiwari909/styled-componenets-react-js-15kk

https://dev.to/shubhamtiwari909/introduction-to-tailwind-best-css-framework-1gdj

Top comments (1)

Collapse
 
shubhamtiwari909 profile image
Shubham Tiwari

It combine multiple different reducers in one reducer and we can pass that reducer to store which then stores the state of many reducers in object