An Introduction to React
JAMES PEARCE

@jamespearce
toddler

imperative programming

describe computation in terms
of statements that change a
program state
teenager

declarative programming

express the logic of a
computation without
describing control flow
A JavaScript Library For

Building User Interfaces
http://todomvc.com/
☕(n)
Simple
!
Declarative
http://reactjs.org
state describe
state describe
for every
change of
the whole
user interface
state describe
for every
change of
the whole
user interface
state 1 state 2
state 1 state 2
DOM mutations
MVD #1
* Minimum Viable Demo
<!DOCTYPE html>
<html>
<head>
<script src="react/build/react.js"></script>
<script src="react/build/JSXTransformer.js"></script>
<script src="labelapp.js" type="text/jsx"></script>
</head>
<body/>
</html>
var LabelApp = React.createClass({
render: function () {
return <div>Hello World!</div>;
}
});
!
React.render(
<LabelApp />,
document.body
);
var LabelApp = React.createClass({
render: function () {
return <div>{this.props.message}</div>;
}
});
!
React.render(
<LabelApp message="Hello Raleigh!" />,
document.body
);
State & component lifecycle
props
!
passed in from parent
!
<MyComp foo="bar" />



this.props read-only within
!
can be defaulted & validated
state
!
created within component
!
getInitialState


this.state to read



this.setState() to update
var MyComponent = React.createClass({
!
propTypes: {},

getDefaultProps: function () {},
getInitialState: function () {},
!
componentWillMount: function () {},
componentWillUnmount: function () {},
...

render: function () {
// only read props & state -> return UI
},
});
var MyComponent = React.createClass({
!
iGotClicked: function () {...},
!
render: function () {
return <div onClick={this.iGotClicked}>Click</div>;
},
});
Or a parent’s method passed in via props
MVD #2
var LabelApp = React.createClass({
getDefaultProps: function () {
return {message: 'Hello World!'};
},
!
getInitialState: function () {
return {message: this.props.message};
},
!
render: function() {
return <div>{this.state.message}</div>;
}
});
onClick: function () {
this.setState({message: 'Hello Raleigh!'});
},
!
render: function () {
return (
<div onClick={this.onClick}>
{this.state.message}
</div>
);
}
How does data flow?
Component
Component
Component
Component
Component Component
props
props
setState
Component
Component
Component
Component
Component Component
props
props
setState
event

callback
state

stored as high up as it needs to be 

to pass down to affected children
Table
Row Cell Cell Cell Cell
Row Cell Cell Cell Cell
Row Cell Cell Cell Cell
state is

on cells
Table
Row Cell Cell Cell Cell
Row Cell Cell Cell Cell
Row Cell Cell Cell Cell
Total
Total
Total
state is

on rows
Table
Row Cell Cell Cell Cell
Row Cell Cell Cell Cell
Row Cell Cell Cell Cell
Total
Total
Total
Row Total Total Total Total Total
state is

on table
MVD #3
var Table = React.createClass({
getInitialState: function () {
var data = [];
for (var r = 0; r < this.props.rows; r++) {
data[r] = [];
for (var c = 0; c < this.props.columns; c++) {
data[r][c] = 0;
}
}
return {data: data};
},
render: function () {return <table>...</table>;}
});
!
React.render(<Table columns={4} rows={3} />, ...
var Row = React.createClass({
render: function () {
return <tr>{this.props.children}</tr>;
}
});
!
var Total = React.createClass({
render: function () {
return <th>{this.props.value}</th>;
}
});
var Cell = React.createClass({
onChange: function (e) {
this.props.onChange(
this.props.row,
this.props.column,
parseInt(e.target.value) || 0
);
},
render: function () {
return (<td>
<input type="number" value={this.props.value}

onChange={this.onChange} />
</td>);
},
});
var Table = React.createClass({
onCellChange: function(row, column, value) {
this.state.data[row][column] = value;
this.setState({data: this.state.data});
},
!
render: function() {
// for rows & columns, append <Row>s containing

// <Cell row={r} column={c} 

// value={this.state.data[r][c]}

// onChange={this.onCellChange} />
//
// also append to each row and in a final row:

// <Total value={total} />

},
...
Component-based UI

Virtual DOM
Uni-directional data flow
“Give it 5 minutes”
http://reactjs.org
JAMES PEARCE

@jamespearce
https://www.flickr.com/photos/matthewpaulson/6773801511
https://www.flickr.com/photos/johnath/5358512977

An Introduction to ReactJS