DEV Community

mzakzook
mzakzook

Posted on

3

Implementing Redux in React App

When developing a React frontend with data frequently being fetched from a backend/API, it can sometimes become challenging passing state through props from one component to the next. This practice can be very tedious and can tempt you to fetch data from a less-than-ideal component just to simplify the state issue.

Redux is a state manager that allows you to store and retrieve data from any component on your front-end. I'm going to go through the process of setting up Redux in your app.

First, you will need to install the redux library. Run both of the following commands:

yarn add redux
yarn add react-redux

Next, we will create a reducer. A reducer accepts two arguments: current state & an action (e.g. user logged in/out, data fetched, auth failed). The new updated state will be returned by the reducer, taking into account the action that was passed to it.

Here is an example of a reducer (I would create this reducer in a separate file; let's call this file 'auth-reducer'):

const INITIAL_STATE = {
  email: '',
  password: '',
  auth_token: '',
  errorFlag: false,
  spinner: false
};

export default (state = INITIAL_STATE, action) => {
  switch (action.type) {
    case 'EMAIL_CHANGED':
      return { ...state, email: action.payload };
    case 'PASSWORD_CHANGED':
      return { ...state, password: action.payload };
    case 'LOGIN_FAILED':
      return { ...state, errorFlag: true, password: '', spinner: false };
    case 'LOGIN_USER_SUCCESS':
      return { ...state, ...action.payload, spinner: false };
    case 'FIND_USER_SUCCESS':
      return { ...state, ...action.payload, spinner: false };
    case 'LOAD_SPINNER':
      return { ...state, spinner: true };
    case 'LOGOUT_USER_SUCCESS':
      return INITIAL_STATE;
    default:
      return state;
  }
};

Next, we'll create a Redux store in our app component. First we need to import several items.

import { createStore } from 'redux'
import { Provider } from 'react-redux'
import AuthReducer from './AuthReducer' -> (this is where we created our reducer in the last step)

Now we are ready to create our Redux store.

const store = createStore(AuthReducer);
render(
 <Provider store={store}>
   <App />
 </Provider>,
 document.getElementById(root)
);

Notice that we created a store using the createStore function and passed it our AuthReducer. I also wrapped the 'App' component in a 'Provider' component which will allow all components inside App to access our store.

To access state inside a component you will create a function that assigns redux's state to the component's props. This is how I implemented my AuthReducer inside a login componenet:

const mapStateToProps = (state) => {
  return {
    email: state.auth.email,
    password: state.auth.password, 
    error: state.auth.errorFlag,
    spinner: state.auth.spinner,
    auth_token: state.auth.auth_token
  };
};

At the bottom of my component I also need to specify that I am using this functionality.

export default connect(mapStateToProps)(LoginForm);

Inside that component I could then access the password attribute in redux's state, by calling this.props.password.

To update redux's state you can either use mapDispatchToProps function or create individual actions that modify state. I will explain the process of creating individual actions.

If I wanted to change a user's email and/or password in state I could add the following functions:

export const emailChanged = (email) => {
  return {
    type: 'EMAIL_CHANGED',
    payload: email
  };
};

export const passwordChanged = (password) => {
  return {
    type: 'PASSWORD_CHANGED',
    payload: password
  };
};

Now, inside my auth component I would import these functions and call them by passing in a new email/password. I would also need to modify my final export statement to the following:

export default connect(mapStateToProps, { emailChanged, passwordChanged })(LoginForm);

This run through should allow you to quickly set up a React App with Redux. There are many powerful ways to utilize Redux to improve performance and organization so I hope you enjoy. Check out the links below for further questions.

Sources:
1. Redux Docs
2. React-Redux Docs
3. Quick and easy beginner’s guide to implementing Redux in a React app, by Paul Fitzgerald

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

AWS Q Developer image

Your AI Code Assistant

Generate and update README files, create data-flow diagrams, and keep your project fully documented. Built to handle large projects, Amazon Q Developer works alongside you from idea to production code.

Get started free in your IDE

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay