Danilo Mello
3 min readApr 19, 2021

Simple React-Redux Starter Step By Step

This is a step-by-step guide to build a React project with Redux:

1 — Start the react project with the command:

npx create-react-app name-of-the-app

2 — Once the project is created, change to its directory

cd name-of-the-app

3 — Install ‘redux’ and ‘react-redux’ libraries (via npm or yarn)

npm install react-redux
npm install redux

or

yarn add react-redux
yarn add redux

4 — On index.js there are many things to do:

- create the store, importing the function createStore and assiging a constant to it
— wrap the App component with a Provider component (imported from ‘react-redux’
— import the rootReducer, which is still not created, to pass it as a parameter to the createStore function

import { createStore} from ‘redux’;
import { Provider } from ‘react-redux’;
import rootReducer from ‘./reducers/root.reducer’;

const store = createStore(rootReducer);

ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById(‘root’)
);

5 — root.reducer.js

A root reducer is a file where all the application reducers are combined.
For that, a combineReducers function must be import from ‘redux’, along with all the other reducers you might have.
We will export a constant named rootReducer, which will be assigned to to combineReducers function with an object as a parameter
This object will contain a key and its respective reducer.
The name of of this key is important to access the states from the other reducers!

import { combineReducers } from ‘redux’;
import otherReducer from ‘./other.reducer’;
import anotherReducer from ‘./another.reducer’;

const rootReducer = combineReducers({
otherReducerKeyName: otherReducer,
anotherReducerKeyName: anotherReducer
})

export default rootReducer

6 — other.reducer.js

This is the base of an reducer file.
It function receives a state (with initialState as default) and a action from the dispacth and some other variables inside the payload.

const initState = {
paramether: initial_value
}

const otherReducer = (state = initState, action) => {
switch (action.type){
case ‘ACTION_TYPE_1’:
return {
…state,
paramether: new value
}
case ‘ACTION_TYPE_2’:

/// logic goes here

return {
…state,
paramether: new value
}
default:
return state

}
}

export default otherReducer

7 — Component.jsx

In the component file we must:

— import React and component from react
— import the function connect from react-redux
— create the mapState function to GET data from the store
— create the dispatchState function to SEND an action and possibly a payload (data) to the store

connect function: it will be used at the end of the file, on the export, passing the mapState and dispatchState as parameters:

export default connect(mapState, dispatchState)(ComponentName);

mapState: it must be declared at the body of the class, receiving a state as a parameter and with a return an object.
the objects key is how the state variable is accessed inside the class, with: this.props.variable_key

its value will be: state.key_name_in_root_reducer.key_name_in_specific_reducer

const mapState = (state) => {
return {
variable_key: state.key_name_in_root_reducer.key_name_in_specific_reducer
}
}

dispatchState: the dispacth function receives the dispatch as its argument.
it also returns a object. whenever its key is called inside the component (e.g. by a onClick event), it will trigger its value.
the value is a arrow function with a dispatch in its callback.
in its turn, the dispatch function will also have a object as a parameter, with at least one key: type with its action as the value
we you can also send a payload with any other data that will be used in the reducer:

const dispatchState = (dispatch) => {
return {
doSomething: () => dispatch({
type: ‘ACTION_TYPE_1’,
payload: ///
})
}
}

example of a complete file:

import React, {Component} from ‘react’;
import { connect } from ‘react-redux’;

class ComponentName extends Component {

render() {

const handleClick = () => {
this.props.addingOne()
}

return (
<div>

<h2>Count: {this.props.cnt}</h2>

<button onClick={handleClick}>Add 1</button>

</div>
);
}

}

const mapState = (state) => {
return {
cnt: state.counter.count
}
}

const dispatchState = (dispatch) => {
return {
addingOne: () => dispatch({
type: ‘ACTION_TYPE_1’,
})
}
}

export default connect(mapState, dispatchState)(ComponentName);

Applying redux, the state in your application will be stable and easly accessed in all your components!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

No responses yet

Write a response