React Redux Tutorial PDF
React Redux Tutorial PDF
When I first started learning Redux I wish I could find the simplest tutorial
ever.
Despite the great resources out there I couldn’t wrap my head around some of
the Redux concepts.
I knew what’s the state. But actions, action creators, and reducers? They
were obscure for me.
Last but not least I didn’t know how to glue React and Redux together.
During those days I started writing my own React Redux tutorial and since then
I learned a lot.
I taught myself the Redux fundamentals by writing this guide. I hope it’ll be
useful for all those learning React and Redux.
Enjoy the reading!
2
React Redux tutorial: who this guide is for
The following React Redux guide is exactly what you’re looking for if:
• you have a good grasp of Javascript, ES6, and React
• you’re looking forward to learn Redux in the most simple way
3
React Redux tutorial: a minimal React development envi-
ronment
To follow along with the guide you should have a good grasp of Javascript,
ES6, and React.
Also, create a minimal React development environment before starting off.
Feel free to use webpack or Parcel.
To get started with webpack clone my Github repo:
git clone git@github.com:valentinogagliardi/webpack-4-quickstart.git
4
React Redux tutorial: what is the state?
To understand what is Redux you must first understand what is the state.
If you have ever worked with React the term state should be no surprise to you.
I guess you already wrote stateful React components like the following:
import React, { Component } from "react";
this.state = {
articles: [
{ title: "React Redux Tutorial for Beginners", id: 1 },
{ title: "Redux e React: cos’è Redux e come usarlo con React", id: 2 }
]
};
}
render() {
const { articles } = this.state;
return <ul>{articles.map(el => <li key={el.id}>{el.title}</li>)}</ul>;
}
}
A stateful React component is basically a Javascript ES6 class.
Every stateful React component carries its own state. In a React component
the state holds up data.
The component might render such data to the user.
And there’s setState for updating the local state of a component.
Everybody learned React this way:
1. render some data from the local state
2. update the state with React setState
Now, it is fine to keep the state within a React component as long as the
application remains small.
But things could become tricky in more complex scenarios.
5
You will end up with a bloated component filled with methods for managing
and updating the state. The frontend shouldn’t know about the business
logic.
Fine.
So what are the alternatives for managing the state of a React component?
Redux is one of them.
Redux solves a problem that might not be clear in the beginning: it
helps giving each React component the exact piece of state it needs.
Redux holds up the state within a single location.
Also with Redux the logic for fetching and managing the state lives out-
side React.
The benefits of this approach might be not so evident. Things will look clear as
soon as you’ll get your feet wet with Redux.
In the next section we’ll see why you should learn Redux and when to use Redux
within your applications.
6
Redux has a cost as well: it adds another layer of abstraction. But I prefer
thinking about Redux as an investment, not as a cost.
Another common question for Redux beginners is: how do you know when
you’re ready to use Redux?
If you think about it there is no rule of thumb for determining when you do
need Redux for managing the state.
What I found is that you should consider using Redux when:
• multiple React components needs to access the same state but do not have
any parent/child relationship
• you start to feel awkward passing down the state to multiple components
with props
If that makes still no sense for you do not worry, I felt the same.
Dan Abramov says “Flux libraries are like glasses: you’ll know when you need
them.”
And in fact it worked like that for me.
Before going further take your time to understand what problem does Redux
solve and whether you’re motivated or not to learn it.
Be aware that Redux is not useful for smaller apps. It really shines in bigger
ones. Anyway, learning Redux even if you’re not involved in something big
wouldn’t harm anyone.
In the next section we’ll start building a proof of concept to introduce:
• the Redux fundamental principles
• Redux alongside with React
Actions. Reducers. I kind of knew about them. But one thing wasn’t clear to
me: how were all the moving parts glued together?
Were there some minions or what?
7
The store orchestrates all the moving parts in Redux. Repeat with me:
the store.
The store in Redux is like the human brain: it’s kind of magic.
The Redux store is fundamental: the state of the whole application
lives inside the store.
So to start playing with Redux we should create a store for wrapping up
the state.
Move into your React development environment and install Redux:
cd webpack-4-quickstart/
npm i redux --save-dev
Create a directory for holding the store:
mkdir -p src/js/store
Create a new file named index.js into src/js/store and finally initialize the
store:
// src/js/store/index.js
8
createStore takes a reducer as the first argument, rootReducer in our case.
You may also pass an initial state to createStore. But most of the times you
don’t have to. Passing an initial state is useful for server side rendering. Anyway,
the state comes from reducers.
NOTE: see Reducer returned undefined during initialization
What matters now is understanding what does a reducer do.
In Redux reducers produce the state. The state is not something you create
by hand.
Armed with that knowledge let’s move on to our first Redux reducer.
While an initial state is useful for SSR in Redux the state must return entirely
from reducers.
Cool but what’s a reducer?
A reducer is just a Javascript function. A reducer takes two parameters:
the current state and an action (more about actions soon).
The third principle of Redux says that the state is immutable and cannot change
in place.
This is why the reducer must be pure. A pure function is one that returns the
exact same output for the given input.
In plain React the local state changes in place with setState. In Redux you
cannot do that.
Creating a reducer is not that hard. It’s a plain Javascript function with two
parameters.
In our example we’ll be creating a simple reducer taking the initial state
as the first parameter. As a second parameter we’ll provide the action. As of
now the reducer will do nothing than returning the initial state.
Create a directory for the root reducer:
mkdir -p src/js/reducers
Then create a new file named index.js into the src/js/reducers:
// src/js/reducers/index.js
const initialState = {
articles: []
};
9
const rootReducer = (state = initialState, action) => state;
Redux reducers are without doubt the most important concept in Redux. Re-
ducers produce the state of the application.
But how does a reducer know when to produce the next state?
The second principle of Redux says the only way to change the state is by
sending a signal to the store. This signal is an action. Dispatching an
action is the process of sending out a signal.
Now, how do you change an immutable state? You won’t. The resulting state is
a copy of the current state plus the new data.
That’s a lot to know.
The reassuring thing is that Redux actions are nothing more than
Javascript objects. This is what an action looks like:
{
type: ’ADD_ARTICLE’,
payload: { name: ’React Redux Tutorial for Beginners’, id: 1 }
}
Every action needs a type property for describing how the state should change.
You can specify a payload as well. In the above example the payload is a new
article. A reducer will add the article to the current state later.
It is a best pratice to wrap every action within a function. Such function
is an action creator.
Let’s put everything together by creating a simple Redux action.
Create a directory for the actions:
mkdir -p src/js/actions
Then create a new file named index.js in src/js/actions:
10
// src/js/actions/index.js
export const addArticle = article => ({ type: "ADD_ARTICLE", payload: article });
So, the type property is nothing more than a string.
The reducer will use that string to determine how to calculate the next state.
Since strings are prone to typos and duplicates it’s better to have action
types declared as constants.
This approach helps avoiding errors that will be difficult to debug.
Create a new directory:
mkdir -p src/js/constants
Then create a new file named action-types.js into the src/js/constants:
// src/js/constants/action-types.js
11
A reducer is a Javascript function taking two parameters: the state and the
action.
A reducer function has a switch statement (although unwieldy, a naive reducer
could also use if/else).
The reducer calculates the next state depending on the action type.
Moreover, it should return at least the initial state when no action type
matches.
When the action type matches a case clause the reducer calculates the next
state and returns a new object. Here’s an excerpt of the code:
// ...
switch (action.type) {
case ADD_ARTICLE:
return { ...state, articles: [...state.articles, action.payload] };
default:
return state;
}
// ...
The reducer we created earlier does nothing than returning the initial state.
Let’s fix that.
Open up src/js/reducers/index.js and update the reducer as follow:
import { ADD_ARTICLE } from "../constants/action-types";
const initialState = {
articles: []
};
12
Making our reducer complaint is easy. Using Array.prototype.concat in place of
Array.prototype.push is enough to keep the initial array immutable:
import { ADD_ARTICLE } from "../constants/action-types";
const initialState = {
articles: []
};
const initialState = {
articles: []
};
13
• Using Object.assign() and . . . spread for objects
The object spread operator is still in stage 3. Install Object rest spread transform
to avoid a SyntaxError Unexpected token when using the object spread operator
in Babel:
npm i --save-dev babel-plugin-transform-object-rest-spread
Open up .babelrc and update the configuration:
{
"presets": ["env", "react"],
"plugins": ["transform-object-rest-spread"]
}
Redux protip: the reducer will grow as your app will become bigger. You can
split a big reducer into separate functions and combine them with combineRe-
ducers
In the next section we’ll play with Redux from the console. Hold tight!
window.store = store;
window.addArticle = addArticle;
Now run webpack dev server (or Parcel) with:
npm start
14
head over http://localhost:8080/ and open up the console with F12.
Since we’ve exported the store as a global variable we can access its methods.
Give it a try!
Start off by accessing the current state:
store.getState()
output:
{articles: Array(0)}
Zero articles. In fact we haven’t update the initial state yet.
To make things interesting we can listen for state updates with subscribe.
The subscribe method accepts a callback that will fire whenever an
action is dispatched. Dispatching an action means notifying the store that
we want to change the state.
Register the callback with:
store.subscribe(() => console.log("Look ma, Redux!!"))
To change the state in Redux we need to dispatch an action. To dispatch
an action you have to call the dispatch method.
We have one action at our disposal: addArticle for adding a new article to the
state.
Let’s dispatch the action with:
store.dispatch( addArticle({ name: ’React Redux Tutorial for Beginners’, id: 1 }) )
Right after running the above code you should see:
Look ma, Redux!!
To verify that the state changed run again:
store.getState()
The output should be:
{articles: Array(1)}
And that’s it. This is Redux in its simplest form.
Was that difficult?
Take your time to explore these three Redux methods as an exercise. Play with
them from the console:
• getState for accessing the current state of the application
• dispatch for dispatching an action
• subscribe for listening on state changes
15
That’s everything you need to know for getting started with Redux.
Once you feel confident head over the next section. We’ll go straight to connecting
React with Redux!
react-redux is a Redux binding for React. It’s a small library for connecting
Redux and React in an efficient way.
The most important method you’ll work with is connect
What does react-redux’s connect do? Unsurprisingly it connects a React compo-
nent with the Redux store.
16
You will use connect with two or three arguments depending on the use case.
The fundamental things to know are:
• the mapStateToProps function
• the mapDispatchToProps function
What does mapStateToProps do in react-redux? mapStateToProps does
exactly what its name suggests: it connects a part of the Redux state to
the props of a React component. By doing so a connected React component will
have access to the exact part of the store it needs.
What does mapDispatchToProps do in react-redux? mapDispatchToProps
does something similar, but for actions. mapDispatchToProps connects
Redux actions to React props. This way a connected React component will
be able to dispatch actions.
Is everything clear? If not, stop and take your time to re-read the guide. I know
it’s a lot to learn and it requires time. Don’t worry if you don’t get Redux right
know. It will click sooner or later.
In the next section we’ll finally get our hands dirty!.
render(
<Provider store={store}>
17
<App />
</Provider>,
document.getElementById("app")
);
You see? Provider wraps up your entire React application. Moreover it gets the
store as a prop.
Now let’s create the App component since we’re requiring it. It should be
nothing special: App should import a List component and render itself.
Create a directory for holding the components:
mkdir -p src/js/components
and a new file named App.js inside src/js/components:
// src/js/components/App.js
import React from "react";
import List from "./List";
18
A brief recap: the key for connecting a React component with Redux is connect.
Connect takes at least one argument.
Since we want List to get a list of articles it’s a matter of connecting
state.articles with the component. How? With mapStateToProps.
Create a new file named List.js inside src/js/components. It should look
like the following:
// src/js/components/List.js
19
Then it’s a matter of using the prop inside JSX for generating a list of articles:
{articles.map(el => (
<li className="list-group-item" key={el.id}>
{el.title}
</li>
))}
React protip: take the habit of validating props with PropTypes
Finally the component gets exported as List. List is the result of connecting the
stateless component ConnectedList with the Redux store.
A stateless component does not have its own local state. Data gets passed to it
as props
Still confused? I was too. Understanding how connect works will take some
time. Fear not, the road to learn Redux is paved with “ah-ha” moments.
I suggest taking a break for exploring both connect and mapStateToProps
Once you’re confident about them head over the next section!
The Form component we’re going to create is a bit more complex than List. It’s
a form for adding new articles to our application.
Plus it is a stateful component.
A stateful component in React is a component carrying its own local state
A stateful component? “Valentino, we’re talking about Redux for managing the
state! Why on earth would you give Form its own local state??”
Even when using Redux it is totally fine to have stateful components.
Not every piece of the application’s state should go inside Redux.
In this example I don’t want any other component to be aware of the Form local
state.
And that’s perfectly fine.
What does the component do?
The component contains some logic for updating the local state upon a form
submission.
Plus it receives a Redux action as prop. This way it can update the global state
by dispatching the addArticle action.
Create a new file named Form.js inside src/js/components. It should look
like the following:
20
// src/js/components/Form.js
import React, { Component } from "react";
import { connect } from "react-redux";
import uuidv1 from "uuid";
import { addArticle } from "../actions/index";
this.state = {
title: ""
};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({ [event.target.id]: event.target.value });
}
handleSubmit(event) {
event.preventDefault();
const { title } = this.state;
const id = uuidv1();
this.props.addArticle({ title, id });
this.setState({ title: "" });
}
render() {
const { title } = this.state;
return (
<form onSubmit={this.handleSubmit}>
<div className="form-group">
<label htmlFor="title">Title</label>
<input
type="text"
className="form-control"
id="title"
21
value={title}
onChange={this.handleChange}
/>
</div>
<button type="submit" className="btn btn-success btn-lg">
SAVE
</button>
</form>
);
}
}
22
<div className="row mt-5">
<div className="col-md-4 offset-md-1">
<h2>Articles</h2>
<List />
</div>
<div className="col-md-4 offset-md-1">
<h2>Add a new article</h2>
<Form />
</div>
</div>
);
Nothing fancy but still useful for showing React and Redux at work!
The List component on the left is connected to the Redux store. It
will re-render whenever you add a new article.
23
Whoaaa!
You can find the code for that silly app (with prop-types and a splitted reducer)
on my Github repo.
I hope you’ll learn something from this guide. I tried my best to keep things as
simple as possibile.
Redux has a lot of boilerplate and moving parts. Don’t get discouraged. Pick
Redux, play with it and take your time to absorb all the concepts.
I went from zero to understanding Redux by small steps. You can do it
too!
Also, take your time to investigate why and if you should use Redux in your
application.
Either way think of Redux as an investment: learning it is 100% worthwile.
24
React Redux tutorial: books for learning Redux
What’s the best way for levelling up your Redux skills once you finish my
tutorial?
Reading a book of course. Even better, reading a book written by an expert.
I had the privilege to put my hands on Human Redux by Henrik Joreteg.
So far I love the book.
Henrik has a lot of experience in building real world complex web applications.
He know Progressive Web Apps and how to use Redux.
Buy Henrik’s book if you want to:
• learn real world Redux patterns
• level up your Redux skills
• learn about advanced Redux topics (middlewares, async actions, selectors,
reselect)
I highly recommend Human Redux even if you’re just starting out with Redux.
It is a nice companion for my tutorial. Plus you’ll learn from a real expert.
Go grab it!
Other useful resources for learning Redux:
The official documentation: Redux Docs.
Resources for learning Redux by Mark Erikson.
Dan Abramov has a nice write-up that will help you understand if your
application needs Redux.
There’s also an interesting thread on dev.to with Dan explaining when is it
time to stop managing state at the component level and switching to
Redux.
25
React Redux tutorial: resources for learning functional pro-
gramming
26
Thanks for reading and happy coding!
27
28