React JS Notes For Professionals
React JS Notes For Professionals
React JS
Notes for Professionals
90+ pages
of professional hints and tricks
Disclaimer
GoalKicker.com This is an unocial free book created for educational purposes and is
not aliated with ocial React JS group(s) or company(s).
Free Programming Books All trademarks and registered trademarks are
the property of their respective owners
Contents
About ................................................................................................................................................................................... 1
Chapter 1: Getting started with React ............................................................................................................... 2
Section 1.1: What is ReactJS? ........................................................................................................................................ 2
Section 1.2: Installation or Setup .................................................................................................................................. 2
Section 1.3: Hello World with Stateless Functions ....................................................................................................... 4
Section 1.4: Absolute Basics of Creating Reusable Components ............................................................................. 5
Section 1.5: Create React App ...................................................................................................................................... 6
Section 1.6: Hello World ................................................................................................................................................. 7
Section 1.7: Hello World Component ........................................................................................................................... 8
Chapter 2: Components ........................................................................................................................................... 11
Section 2.1: Creating Components ............................................................................................................................. 11
Section 2.2: Basic Component ................................................................................................................................... 13
Section 2.3: Nesting Components .............................................................................................................................. 14
Section 2.4: Props ........................................................................................................................................................ 16
Section 2.5: Component states - Dynamic user-interface ...................................................................................... 17
Section 2.6: Variations of Stateless Functional Components ................................................................................. 19
Section 2.7: setState pitfalls ....................................................................................................................................... 20
Chapter 3: Using ReactJS with TypeScript .................................................................................................... 22
Section 3.1: ReactJS component written in TypeScript ........................................................................................... 22
Section 3.2: Installation and Setup ............................................................................................................................ 22
Section 3.3: Stateless React Components in TypeScript ......................................................................................... 23
Section 3.4: Stateless and property-less Components ............................................................................................ 24
Chapter 4: State in React ...................................................................................................................................... 25
Section 4.1: Basic State ............................................................................................................................................... 25
Section 4.2: Common Antipattern ............................................................................................................................. 25
Section 4.3: setState() ................................................................................................................................................. 26
Section 4.4: State, Events And Managed Controls ................................................................................................... 28
Chapter 5: Props in React ...................................................................................................................................... 30
Section 5.1: Introduction .............................................................................................................................................. 30
Section 5.2: Default props .......................................................................................................................................... 30
Section 5.3: PropTypes ............................................................................................................................................... 31
Section 5.4: Passing down props using spread operator ....................................................................................... 32
Section 5.5: Props.children and component composition ....................................................................................... 33
Section 5.6: Detecting the type of Children components ........................................................................................ 34
Chapter 6: React Component Lifecycle .......................................................................................................... 35
Section 6.1: Component Creation ............................................................................................................................... 35
Section 6.2: Component Removal ............................................................................................................................. 37
Section 6.3: Component Update ................................................................................................................................ 38
Section 6.4: Lifecycle method call in dierent states .............................................................................................. 39
Section 6.5: React Component Container ................................................................................................................. 40
Chapter 7: Forms and User Input ....................................................................................................................... 41
Section 7.1: Controlled Components .......................................................................................................................... 41
Section 7.2: Uncontrolled Components ..................................................................................................................... 41
Chapter 8: React Boilerplate [React + Babel + Webpack] ................................................................... 43
Section 8.1: react-starter project ............................................................................................................................... 43
Section 8.2: Setting up the project ............................................................................................................................. 44
Chapter 9: Using ReactJS with jQuery ............................................................................................................. 47
Section 9.1: ReactJS with jQuery ................................................................................................................................ 47
Chapter 10: React Routing ..................................................................................................................................... 49
Section 10.1: Example Routes.js file, followed by use of Router Link in component ............................................. 49
Section 10.2: React Routing Async ............................................................................................................................ 50
Chapter 11: Communicate Between Components ...................................................................................... 51
Section 11.1: Communication between Stateless Functional Components ............................................................ 51
Chapter 12: How to setup a basic webpack, react and babel environment ................................ 53
Section 12.1: How to build a pipeline for a customized "Hello world" with images ............................................... 53
Chapter 13: React.createClass vs extends React.Component ............................................................. 57
Section 13.1: Create React Component ...................................................................................................................... 57
Section 13.2: "this" Context .......................................................................................................................................... 57
Section 13.3: Declare Default Props and PropTypes ............................................................................................... 59
Section 13.4: Mixins ...................................................................................................................................................... 61
Section 13.5: Set Initial State ....................................................................................................................................... 61
Section 13.6: ES6/React “this” keyword with ajax to get data from server ........................................................... 62
Chapter 14: React AJAX call .................................................................................................................................. 64
Section 14.1: HTTP GET request .................................................................................................................................. 64
Section 14.2: HTTP GET request and looping through data ................................................................................... 65
Section 14.3: Ajax in React without a third party library - a.k.a with VanillaJS ..................................................... 65
Chapter 15: Communication Between Components .................................................................................. 67
Section 15.1: Child to Parent Components ................................................................................................................. 67
Section 15.2: Not-related Components ..................................................................................................................... 67
Section 15.3: Parent to Child Components ................................................................................................................ 68
Chapter 16: Stateless Functional Components ............................................................................................ 70
Section 16.1: Stateless Functional Component .......................................................................................................... 70
Chapter 17: Performance ........................................................................................................................................ 73
Section 17.1: Performance measurement with ReactJS .......................................................................................... 73
Section 17.2: React's di algorithm ............................................................................................................................ 73
Section 17.3: The Basics - HTML DOM vs Virtual DOM ............................................................................................ 74
Section 17.4: Tips & Tricks ........................................................................................................................................... 75
Chapter 18: Introduction to Server-Side Rendering ................................................................................. 76
Section 18.1: Rendering components ......................................................................................................................... 76
Chapter 19: Setting Up React Environment ................................................................................................... 77
Section 19.1: Simple React Component ..................................................................................................................... 77
Section 19.2: Install all dependencies ........................................................................................................................ 77
Section 19.3: Configure webpack ............................................................................................................................... 77
Section 19.4: Configure babel ..................................................................................................................................... 78
Section 19.5: HTML file to use react component ...................................................................................................... 78
Section 19.6: Transpile and bundle your component .............................................................................................. 78
Chapter 20: Using React with Flow .................................................................................................................... 79
Section 20.1: Using Flow to check prop types of stateless functional components ............................................. 79
Section 20.2: Using Flow to check prop types ......................................................................................................... 79
Chapter 21: JSX ............................................................................................................................................................ 80
Section 21.1: Props in JSX ............................................................................................................................................ 80
Section 21.2: Children in JSX ....................................................................................................................................... 81
Chapter 22: React Forms ........................................................................................................................................ 84
Section 22.1: Controlled Components ........................................................................................................................ 84
Chapter 23: User interface solutions ................................................................................................................ 86
Section 23.1: Basic Pane .............................................................................................................................................. 86
Section 23.2: Panel ...................................................................................................................................................... 86
Section 23.3: Tab ......................................................................................................................................................... 87
Section 23.4: PanelGroup ............................................................................................................................................ 87
Section 23.5: Example view with `PanelGroup`s ....................................................................................................... 88
Chapter 24: Using ReactJS in Flux way ........................................................................................................... 90
Section 24.1: Data Flow ............................................................................................................................................... 90
Chapter 25: React, Webpack & TypeScript installation ......................................................................... 91
Section 25.1: webpack.config.js .................................................................................................................................. 91
Section 25.2: tsconfig.json .......................................................................................................................................... 91
Section 25.3: My First Component ............................................................................................................................. 92
Chapter 26: How and why to use keys in React .......................................................................................... 93
Section 26.1: Basic Example ........................................................................................................................................ 93
Chapter 27: Keys in react ....................................................................................................................................... 94
Section 27.1: Using the id of an element ................................................................................................................... 94
Section 27.2: Using the array index ........................................................................................................................... 94
Chapter 28: Higher Order Components .......................................................................................................... 96
Section 28.1: Higher Order Component that checks for authentication ................................................................ 96
Section 28.2: Simple Higher Order Component ....................................................................................................... 97
Chapter 29: React with Redux .............................................................................................................................. 98
Section 29.1: Using Connect ....................................................................................................................................... 98
Appendix A: Installation ........................................................................................................................................... 99
Section A.1: Simple setup ............................................................................................................................................ 99
Section A.2: Using webpack-dev-server ................................................................................................................. 100
Appendix B: React Tools ....................................................................................................................................... 102
Section B.1: Links ....................................................................................................................................................... 102
Credits ............................................................................................................................................................................ 103
You may also like ...................................................................................................................................................... 105
About
Please feel free to share this PDF with anyone for free,
latest version of this book can be downloaded from:
http://GoalKicker.com/ReactJSBook
This React JS Notes for Professionals book is compiled from Stack Overflow
Documentation, the content is written by the beautiful people at Stack Overflow.
Text content is released under Creative Commons BY-SA, see credits at the end
of this book whom contributed to the various chapters. Images may be copyright
of their respective owners unless otherwise specified
This is an unofficial free book created for educational purposes and is not
affiliated with official React JS group(s) or company(s) nor Stack Overflow. All
trademarks and registered trademarks are the property of their respective
company owners
ReactJS uses virtual DOM based mechanism to fill in data (views) in HTML DOM. The virtual DOM works fast owning
to the fact that it only changes individual DOM elements instead of reloading complete DOM every time
A React application is made up of multiple components, each responsible for outputting a small,
reusable piece of HTML. Components can be nested within other components to allow complex
applications to be built out of simple building blocks. A component may also maintain internal state - for
example, a TabList component may store a variable corresponding to the currently open tab.
React allows us to write components using a domain-specific language called JSX. JSX allows us to write our
components using HTML, whilst mixing in JavaScript events. React will internally convert this into a virtual DOM, and
will ultimately output our HTML for us.
React "reacts" to state changes in your components quickly and automatically to rerender the components in the
HTML DOM by utilizing the virtual DOM. The virtual DOM is an in-memory representation of an actual DOM. By
doing most of the processing inside the virtual DOM rather than directly in the browser's DOM, React can act
quickly and only add, update, and remove components which have changed since the last render cycle occurred.
Basic Inclusion
<!DOCTYPE html>
<html>
<head></head>
<body>
<script type="text/javascript" src="/path/to/react.js"></script>
<script type="text/javascript" src="/path/to/react-dom.js"></script>
<script type="text/javascript">
// Use react JavaScript code here or in a separate file
</script>
</body>
</html>
To get the JavaScript files, go to the installation page of the official React documentation.
React also supports JSX syntax. JSX is an extension created by Facebook that adds XML syntax to JavaScript. In order
to use JSX you need to include the Babel library and change <script type="text/javascript"> to <script
type="text/babel"> in order to translate JSX to Javascript code.
<!DOCTYPE html>
<html>
<head></head>
<body>
<script type="text/javascript" src="/path/to/react.js"></script>
<script type="text/javascript" src="/path/to/react-dom.js"></script>
<script src="https://npmcdn.com/babel-core@5.8.38/browser.min.js"></script>
<script type="text/babel">
// Use react JSX code here or in a separate file
</script>
</body>
</html>
You can also install React using npm by doing the following:
Facebook released its own package manager named Yarn, which can also be used to install React. After installing
Yarn you just need to run this command:
You can then use React in your project in exactly the same way as if you had installed React via npm.
For example:
const statelessSum = (a, b) => a + b;
let a = 0;
const statefulSum = () => a++;
As you can see from the above example that, statelessSum is always will return the same values given a and b.
However, statefulSum function will not return the same values given even no parameters. This type of function's
behaviour is also called as a side-effect. Since, the component affects somethings beyond.
So, it is advised to use stateless components more often, since they are side-effect free and will create the same
behaviour always. That is what you want to be after in your apps because fluctuating state is the worst case
scenario for a maintainable program.
The most basic type of react component is one without state. React components that are pure functions of their
props and do not require any internal state management can be written as simple JavaScript functions. These are
said to be Stateless Functional Components because they are a function only of props, without having any state
to keep track of.
// In HTML
<div id="element"></div>
// In React
const MyComponent = props => {
return <h1>Hello, {props.name}!</h1>;
};
Note that all that this component does is render an h1 element containing the name prop. This component doesn't
keep track of any state. Here's an ES6 example as well:
HelloWorld.propTypes = {
name: React.PropTypes.string.isRequired
}
Since these components do not require a backing instance to manage the state, React has more room for
optimizations. The implementation is clean, but as of yet no such optimizations for stateless components have
been implemented.
As React concerns itself only with an application's view, the bulk of development in React will be the creation of
components. A component represents a portion of the view of your application. "Props" are simply the attributes
used on a JSX node (e.g. <SomeComponent someProp="some prop's value" />), and are the primary way our
application interacts with our components. In the snippet above, inside of SomeComponent, we would have access
to this.props, whose value would be the object {someProp: "some prop's value"}.
It can be useful to think of React components as simple functions - they take input in the form of "props", and
produce output as markup. Many simple components take this a step further, making themselves "Pure Functions",
meaning they do not issue side effects, and are idempotent (given a set of inputs, the component will always
produce the same output). This goal can be formally enforced by actually creating components as functions, rather
than "classes". There are three ways of creating a React component:
React.createClass()
ES2015 Classes
Functional components cannot have "state" within them. So if your component needs to have a state, then go for
As a final note, react props are immutable once they have been passed in, meaning they cannot be modified from
within a component. If the parent of a component changes the value of a prop, React handles replacing the old
props with the new, the component will rerender itself using the new values.
See Thinking In React and Reusable Components for deeper dives into the relationship of props to components.
Installation
create-react-app my-app
Navigate to the newly created directory and run the start script.
cd my-app/
npm start
Configuration
create-react-app is intentionally non-configurable by default. If non-default usage is required, for example, to use a
compiled CSS language such as Sass, then the eject command can be used.
This allows editing of all configuration files. N.B. this is an irreversible process.
Alternatives
enclave
nwb
motion
rackt-cli
bud?
rwb
quik
Here's a basic example that uses React's main API to create a React element and the React DOM API to render the
React element in the browser.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
</head>
<body>
<div id="example"></div>
<script type="text/javascript">
</script>
</body>
</html>
With JSX
Instead of creating a React element from strings one can use JSX (a Javascript extension created by Facebook for
adding XML syntax to JavaScript), which allows to write
as the equivalent (and easier to read for someone familiar with HTML)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
</head>
<body>
<div id="example"></div>
<script type="text/babel">
</script>
</body>
</html>
A Component can also receive props. These are properties passed by its parent in order to specify some values the
component cannot know by itself; a property can also contain a function that can be called by the component after
certain events occur - for example, a button could receive a function for its onClick property and call it whenever it
The example above shows how the component can render an arbitrary string passed into the name prop by its
parent. Note that a component cannot modify the props it receives.
A component can be rendered within any other component, or directly into the DOM if it's the topmost component,
using ReactDOM.render and providing it with both the component and the DOM Node where you want the React
tree to be rendered:
By now you know how to make a basic component and accept props. Lets take this a step further and introduce
state.
For demo sake, let's make our Hello World app, display only the first name if a full name is given.
constructor(props){
render() {
return <h1>Hello, {this.state.name}!</h1>
}
}
Note: Each component can have it's own state or accept it's parent's state as a prop.
Basic Structure
import React, { Component } from 'react';
import { render } from 'react-dom';
render(
<FirstComponent name={ 'User' } />,
document.getElementById('content')
);
The above example is called a stateless component as it does not contain state (in the React sense of the word).
In such a case, some people find it preferable to use Stateless Functional Components, which are based on ES6
arrow functions.
In many applications there are smart components that hold state but render dumb components that simply receive
props and return HTML as JSX. Stateless functional components are much more reusable and have a positive
performance impact on your application.
1. When rendered they receive an object with all the props that were passed down
2. They must return the JSX to be rendered
Stateful Components
In contrast to the 'stateless' components shown above, 'stateful' components have a state object that can be
updated with the setState method. The state must be initialized in the constructor before it can be set:
this.state = {
toggle: true
};
onClick() {
this.setState((prevState, props) => ({
toggle: !prevState.toggle
}));
}
render() {
return (
<div onClick={this.onClick}>
Hello, {this.props.name}! I am a SecondComponent.
<br />
Toggle is: {this.state.toggle}
</div>
);
}
}
Extending a component with PureComponent instead of Component will automatically implement the
shouldComponentUpdate() lifecycle method with shallow prop and state comparison. This keeps your application
more performant by reducing the amount of un-necessary renders that occur. This assumes your components are
'Pure' and always render the same output with the same state and props input.
Higher order components are used when you want to share logic across several components regardless of how
different they render.
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>React Tutorial</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.2.1/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.2.1/react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script>
</head>
<body>
<div id="content"></div>
<script type="text/babel" src="scripts/example.js"></script>
</body>
</html>
You can create a basic component using the following code in a separate file:
scripts/example.js
You will get the following result (note what is inside of div#content):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
You can nest and refer to those components in the definition of a different component:
Further nesting can be done in three ways, which all have their own places to be used.
Pros
Cons
Good if
This is the style where A composes B and A tells B to compose C. More power to parent components.
Pros
Cons
Good if
B should accept to compose something different than C in the future or somewhere else
A should control the lifecycle of C
B would render C using this.props.children, and there isn't a structured way for B to know what those children
are for. So, B may enrich the child components by giving additional props down, but if B needs to know exactly
what they are, #3 might be a better option.
This is the style where A composes B and B provides an option for A to pass something to compose for a specific
purpose. More structured composition.
Pros
Composition as a feature
Easy validation
Better composaiblility
Cons
Good if
#3 is usually a must for making a public library of components but also a good practice in general to make
composable components and clearly define the composition features. #1 is the easiest and fastest to make
something that works, but #2 and #3 should provide certain benefits in various use cases.
Inside the definition for MyComponent userID will now be accessible from the props object
It's important to define all props, their types, and where applicable, their default value:
MyComponent.defaultProps = {
someObject: {},
title: 'My Default Title'
}
In this example the prop someObject is optional, but the prop userID is required. If you fail to provide userID to
MyComponent, at runtime the React engine will show a console warning you that the required prop was not
provided. Beware though, this warning is only shown in the development version of the React library, the
production version will not log any warnings.
to
console.log(this.props.title);
It's also a safeguard for use of object array and functions. If you do not provide a default prop for an object, the
following will throw an error if the prop is not passed:
if (this.props.someObject.someKey)
In example above, this.props.someObject is undefined and therefore the check of someKey will throw an error and
the code will break. With the use of defaultProps you can safely use the above check.
// I have used ReactBootstrap elements. But the code works with regular html elements also
var Button = ReactBootstrap.Button;
var Form = ReactBootstrap.Form;
handleTitleSubmit: function() {
//code to handle input box submit - for example, issue an ajax request to change name in
database
},
handleTitleChange: function(e) {
//code to change the name in form input box. newTitle is initialized as empty string. We need to
update it with the string currently entered by user in the form
this.setState({newTitle: e.target.value});
},
changeComponent: function() {
// this toggles the show variable which is used for dynamic UI
this.setState({show: !this.state.show)};
},
render: function() {
var clickableTitle;
if(this.state.show) {
clickableTitle = <Form inline onSubmit={this.handleTitleSubmit}>
<FormGroup controlId="formInlineTitle">
<FormControl type="text" onChange={this.handleTitleChange}>
</FormGroup>
</Form>;
} else {
clickabletitle = <div>
<Button bsStyle="link" onClick={this.changeComponent}>
<h3> Default Text </h3>
</Button>
</div>;
}
return (
<div className="comment">
{clickableTitle}
</div>
);
}
});
ReactDOM.render(
<Comment />, document.getElementById('content')
);
The main part of the code is the clickableTitle variable. Based on the state variable show, it can be either be a
Form element or a Button element. React allows nesting of components.
So we can add a {clickableTitle} element in the render function. It looks for the clickableTitle variable. Based on the
value 'this.state.show', it displays the corresponding element.
// one liner
const Language = ({language}) => <li>{language}</li>
Language.propTypes = {
message: React.PropTypes.string.isRequired
}
/**
* If there are more than one line.
* Please notice that round brackets are optional here,
* However it's better to use them for readability
*/
const LanguagesList = ({languages}) => {
<ul>
{languages.map(language => <Language language={language} />)}
</ul>
}
LanguagesList.PropTypes = {
languages: React.PropTypes.array.isRequired
}
/**
* This syntax is used if there are more work beside just JSX presentation
* For instance some data manipulations needs to be done.
* Please notice that round brackets after return are required,
* Otherwise return will return nothing (undefined)
*/
const LanguageSection = ({header, languages}) => {
// do some work
const formattedLanguages = languages.map(language => language.toUpperCase())
return (
<fieldset>
<legend>{header}</legend>
<LanguagesList languages={formattedLanguages} />
</fieldset>
)
}
LanguageSection.PropTypes = {
header: React.PropTypes.string.isRequired,
languages: React.PropTypes.array.isRequired
}
ReactDOM.render(
<LanguageSection
header="Languages"
languages={languages} />,
document.getElementById('app')
)
this.state = {
user: {}
};
}
componentDidMount() {
this.fetchUser();
}
fetchUser() {
$.get('/api/users/self')
.then((user) => {
this.setState({user: user});
});
}
render() {
return <h1>{this.state.user}</h1>;
}
}
This could call problems - if the callback is called after the Component is dismounted, then this.setState won't be a
function. Whenever this is the case, you should be careful to ensure your usage of setState is cancellable.
In this example, you might wish to cancel the XHR request when the component dismounts:
this.state = {
user: {},
xhr: null
};
}
componentWillUnmount() {
let xhr = this.state.xhr;
componentDidMount() {
this.fetchUser();
}
this.setState({xhr: xhr});
}
}
The async method is saved as a state. In the componentWillUnmount you perform all your cleanup - including
canceling the XHR request.
You could also do something more complex. In this example, I'm creating a 'stateSetter' function that accepts the
this object as an argument and prevents this.setState when the function cancel has been called:
function stateSetter(context) {
var cancelled = false;
return {
cancel: function () {
cancelled = true;
},
setState(newState) {
if (!cancelled) {
context.setState(newState);
}
}
}
}
This works because the cancelled variable is visible in the setState closure we created.
//helloMessage.tsx:
var HelloMessage = React.createClass({
render: function() {
return <div>Hello {this.props.name}</div>;
}
});
ReactDOM.render(<HelloMessage name="John" />, mountNode);
But in order to make full use of Typescript's main feature (static type checking) should be done couple things:
//helloMessage.tsx:
class HelloMessage extends React.Component {
render() {
return <div>Hello {this.props.name}</div>;
}
}
ReactDOM.render(<HelloMessage name="John" />, mountNode);
interface IHelloMessageProps {
name:string;
}
interface IHelloMessageState {
//empty in our case
}
Now Typescript will display an error if the programmer forgets to pass props. Or if they added props that are not
defined in the interface.
Facebook released its own package manager named Yarn, which can also be used to install React. After installing
Yarn you just need to run this command:
You can then use React in your project in exactly the same way as if you had installed React via npm.
To compile your code using typescript, add/install type definition files using npm or yarn.
To use JSX, a language mixing javascript with html/xml, you have to change the typescript compiler configuration. In
the project's typescript configuration file (usually named tsconfig.json), you will need to add the JSX option as:
That compiler option basically tells the typescript compiler to translate the JSX tags in code to javascript function
calls.
To avoid typescript compiler converting JSX to plain javascript function calls, use
"compilerOptions": {
"jsx": "preserve"
},
class GreeterProps {
name: string
}
Note that, the name React.SFC is an alias for React.StatelessComponent So, either can be used.
That component, however, can't access this.props since typescript can't tell if it is a react component. To access its
props, use:
Even if the component doesn't have explicitly defined properties, it can now access props.children since all
components inherently have children.
Another similar good use of stateless and property-less components is in simple page templating. The following is
an examplinary simple Page component, assuming there are hypothetical Container, NavTop and NavBottom
components already in the project:
In this example, the Page component can later be used by any other actual page as a base template.
In the example below we are defining some initial state in the constructor function of our component and make
use of it in the render function.
render() {
// We can access the greeting property through this.state
return(
<div>{this.state.greeting}</div>
);
}
}
this.state = {
url: ''
}
this.onChange = this.onChange.bind(this);
}
onChange(e) {
this.setState({
url: this.props.url + '/days=?' + e.target.value
});
}
componentWillMount() {
this.setState({url: this.props.url});
}
render() {
return (
<div>
<input defaultValue={2} onChange={this.onChange} />
The prop url is saved on state and then modified. Instead, choose to save the changes to a state, and then build
the full path using both state and props:
this.state = {
days: ''
}
this.onChange = this.onChange.bind(this);
}
onChange(e) {
this.setState({
days: e.target.value
});
}
render() {
return (
<div>
<input defaultValue={2} onChange={this.onChange} />
This is because in a React application we want to have a single source of truth - i.e. all data is the responsibility of
one single component, and only one component. It is the responsibility of this component to store the data within
its state, and distribute the data to other components via props.
In the first example, both the MyComponent class and its parent are maintaining 'url' within their state. If we
update state.url in MyComponent, these changes are not reflected in the parent. We have lost our single source of
truth, and it becomes increasingly difficult to track the flow of data through our application. Contrast this with the
second example - url is only maintained in the state of the parent component, and utilised as a prop in
MyComponent - we therefore maintain a single source of truth.
Parameters
1. updater: It can be an object with a number of key-value pairs that should be merged into the state or a
function that returns such an object.
Usage:
The setState method accepts an updater argument that can either be an object with a number of key-value-pairs
that should be merged into the state, or a function that returns such an object computed from prevState and
props.
this.setState(function(previousState, currentProps) {
return {
counter: previousState.counter + 1
};
});
This can be safer than using an object argument where multiple calls to setState() are used, as multiple calls may
be batched together by React and executed at once, and is the preferred approach when using current props to set
state.
These calls may be batched together by React using Object.assign(), resulting in the counter being incremented
by 1 rather than 3.
The functional approach can also be used to move state setting logic outside of components. This allows for
isolation and re-use of state logic.
// Within component
this.setState(incrementCounter);
constructor(props){
super(props);
this.state = {message: ""};
}
handleChange(e){
this.setState({message: e.target.value});
}
render() {
return (
<div>
<legend>Type something here</legend>
<input
onChange={this.handleChange.bind(this)}
value={this.state.message}
autoFocus />
<h1>{this.state.message}</h1>
</div>
);
render(<ManagedControlDemo/>, document.querySelector('#app'));
Its very important to note the runtime behavior. Every time a user changes the value in the input field
Pop quiz, after you type a character in the input field, which DOM elements change
You can experiment with this more here to find the answer
Basic example
As you can see in the example, thanks to props we can create reusable components.
Syntax
ES5
ES6
MyClass.defaultProps = {
randomObject: {},
...
}
ES7
The result of getDefaultProps() or defaultProps will be cached and used to ensure that
this.props.randomObject will have a value if it was not specified by the parent component.
optionalArray: React.PropTypes.array,
optionalBool: React.PropTypes.bool,
optionalFunc: React.PropTypes.func,
optionalNumber: React.PropTypes.number,
optionalObject: React.PropTypes.object,
optionalString: React.PropTypes.string,
optionalSymbol: React.PropTypes.symbol
If you attach isRequired to any propType then that prop must be supplied while creating the instance of that
component. If you don't provide the required propTypes then component instance can not be created.
Syntax
ES5
MyClass.propTypes = {
randomObject: React.PropTypes.object,
callback: React.PropTypes.func.isRequired,
...
};
ES7
In the same way, PropTypes allows you to specify more complex validation
Validating an object
...
randomObject: React.PropTypes.shape({
id: React.PropTypes.number.isRequired,
text: React.PropTypes.string,
}).isRequired,
...
...
arrayOfObjects: React.PropTypes.arrayOf(React.PropTypes.shape({
id: React.PropTypes.number.isRequired,
text: React.PropTypes.string,
})).isRequired,
...
Where each property needs to be passed as a single prop value you could use the spread operator ... supported
for arrays in ES6 to pass down all your values. The component will now look like this.
Remember that the properties of the object that you pass in are copied onto the component's props.
Another case is that you also can use spread operator to pass only parts of props to children components, then you
can use destructuring syntax from props again.
It's very useful when children components need lots of props but not want pass them one by one.
const { foo, bar, other } = this.props // { foo: 'foo', bar: 'bar', other: 'other' };
var component = <Component {...{foo, bar}} />;
const { foo, bar } = component.props
console.log(foo, bar); // 'foo bar'
Which allows us to include an arbitrary number of sub-elements when using the component later:
Props.children can also be manipulated by the component. Because props.children may or may not be an array,
React provides utility functions for them as React.Children. Consider in the previous example if we had wanted to
wrap each paragraph in its own <section> element:
Note the use of React.cloneElement to remove the props from the child <p> tag - because props are immutable,
these values cannot be changed directly. Instead, a clone without these props must be used.
Additionally, when adding elements in loops, be aware of how React reconciles children during a rerender, and
strongly consider including a globally unique key prop on child elements added in a loop.
The child object exposes the type property which you can compare to a specific component.
If you are using React.createClass (ES5), 5 user defined functions are called
If you are using class Component extends React.Component (ES6), 3 user defined functions are called
Prop values returned by this function will be used as defaults if they are not defined when the component is
instantiated.
In the following example, this.props.name will be defaulted to Bob if not specified otherwise:
getDefaultProps() {
return {
initialCount: 0,
name: 'Bob'
};
}
The return value of getInitialState() defines the initial state of the React component. The React framework will
call this function and assign the return value to this.state.
In the following example, this.state.count will be intialized with the value of this.props.initialCount:
getInitialState() {
return {
count : this.props.initialCount
};
}
This function can be used to make final changes to the component before it will be added to the DOM.
componentWillMount() {
...
}
The render() function should be a pure function of the component's state and props. It returns a single element
This function will be recalled after any change to the component's props or state.
render() {
return (
<div>
Hello, {this.props.name}!
</div>
);
}
The component has been mounted and you are now able to access the component's DOM nodes, e.g. via refs.
Preparing timers
Fetching data
Adding event listeners
Manipulating DOM elements
componentDidMount() {
...
}
ES6 Syntax
If the component is defined using ES6 class syntax, the functions getDefaultProps() and getInitialState()
cannot be used.
Instead, we declare our defaultProps as a static property on the class, and declare the state shape and initial state
in the constructor of our class. These are both set on the instance of the class at construction time, before any
other React lifecycle function is called.
this.state = {
count: this.props.initialCount
};
}
upCount() {
this.setState((prevState) => ({
count: prevState.count + 1
}));
}
render() {
return (
<div>
MyReactClass.defaultProps = {
name: 'Bob',
initialCount: 0
};
Replacing getDefaultProps()
Default values for the component props are specified by setting the defaultProps property of the class:
MyReactClass.defaultProps = {
name: 'Bob',
initialCount: 0
};
Replacing getInitialState()
The idiomatic way to set up the initial state of the component is to set this.state in the constructor:
constructor(props){
super(props);
this.state = {
count: this.props.initialCount
};
}
componentWillUnmount(){
...
}
constructor(props) {
super(props);
this.state = {
componentDidMount() {
document.addEventListener("click", this.closeMenu);
}
componentWillUnmount() {
document.removeEventListener("click", this.closeMenu);
}
openMenu() {
...
}
closeMenu() {
...
}
render() {
return (
<div>
<a
href = "javascript:void(0)"
className = "closebtn"
onClick = {this.closeMenu}
>
×
</a>
<div>
Some other structure
</div>
</div>
);
}
}
When component's properties change, React will call this function with the new properties. You can access to
the old props with this.props and to the new props with nextProps.
With these variables, you can do some comparison operations between old and new props, or call function because
a property change, etc.
componentWillReceiveProps(nextProps){
if (nextProps.initialCount && nextProps.initialCount > this.state.count){
this.setState({
count : nextProps.initialCount
});
}
}
shouldComponentUpdate(nextProps, nextState)
By default, if another component / your component change a property / a state of your component, React will
render a new version of your component. In this case, this function always return true.
You can override this function and choose more precisely if your component must update or not.
In case of the function returns false, the update pipeline stops immediately.
componentShouldUpdate(nextProps, nextState){
return this.props.name !== nextProps.name ||
this.state.count !== nextState.count;
}
componentWillUpdate(nextProps, nextState)
This function works like componentWillMount(). Changes aren't in DOM, so you can do some changes just before
the update will perform.
componentWillUpdate(nextProps, nextState){}
render()
componentDidUpdate(prevProps, prevState)
Same stuff as componentDidMount() : DOM is refreshed, so you can do some work on the DOM here.
componentDidUpdate(prevProps, prevState){}
This example summarize Which methods (componentWillMount, componentWillReceiveProps, etc) will be called
and in which sequence will be different for a component in different states:
1. getDefaultProps
2. getInitialState
3. componentWillMount
4. render
5. componentDidMount
1. shouldComponentUpdate
2. componentWillUpdate
3. render
4. componentDidUpdate
1. componentWillReceiveProps
2. shouldComponentUpdate
3. componentWillUpdate
4. render
5. componentDidUpdate
1. componentWillUnmount
// Container component
import React, { Component } from 'react';
import Api from 'path/to/api';
componentDidMount() {
// Make API call and update state with returned comments
Api.getComments().then(comments => this.setState({ comments }));
}
render() {
// Pass our state comments to the presentational component
return (
<CommentsList comments={this.state.comments} />;
);
}
}
// Presentational Component
const CommentsList = ({ comments }) => (
<div>
{comments.map(comment => (
<div>{comment}</div>
)}
</div>
);
CommentsList.propTypes = {
comments: React.PropTypes.arrayOf(React.PropTypes.string)
}
this.onChange = this.onChange.bind(this);
this.state = {
name: ''
};
}
onChange(e) {
this.setState({
name: e.target.value
});
}
render() {
return (
<div>
<label for='name-input'>Name: </label>
<input
id='name-input'
onChange={this.onChange}
value={this.state.name} />
</div>
)
}
}
The above example demonstrates how the value property defines the current value of the input and the onChange
event handler updates the component's state with the user's input.
Form inputs should be defined as controlled components where possible. This ensures that the component state
and the input value is in sync at all times, even if the value is changed by a trigger other than a user input.
this.onChange = this.onChange.bind(this);
this.state = {
name: 'John'
onChange(e) {
this.setState({
name: e.target.value
});
}
render() {
return (
<div>
<label for='name-input'>Name: </label>
<input
id='name-input'
onChange={this.onChange}
defaultValue={this.state.name} />
</div>
)
}
}
Here, the component's state is updated via the onChange event handler, just as for controlled components.
However, instead of a value property, a defaultValue property is supplied. This determines the initial value of the
input during the first render. Any subsequent changes to the component's state are not automatically reflected by
the input value; If this is required, a controlled component should be used instead.
This is simple boilerplate project. This post will guide you to set up the environment for ReactJs + Webpack + Bable.
we will need node package manager for fire up express server and manage dependencies throughout the project. if
you are new to node package manager, you can check here. Note : Installing node package manager is require
here.
Create a folder with suitable name and navigate into it from terminal or by GUI.Then go to terminal and type npm
init this will create a package.json file, Nothing scary , it will ask you few question like name of your project
,version, description, entry point, git repository, author, license etc. Here entry point is important because node will
initially look for it when you run the project. At the end it will ask you to verify the information you provide. You can
type yes or modify it. Well that's it , our package.json file is ready.
Express server setup run npm install express@4 --save. This is all the dependencies we needed for this project.Here
save flag is important, without it package.js file will not be updated. Main task of package.json is to store list of
dependencies. It will add express version 4. Your package.json will look like "dependencies": { "express":
"^4.13.4", ............. },
After complete download you can see there is node_modules folder and sub folder of our dependencies. Now on the
root of project create new file server.js file. Now we are setting express server. I am going to past all the code and
explain it later.
app.use(express.static('public'));
app.listen(3000, function () {
console.log('Express server is using port:3000');
});
var express = require('express'); this will gave you the access of entire express api.
var app = express(); will call express library as function. app.use(); let the add the functionality to your express
application. app.use(express.static('public')); will specify the folder name that will be expose in our web server.
app.listen(port, function(){}) will here our port will be 3000 and function we are calling will verify that out web server
is running properly. That's it express server is set up.
Now go to our project and create a new folder public and create index.html file. index.html is the default file for you
application and Express server will look for this file. The index.html is simple html file which looks like
<!DOCTYPE html>
<html>
<head>
<body>
<h1>hello World</h1>
</body>
</html>
And go to the project path through the terminal and type node server.js. Then you will see * console.log('Express
server is using port:3000');*.
Go to the browser and type http://localhost:3000 in nav bar you will see hello World.
Now go inside the public folder and create a new file app.jsx. JSX is a preprocessor step that adds XML syntax to
your JavaScript.You can definitely use React without JSX but JSX makes React a lot more elegant. Here is the sample
code for app.jsx
ReactDOM.render(
<h1>Hello World!!!</h1>,
document.getElementById('app')
);
Now go to index.html and modify the code , it should looks like this
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23
/browser.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.js"> </script>
</head>
<body>
<div id="app"></div>
</html>
With this in place you are all done, I hope you find it simple.
You can also use Node Version Manager to better manage your node and npm versions. It is great for testing your
project on different node versions. However, it is not recommended for production environment.
Once you have installed node on your system, go ahead and install some essential packages to blast off your first
React project using Babel and Webpack.
You can start your project by running npm init in your terminal. Follow the initial setup. After that, run following
commands in your terminal-
Dependencies:
Dev Dependecies:
{
"presets": ["es2015", "stage-0", "react"]
}
{
"ecmaFeatures": {
"jsx": true,
"modules": true
},
"env": {
"browser": true,
"node": true
},
"parser": "babel-eslint",
"rules": {
"quotes": [2, "single"],
"strict": [2, "never"],
},
"plugins": [
"react"
]
}
Create a .gitignore file to prevent uploading generated files to your git repo.
node_modules
npm-debug.log
.DS_Store
dist
And finally, create a sever.js file to be able to run npm start, with following contents:
new WebpackDevServer(webpack(config), {
publicPath: config.output.publicPath,
hot: true,
historyApiFallback: true
}).listen(3000, 'localhost', function (err, result) {
if (err) {
return console.log(err);
}
Run node server.js or npm start in the terminal, if you have defined what start stands for in your package.json
We are setting an arrow function ‘handleToggle’ that will fire when an icon will be clicked. We’re just showing and
hiding a div with a reference naming ‘toggle’ onClick over an icon.
handleToggle = () => {
const el = findDOMNode(this.refs.toggle);
$(el).slideToggle();
};
handleToggle = () => {
const el = findDOMNode(this.refs.toggle);
$(el).slideToggle();
};
render() {
return (
<div className=”long-desc”>
<ul className=”profile-info”>
<li>
<span className=”info-title”>User Name : </span> Shuvo Habib
</li>
</ul>
We are done! This is the way, how we can use jQuery in React component.
export default(
<Route path="/" component={App}>
<IndexRoute component={Index} />
<Route path="posts/new" component={New} />
<Route path="posts/:id" component={Show} />
</Route>
);
Now in your top level index.js that is your entry point to the app, you need only render this Router
component like so:
// entry point
ReactDOM.render(
<Router history={browserHistory} routes={routes} />
, document.getElementById('main'));
Now it is simply a matter of using Link instead of <a> tags throughout your application. Using Link will
communicate with React Router to change the React Router route to the specified link, which will in turn
render the correct component as defined in routes.js
In the example below we have three different components and one connected component
UserInputForm: This component display an input field And when the field value changes, it calls
inputChange method on props (which is provided by the parent component) and if the data is provided as
well, it displays that in the input field.
UserDashboard: This component displays a simple message and also nests UserInputForm component, It
also passes inputChange method to UserInputForm component, UserInputForm component inturn makes
use of this method to communicate with the parent component.
return(
<form action="" onSubmit={handleSubmit}>
<label htmlFor="name">Please enter your name</label>
<br />
<input type="text" id="name" defaultValue={props.data.name || ''} onChange={
props.inputChange } />
</form>
)
return(
<div>
<h1>Hi { props.user.name || 'User' }</h1>
<UserInputForm data={props.user} inputChange={inputChangeHandler} />
</div>
default:
return state;
}
};
ReactDOM.render(
<Provider store={ store }>
<App />
</Provider>,
document.getElementById('application')
);
JS Bin URL
The build pipeline you will be building is based in Node.js so you must ensure in the first instance that you have this
installed. For instructions on how to install Node.js you can checkout the SO docs for that here
Open your project folder on the command line and use the following command:
npm init
For the purposes of this example you can feel free to take the defaults or if you'd like more info on what all this
means you can check out this SO doc on setting up package configuration.
Run the following command on the command line to install the packages necessary for this example:
Finally webpack and webpack-dev-server are things that are worth installing globally rather than as a dependency
of your project, if you'd prefer to add it as a dependency then that will work to, I don't. Here is the command to run:
This will setup babel to use the presets you've just installed. Your .babelrc file should look like this:
{
"presets": ["react", "es2015"]
}
Set yourself up a directory stucture that looks like the below in the root of your directory:
|- node_modules
|- src/
|- components/
|- images/
|- styles/
|- index.html
NOTE: The node_modules, .babelrc and package.json should all have already been there from previous steps I just
included them so you can see where they fit.
Step 5: Populate the project with the Hello World project files
This isn't really important to the process of building a pipeline so I'll just give you the code for these and you can
copy paste them in:
src/components/HelloWorldComponent.jsx
handleChange(e) {
this.setState({name: e.target.value});
}
render() {
return (
<div>
<div className="image-container">
<img src="./images/myImage.gif" />
</div>
<div className="form">
<input type="text" onChange={this.handleChange} />
<div>
My name is {this.state.name} and I'm a clever cloggs because I built a React build
pipeline
</div>
</div>
</div>
);
}
}
src/images/myImage.gif
Feel free to substitute this with any image you'd like it's simply there to prove the point that we can bundle up
images as well. If you provide your own image and you name it something different then you'll have to update the
HelloWorldComponent.jsx to reflect your changes. Equally if you choose an image with a different file extension
then you need to modify the test property of the image loader in the webpack.config.js with appropriate regex to
match your new file extension..
src/styles/styles.css
.form {
margin: 25px;
.form div {
padding-top: 25px;
}
.image-container {
display: flex;
justify-content: center;
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Learning to build a react pipeline</title>
</head>
<body>
<div id="content"></div>
<script src="app.js"></script>
</body>
</html>
index.jsx
require('./images/myImage.gif');
require('./styles/styles.css');
require('./index.html');
Create a file called webpack.config.js in the root of your project and copy this code into it:
webpack.config.js
var config = {
context: path.resolve(__dirname + '/src'),
entry: './index.jsx',
output: {
filename: 'app.js',
path: path.resolve(__dirname + '/dist'),
},
devServer: {
contentBase: path.join(__dirname + '/dist'),
port: 3000,
open: true,
module.exports = config;
To do this you will need to add two properties to the scripts key of the JSON defined in the package.json file in the
root of your project. Make your scripts key look like this:
"scripts": {
"start": "webpack-dev-server",
"build": "webpack",
"test": "echo \"Error: no test specified\" && exit 1"
},
The test script will have already been there and you can choose whether to keep it or not, it's not important to this
example.
From the command line, if you are in the project root directory you should now be able to run the command:
This will bundle up the little application you've built and place it in the dist/ directory that it will create in the root
of your project folder.
npm start
Then the application you've built will be served up in your default web browser inside of a webpack dev server
instance.
React.createClass (deprecated)
Here we have a const with a React class assigned, with the render function following on to complete a typical base
component definition.
React.Component
Let's take the above React.createClass definition and convert it to use an ES6 class.
In this example we're now using ES6 classes. For the React changes, we now create a class called MyComponent
and extend from React.Component instead of accessing React.createClass directly. This way, we use less React
boilerplate and more JavaScript.
PS: Typically this would be used with something like Babel to compile the ES6 to ES5 to work in other browsers.
React.createClass
Note the onClick declaration with the this.handleClick method bound. When this method gets called React will
apply the right execution context to the handleClick.
React.Component
With ES6 classes this is null by default, properties of the class do not automatically bind to the React class
(component) instance.
There are a few ways we could bind the right this context.
You can also use ES6 anonymous function without having to bind explicitly:
React.createClass
In this version, the propTypes property is an Object in which we can declare the type for each prop. The
getDefaultProps property is a function that returns an Object to create the initial props.
React.Component
This version uses propTypes as a property on the actual MyComponent class instead of a property as part of the
createClass definition Object.
The getDefaultProps has now changed to just an Object property on the class called defaultProps, as it's no longer
a "get" function, it's just an Object. It avoids more React boilerplate, this is just plain JavaScript.
Additionally, there is another syntax for propTypes and defaultProps. This is a shortcut if your build has ES7
property initializers turned on:
React.createClass
In this version we can add mixins to components using the mixins property which takes an Array of available
mixins. These then extend the component class.
var MyMixin = {
doSomething() {
}
};
const MyComponent = React.createClass({
mixins: [MyMixin],
handleClick() {
this.doSomething(); // invoke mixin's method
},
render() {
return (
<button onClick={this.handleClick}>Do Something</button>
);
}
});
React.Component
React mixins are not supported when using React components written in ES6. Moreover, they will not have support
for ES6 classes in React. The reason is that they are considered harmful.
React.createClass
React.Component
In this version we declare all state as a simple initialisation property in the constructor, instead of using the
getInitialState function. It feels less "React API" driven since this is just plain JavaScript.
showResults(response){
this.setState({
searchResults: response.results
})
}
search(url){
$.ajax({
type: "GET",
dataType: 'jsonp',
url: url,
success: (data) => {
this.showResults(data);
render() {
return (
<div>
<SearchBox search={this.search.bind(this)} />
<Results searchResults={this.state.searchResults} />
</div>
);
}
}
A request can be initiated by invoking the appropriate method on the request object, then calling .end() to send
the request. Setting header fields is simple, invoke .set() with a field name and value.
The .query() method accepts objects, which when used with the GET method will form a query-string. The
following will produce the path /search?query=Manny&range=1..5&order=desc.
POST requests
request.post('/user')
.set('Content-Type', 'application/json')
.send('{"name":"tj","pet":"tobi"}')
.end(callback)
We make an AJAX request using fetch, which is build into most browsers. Use a fetch polyfill in production to
support older browsers. You can also use any other library for making requests (e.g. axios, SuperAgent, or even
plain Javascript).
We set the data we receive as component state, so we can access it inside the render method. There, we loop
through the data using map. Don't forget to always add a unique key attribute (or prop) to the looped element,
which is important for React's rendering performance.
componentDidMount() {
fetch('/api/users')
.then(response => response.json())
.then(json => this.setState({ users: json.data }));
}
render() {
return (
<div>
<h1>Users</h1>
{
this.state.users.length == 0
? 'Loading users...'
: this.state.users.map(user => (
<figure key={user.id}>
<img src={user.avatar} />
<figcaption>
{user.name}
</figcaption>
</figure>
))
}
</div>
);
}
}
request.onload = () => {
if (request.status >= 200 && request.status < 400) {
// Success!
this.setState({someData: request.responseText})
} else {
// We reached our target server, but it returned an error
// Possibly handle the error by changing your state.
}
};
request.onerror = () => {
// There was a connection error of some sort.
// Possibly handle the error by changing your state.
};
request.send();
},
render() {
return (
<div>{this.state.someData || 'waiting for response...'}</div>
)
}
}
In this example, we will change the Parent state by passing a function to the Child component and invoking that
function inside the Child component.
this.outputEvent = this.outputEvent.bind(this);
}
outputEvent(event) {
// the event context comes from the Child
this.setState({ count: this.state.count++ });
}
render() {
const variable = 5;
return (
<div>
Count: { this.state.count }
<Child clickHandler={this.outputEvent} />
</div>
);
}
}
Note that the Parent's outputEvent method (that changes the Parent state) is invoked by the Child's button onClick
event.
There are at least 3 patterns to do that. You can find a comparison here.
Pattern 1: Event Emitter/Target/Dispatcher: the listeners need to reference the source to subscribe.
Pattern 2: Publish/Subscribe: you don't need a specific reference to the source that triggers the event, there
is a global object accessible everywhere that handles all the events.
Pattern 3: Signals: similar to Event Emitter/Target/Dispatcher but you don't use any random strings here.
Each object that could emit events needs to have a specific property with that name. This way, you know
exactly what events can an object emit.
You can pass props down to child components. In this example message is the prop that we pass down to the
child component, the name message is chosen arbitrarily, you can name it anything you want.
Here, the <Parent /> component renders two <Child /> components, passing message for child inside the first
component and 5 inside the second one.
Prior to React v14 we could create a stateful React component using React.Component (in ES6), or
React.createClass (in ES5), irrespective of whether it requires any state to manage data or not.
React v14 introduced a simpler way to define components, usually referred to as stateless functional
components. These components use plain JavaScript functions.
For example:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
This function is a valid React component because it accepts a single props object argument with data and returns a
React element. We call such components functional because they are literally JavaScript functions.
Stateless functional components typically focus on UI; state should be managed by higher-level “container”
components, or via Flux/Redux etc. Stateless functional components don’t support state or lifecycle methods.
Benefits:
1. No class overhead
2. Don't have to worry about this keyword
3. Easy to write and easy to understand
4. Don't have to worry about managing state values
5. Performance improvement
Summary: If you are writing a React component that doesn't require state and would like to create a reusable UI,
instead of creating a standard React Component you can write it as a stateless functional component.
Let's say we have a page that can register a user, search for registered users, or display a list of all the registered
users.
ReactDOM.render(
<HomePage/>,
document.getElementById('app')
);
homepage.js:
constructor(props) {
super();
this.state={users:[], showSearchResult: false, searchResult: []};
}
registerClick(){
let users = this.state.users.slice();
if(users.indexOf(this.refs.mail_id.value) == -1){
users.push(this.refs.mail_id.value);
this.refs.mail_id.value = '';
this.setState({users});
}else{
alert('user already registered');
}
}
searchClick(){
let users = this.state.users;
let index = users.indexOf(this.refs.search.value);
if(index >= 0){
this.setState({searchResult: users[index], showSearchResult: true});
}else{
alert('no user found with this mail id');
}
}
hideSearchResult(){
this.setState({showSearchResult: false});
}
render() {
return (
<div>
<input placeholder='email-id' ref='mail_id'/>
<input type='submit' value='Click here to register'
onClick={this.registerClick.bind(this)}/>
<input style={{marginLeft: '100px'}} placeholder='search' ref='search'/>
<input type='submit' value='Click here to register'
onClick={this.searchClick.bind(this)}/>
{this.state.showSearchResult ?
<div>
Search Result:
<List users={[this.state.searchResult]}/>
<p onClick={this.hideSearchResult.bind(this)}>Close this</p>
</div>
:
<div>
Registered users:
Finally, our stateless functional component List, which is used display both the list of registered users and the
search results, but without maintaining any state itself.
list.js:
Reference: https://facebook.github.io/react/docs/components-and-props.html
import Perf from 'react-addons-perf' // ES6 var Perf = require('react-addons-perf') // ES5 with npm var Perf =
React.addons.Perf; // ES5 with react-with-addons.js
You can use below methods from the imported Perf module:
Perf.printInclusive()
Perf.printExclusive()
Perf.printWasted()
Perf.printOperations()
Perf.printDOM()
The most important one which you will need most of the time is Perf.printWasted() which gives you the tabular
representation of your individual component's wasted time
You can note the Wasted time column in the table and improve Component's performance using Tips & Tricks
section above
Refer the React Official Guide and excellent article by Benchling Engg. on React Performance
1. Two components of the same class will generate similar trees and tw components of different
classes will generate different trees.
2. It is possible to provide a unique key for elements that is stable across different renders.
Moreover, what follows is crucial and extremely important to understand if you want to optimise performance
If they [two nodes] are not of the same type, React is not going to even try at matching what they render.
It is just going to remove the first one from the DOM and insert the second one.
Here's why
It is very unlikely that a element is going to generate a DOM that is going to look like what a would
generate. Instead of spending time trying to match those two structures, React just re-builds the tree
from scratch.
Each web page is represented internally as a tree of objects. This representation is called Document Object Model.
Moreover, it is a language-neutral interface that allows programming languages (such as JavaScript) to access the
HTML elements.
In other words
The HTML DOM is a standard for how to get, change, add, or delete HTML elements.
So React's team came up with the idea to abstract the HTML DOM and create its own Virtual DOM in order to
compute the minimum number of operations we need to apply on the HTML DOM to replicate current state of our
application.
How Exactly?
At each point of time, React has the application state represented as a Virtual DOM. Whenever application state
changes, these are the steps that React performs in order to optimise performance
1. Generate a new Virtual DOM that represents the new state of our application
2. Compare the old Virtual DOM (which represents the current HTML DOM) vs the new Virtual DOM
3. Based on 2. find the minimum number of operations to transform the old Virtual DOM (which represents the
current HTML DOM) into the new Virtual DOM
4. After those operations are found, they are mapped into their equivalent HTML DOM operations
remember, the Virtual DOM is only an abstraction of the HTML DOM and there is a isomorphic relation
5. Now the minimum number of operations that have been found and transferred to their equivalent HTML
DOM operations are now applied directly onto the application's HTML DOM, which saves time from modifying
the HTML DOM unnecessarily.
Note: Operations applied on the Virtual DOM are cheap, because the Virtual DOM is a JavaScript Object.
1. If you see yourself alternating between two components classes with very similar output, you may want to
make it the same class.
2. Use shouldComponentUpdate to prevent component from rerender, if you know it is not going to change,
for example
renderToString
This will render React components to HTML on server. This function will also add data-react- properties to HTML
elements so React on client won't have to render elements again.
renderToStaticMarkup
This will render React components to HTML, but without data-react- properties, it is not recommended to use
components that will be rendered on client, because components will rerender.
Filename: src/index.jsx
Filename: webpack.config.js
module.exports = {
entry: __dirname + "/src/index.jsx",
devtool: "source-map",
output: {
path: __dirname + "/build",
filename: "bundle.js"
},
module: {
loaders: [
{test: /\.jsx?$/, exclude: /node_modules/, loader: "babel-loader"}
]
}
}
Filename: .babelrc
{
"presets": ["es2015","react"]
}
Filename: index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="App"></div>
<script src="build/bundle.js" charset="utf-8"></script>
</body>
</html>
$ webpack
const AppContainer =
({ posts, dispatch, children }: Props) => (
<div className="main-app">
<Header {...{ posts, dispatch }} />
{children}
</div>
)
type Props = {
posts: Array<Article>,
dispatch: Function,
children: ReactElement
}
render () {
// rest of the code goes here
}
}
JavaScript Expressions
You can pass any JavaScript expression as a prop, by surrounding it with {}. For example, in this JSX:
Inside the MyComponent, the value of props.count will be 10, because the expression 1 + 2 + 3 + 4 gets evaluated.
If statements and for loops are not expressions in JavaScript, so they can't be used in JSX directly.
String Literals
Of course, you can just pass any string literal as a prop too. These two JSX expressions are equivalent:
When you pass a string literal, its value is HTML-unescaped. So these two JSX expressions are equivalent:
This behavior is usually not relevant. It's only mentioned here for completeness.
If you pass no value for a prop, it defaults to true. These two JSX expressions are equivalent:
However, the React team says in their docs using this approach is not recommended, because it can be confused
with the ES6 object shorthand {foo} which is short for {foo: foo} rather than {foo: true}. They say this behavior
is just there so that it matches the behavior of HTML.
Spread Attributes
If you already have props as an object, and you want to pass it in JSX, you can use ... as a spread operator to pass
the whole props object. These two components are equivalent:
function Case1() {
return <Greeting firstName="Kaloyab" lastName="Kosev" />;
}
function Case2() {
const person = {firstName: 'Kaloyan', lastName: 'Kosev'};
String Literals
You can put a string between the opening and closing tags and props.children will just be that string. This is useful
for many of the built-in HTML elements. For example:
<MyComponent>
<h1>Hello world!</h1>
</MyComponent>
This is valid JSX, and props.children in MyComponent will simply be <h1>Hello world!</h1>.
Note that the HTML is unescaped, so you can generally write JSX just like you would write HTML.
JSX Children
You can provide more JSX elements as the children. This is useful for displaying nested components:
<MyContainer>
<MyFirstComponent />
<MySecondComponent />
</MyContainer>
You can mix together different types of children, so you can use string literals together with JSX children.
This is another way in which JSX is like HTML, so that this is both valid JSX and valid HTML:
<div>
<h2>Here is a list</h2>
<ul>
<li>Item 1</li>
<li>Item 2</li>
</ul>
</div>
Note that a React component can't return multiple React elements, but a single JSX expression can have
multiple children. So if you want a component to render multiple things you can wrap them in a div like the
example above.
JavaScript Expressions
You can pass any JavaScript expression as children, by enclosing it within {}. For example, these expressions are
equivalent:
<MyComponent>{'foo'}</MyComponent>
This is often useful for rendering a list of JSX expressions of arbitrary length. For example, this renders an HTML list:
Note that JavaScript expressions can be mixed with other types of children.
Functions as Children
Normally, JavaScript expressions inserted in JSX will evaluate to a string, a React element, or a list of those things.
However, props.children works just like any other prop in that it can pass any sort of data, not just the sorts that
React knows how to render. For example, if you have a custom component, you could have it take a callback as
props.children:
Children passed to a custom component can be anything, as long as that component transforms them into
something React can understand before rendering. This usage is not common, but it works if you want to stretch
what JSX is capable of.
Ignored Values
Note that false, null, undefined, and true are valid children. But they simply don't render. These JSX expressions
will all render to the same thing:
<MyComponent />
<MyComponent></MyComponent>
<MyComponent>{false}</MyComponent>
<MyComponent>{true}</MyComponent>
This is extremely useful to conditionally render React elements. This JSX only renders a if showHeader is true:
<div>
{showHeader && <Header />}
<Content />
</div>
One important caveat is that some "falsy" values, such as the 0 number, are still rendered by React. For example,
this code will not behave as you might expect because 0 will be printed when props.messages is an empty array:
<div>
{props.messages.length &&
<MessageList messages={props.messages} />
}
</div>
One approach to fix this is to make sure that the expression before the && is always boolean:
<div>
{props.messages.length > 0 &&
<MessageList messages={props.messages} />
}
</div>
Lastly, bare in mind that if you want a value like false, true, null, or undefined to appear in the output, you have
to convert it to a string first:
<div>
My JavaScript variable is {String(myVariable)}.
</div>
handleChange(event) {
let person = this.state.person;
person[event.target.name] = event.target.value;
this.setState({person});
}
render() {
return (
<form>
<input
type="text"
name="firstName"
value={this.state.firstName}
onChange={this.handleChange.bind(this)} />
<input
type="text"
name="lastName"
value={this.state.lastName}
onChange={this.handleChange.bind(this)} />
</form>
)
}
In this example we initialize state with an empty person object. We then bind the values of the 2 inputs to the
individual keys of the person object. Then as the user types, we capture each value in the handleChange function.
Since the values of the components are bound to state we can rerender as the user types by calling setState().
NOTE: Not calling setState() when dealing with controlled components, will cause the user to type, but not see
the input because React only renders changes when it is told to do so.
It's also important to note that the names of the inputs are same as the names of the keys in the person object.
This allows us to capture the value in dictionary form as seen here.
handleChange(event) {
let person = this.state.person;
person[event.target.name] = event.target.value;
this.setState({person});
render() {
return React.createElement(
'section', this.props
);
}
}
render(...elements) {
var props = Object.assign({
className: this.props.active ? 'active' : '',
tabIndex: -1
}, this.props);
return React.createElement(
'div', props,
...elements
);
}
static title() {
return '';
}
static css() {
return '';
}
}
render() {
var props = Object.assign({
className: this.props.active ? 'active' : ''
}, this.props);
return React.createElement(
'li', props,
React.createElement(
'span', props,
props.panelClass.title()
)
);
}
}
panelClass property of Tab instance must contain class of panel used for description.
render() {
this.tabSet = [];
this.panelSet = [];
for (let panelData of this.state.panels) {
var tabIsActive = this.state.activeTab == panelData.name;
this.tabSet.push(React.createElement(
Tab, {
name: panelData.name,
active: tabIsActive,
panelClass: panelData.class,
onMouseDown: () => this.openTab(panelData.name)
}
openTab(name) {
this.setState({ activeTab: name });
this.findDOMNode(this.refs.activePanel).focus();
}
}
panels property of PanelGroup instance must contain array with objects. Every object there declares important
data about panels:
Clarification
When tab is down, needed panel is getting class name active on DOM element (means that it gonna be visible) and
it's focused now.
render() {
return React.createElement(
'main', null,
React.createElement(
Pane, { id: 'common' },
React.createElement(
PanelGroup, {
static title() {
return 'Console';
}
}
static title() {
return 'Figures';
}
}
static title() {
return 'Properties';
}
}
1. Action — simple object describing action type and other input data.
2. Dispatcher — single action receiver and callbacks controller. Imagine it is central hub of your application.
3. Store — contains the application state and logic. It registers callback in dispatcher and emits event to view
when change to the data layer has occurred.
4. View — React component that receives change event and data from store. It causes re-rendering when
something is changed.
As of Flux data flow, views may also create actions and pass them to dispatcher for user
interactions.
Reverted
Different React components (views) get data from different stores about made changes.
Few components may be called controller-views, cause they provide the glue code to get the data
from the stores and to pass data down the chain of their descendants. Controller-views represent
any significant section of the page.
Stores can be remarked as callbacks that compare action type and other input data for business logic of your
application.
Actions are nothing than simple objects with required type property.
Formerly, you'll want to use constants for action types and helper methods (called action
creators).
The main components are (in addition to the standard entry, output and other webpack properties):
The loader
For this you need to create a rule that tests for the .ts and .tsx file extensions, specify ts-loader as the loader.
Resolve TS extensions
You also need to add the .ts and .tsx extensions in the resolve array, or webpack won't see them.
{
"include": [
"src/*"
],
"compilerOptions": {
"target": "es5",
"jsx": "react",
"allowSyntheticDefaultImports": true
}
}
include
This is an array of source code. Here we have only one entry, src/*, which specifies that everything in the src
directory is to be included in compilation.
compilerOptions.target
compilerOptions.jsx
Setting this to true will make TypeScript automatically compile your tsx syntax from <div /> to
React.createElement("div").
compilerOptions.allowSyntheticDefaultImports
Handy property which will allow you to import node modules as if they are ES6 modules, so instead of doing
without any errors telling you that React has no default export.
interface AppProps {
name: string;
}
interface AppState {
words: string[];
}
render() {
const { name } = this.props;
return (<h1>Hello {name}!</h1>);
}
}
When using TypeScript with React, once you've downloaded the React DefinitelyTyped type definitions (npm
install --save @types/react), every component will require you to add type annotations.
where AppProps and AppState are interfaces (or type aliases) for your components' props and state respectively.
When React has to render changes on a list of items, React just iterates over both lists of children at the same time
and generates a mutation whenever there's a difference. If there are no keys set for the children, React scans each
child. Otherwise, React compares the keys to know which were added or removed from the list
function SomeComponent(props){
return (
<ul>
{getItemsList()}
</ul>
);
}
<ul>
<li key='cat'>cat</li>
<li key='dog'>dog</li>
<li key='rat'>rat</li>
<ul>
So if you are iterating over an array to show a list of li elements, each of the li elements needs a unique identifier
specified by the key property. This usually can be the id of your database item or the index of the array.
Each todo item has a text and id property. Imagine that the id property comes from a backend datastore and is a
unique numeric value:
todos = [
{
id: 1,
text: 'value 1'
},
{
id: 2,
text: 'value 2'
},
{
id: 3,
text: 'value 3'
},
{
id: 4,
text: 'value 4'
},
];
We set the key attribute of each iterated list element to todo-${todo.id} so that react can identify it internally:
render() {
const { todos } = this.props;
return (
<ul>
{ todos.map((todo) =>
<li key={ `todo-${todo.id}` }>
{ todo.text }
</li>
}
</ul>
);
}
render() {
const { todos } = this.props;
return (
<ul>
{ todos.map((todo, index) =>
A HOC is a pure javascript function that accepts a component as it's argument and returns a new component with
the extended functionality.
AuthenticatedComponent.js
/**
* Check if the user is authenticated, this.props.isAuthenticated
* has to be set from your application logic (or use react-redux to retrieve it from global
state).
*/
isAuthenticated() {
return this.props.isAuthenticated;
}
/**
* Render
*/
render() {
const loginErrorMessage = (
<div>
Please <a href="/login">login</a> in order to view this part of the
application.
</div>
);
return (
<div>
{ this.isAuthenticated === true ? <Component {...this.props} /> :
loginErrorMessage }
</div>
);
}
};
}
We then just use this Higher Order Component in our components that should be hidden from anonymous users:
MyPrivateComponent.js
hocLogger.js
MyLoggedComponent.js
Use connect to connect component to Redux store and pull props from store to component.
Define actions that allow your components to send messages to the Redux store.
/*
* action types
*/
Handle these messages and create a new state for the store in reducer functions.
This example assumes code to be in src/ and the output to be put into out/. As such the folder structure should
look something like
example/
|-- src/
| |-- index.js
| `-- ...
|-- out/
`-- package.json
Assuming a setup npm environment, we first need to setup babel in order to transpile the React code into es5
compliant code.
The above command will instruct npm to install the core babel libraries as well as the loader module for use with
webpack. We also install the es6 and react presets for babel to understand JSX and es6 module code. (More
information about the presets can be found here Babel presets)
$npm i -D webpack
This command will install webpack as a development dependency. (i is the shorthand for install and -D the
shorthand for --save-dev)
You might also want to install any additional webpack packages (such as additional loaders or the webpack-dev-
server extension)
Setting up webpack
With the dependencies setup we will need a webpack.config.js file to tell webpack what to do
simple webpack.config.js:
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'out'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /(node_modules)/,
This file tells webpack to start with the index.js file (assumed to be in src/ ) and convert it into a single bundle.js file
in the out directory.
The module block tells webpack to test all files encountered against the regular expression and if they match, will
invoke the specified loader. (babel-loader in this case) Furthermore, the exclude regex tells webpack to ignore this
special loader for all modules in the node_modules folder, this helps speed up the transpilation process. Lastly, the
query option tells webpack what parameters to pass to babel and is used to pass along the presets we installed
earlier.
All that is left now is to create the src/index.js file and try packing the application
src/index.js:
'use strict'
render(
<App />,
document. getElementById('app')
)
This file would normally render a simple <h1>Hello world!</h1> Header into the html tag with the id 'app', but for
now it should be enough to transpile the code once.
$./node_modules/.bin/webpack . Will execute the locally installed version of webpack (use $webpack if you
installed webpack globally with -g)
This should create the file out/bundle.js with the transpiled code inside and concludes the example.
After setting up a simple project to use webpack, babel and react issuing $npm i -g webpack-dev-server will install
the development http server for quicker development.
Modifying webpack.config.js
var path = require('path');
module.exports = {
output.publicPath which sets up a path to have our bundle be served from (see Webpack configuration files
for more info)
devServer
contentBase the base path to serve static files from (for example index.html)
hot sets the webpack-dev-server to hot reload when changes get made to files on disk
And finally we just need a simple index.html to test our app in.
index.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>React Sandbox</title>
</head>
<body>
<script src="public/bundle.js"></script>
</body>
</html>
With this setup running $webpack-dev-server should start a local http server on port 8080 and upon connecting
should render a page containing a <h1>Hello world!</h1>.
abhirathore2006 Chapter 10
Adam Chapter 16
Aditya Singh Chapter 17
Adrián Daraš Chapter 18
Ahmad Chapter 5
akashrajkn Chapter 2
Alex Young Chapters 1 and 4
Alexander Chapter 4
Alexg2195 Chapter 6
Anuj Chapters 1, 5 and 6
Aron Chapter 25
Bart Riordan Chapters 1, 2 and 12
Bond Chapter 2
Brad Colthurst Chapter 4
Brandon Roberts Chapter 2
brillout Chapter 31
Daksh Gupta Chapter 1
Danillo Corvalan Chapter 5
David Chapter 15
Dennis Stücken Chapters 27 and 28
F. Kauder Chapter 6
Fabian Schultz Chapter 14
Faktor 10 Chapter 5
ghostffcode Chapter 19
Gianluca Esposito Chapter 1
goldbullet Chapter 2
GordyD Chapter 2
hmnzr Chapter 2
Inanc Gumus Chapter 1
ivarni Chapter 2
Jack7 Chapter 5
Jagadish Upadhyay Chapter 5
Jason Bourne Chapter 14
Jim Chapter 29
JimmyLv Chapters 5 and 20
John Ruddell Chapters 3 and 6
jolyonruss Chapters 1 and 2
Jon Chan Chapters 1 and 2
jonathangoodman Chapter 2
JordanHendrix Chapters 1 and 2
juandemarco Chapter 1
justabuzz Chapter 2
Kaloyan Kosev Chapters 13, 15 and 21
Kousha Chapters 2 and 4
leonardoborges Chapter 13
Leone Chapter 3
lustoykov Chapter 17
Maayan Glikser Chapter 2
Mark Lapierre Chapter 16