React
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/874430/react.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Introduction to SPA
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
What is an SPA?
- "App-like" experience
- No page reloads
- Interaction with server "behind the scenes" (AJAX)
- Usually follows MVC pattern
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Drawbacks
- Reimplementations of functionality already available in the browser
- Memory consumption
- Initial load
- Excluding older browsers
- SEO
- Accessibility
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Server-side rendering
- Requesting the page
- Posting forms
Server
Client
- Routing
- Rendering (templates)
- Forms (buttons, input fields)
- Serving the client assets (HTML, CSS, JS)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
SPA
- Requesting data
- Routing
- Rendering
- User interaction
Server
Client
- Serving the client assets (HTML, CSS, JS)
- Responding with data
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Framework/Library | Routing | Two-way binding | Modules | Views |
Angular | X | X | X | X |
Backbone | X | X | ||
Knockout | X | X | ||
React | X |
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Introducing React
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
What?
- The V in MVC
- Compatible with IE8 and above
- Built by Facebook
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Not an MVC Framework
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
No two-way data binding
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
No event system/observables
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Components
- The building block of React
- React.createClass({ ... })
- this.props
- this.state
- render() returns a component
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
JSX
- No HTML
- HTML-ish in Javascript
- Compilation step
- Can be interpreted in browser when developing
- Optional
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
My first component
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
var First = React.createClass({
render: function () {
return (
<p>My first component!</p>
);
}
});
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
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>
);
}
});
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
var Counter = React.createClass({
// ...
});
React.render(
<Counter />,
document.body
);
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Parent to child communication
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
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
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
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)} />
);
}
});
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Virtual DOM
- Performs a diff to calculate actual DOM changes
- Synthetic events
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Works well with...
- Backbone collections, models
- Bacon.js, rx.js
- Browserify
- Good ol' callbacks
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Server-side rendering
- SEO
- Fast page loads
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
Lab
![](https://s3.amazonaws.com/media-p.slid.es/uploads/oskarwickstrom/images/901615/jay.png)
React
By Joacim Löwgren
React
A lab and presentation on the basics of React.
- 464