React


Introduction to SPA

What is an SPA?
- "App-like" experience
- No page reloads
- Interaction with server "behind the scenes" (AJAX)
- Usually follows MVC pattern

When to use SPA
- Fluid/rich client (Gmail, iCloud, Slides)
- Mobile/hybrid
- High latency networks
- Less duplicate code between client and server
- Offload the server

Drawbacks
- Reimplementations of functionality already available in the browser
- Memory consumption
- Initial load
- Excluding older browsers
- SEO
- Accessibility

Server-side rendering
- Requesting the page
- Posting forms
Server
Client
- Routing
- Rendering (templates)
- Forms (buttons, input fields)
- Serving the client assets (HTML, CSS, JS)

SPA
- Requesting data
- Routing
- Rendering
- User interaction
Server
Client
- Serving the client assets (HTML, CSS, JS)
- Responding with data

| Framework/Library | Routing | Two-way binding | Modules | Views |
| Angular | X | X | X | X |
| Backbone | X | X | ||
| Knockout | X | X | ||
| React | X |

Introducing React

Why?
- Nice component structure
- Faster at rendering than other SPA libraries (that we've used)
- No need to do optimizations for lists (looking at you, Knockout)
- Simple one-way data flow

What?
- The V in MVC
- Compatible with IE8 and above
- Built by Facebook

Not an MVC Framework

No two-way data binding

No event system/observables

Components
- The building block of React
- React.createClass({ ... })
- this.props
- this.state
- render() returns a component

JSX
- No HTML
- HTML-ish in Javascript
- Compilation step
- Can be interpreted in browser when developing
- Optional

My first component

var First = React.createClass({
render: function () {
return (
<p>My first component!</p>
);
}
});
var Counter = React.createClass({
getInitialState: function () {
return {
count: 0
};
},
increaseCount: function () {
this.setState({
count: this.state.count + 1
});
},
render: function () {
return (
<button onClick={this.increaseCount}>
You clicked {this.state.count} times!
</button>
);
}
});
var Counter = React.createClass({
// ...
});
React.render(
<Counter />,
document.body
);
Parent to child communication

var Child = React.createClass({
render: function () {
return (
<p>{this.props.text}</p>
);
}
});
var Parent = React.createClass({
render: function () {
return (
<div className="container">
<Child text="Pass this to the child component" />
</div>
);
}
});Child to parent communication

var Child = React.createClass({
onDeleteClick: function () {
this.props.onDelete();
},
render: function () {
return (
<button onClick={this.onDeleteClick}>
Delete
</button>
);
}
});
var Parent = React.createClass({
onChildDelete: function (childData) {
backend.delete(childData);
},
render: function () {
var childData = { /* ... */ };
return (
<Child onDelete={this.onChildDelete.bind(this, childData)} />
);
}
});
Virtual DOM
- Performs a diff to calculate actual DOM changes
- Synthetic events

Works well with...
- Backbone collections, models
- Bacon.js, rx.js
- Browserify
- Good ol' callbacks

Server-side rendering
- SEO
- Fast page loads

Lab

React
By Joacim Löwgren
React
A lab and presentation on the basics of React.
- 470