Boris Dinkevich boris@500tech.com
REACTJS
And how it works
How it all started…
Boris Dinkevich
- 4 years Dev Ops
- 4 years Embedded C
- 4 years Ruby on Rails
- 4 years JavaScript (Angular/React)
Developing stuff
Boris Dinkevich
- AngularJS Israel (4K ppl)
- ReactJS Israel (2K ppl)
- Angular UP
- React Next
- React Courses
These days
- Frontend Projects
- Consulting
- Courses / Training
- Fun!
A WORD ON TREES
NEW CHAPTER
[DELETE THIS]: Chapter name should be ALL CAPS
Please think twice before adding a chapter slide,
most chances you won’t need it.
Our code today
const Todos = () => (

<ul>

<li>Todo</li>

</ul>

);

De-JSX
const Todos = () => (

<ul>

<li>Stuff</li>

</ul>

);

const Todos = () => (

React.createElement("ul", null,

React.createElement("li", null,

"Stuff"

),

);

);
Calling Todo()
“Stuff”
“li”
“ul”
props.children
props.children
Chrome dev tools?
Chrome dev tools?
Chrome dev tools?
AMOUNT OF MAGIC SO FAR?
0%
WHY REACT?
DOM is slow
Lets minimise writes…
Our Sample App
Todos
Header
TodoTodo
App
Tree & DOM
Todos
Header
“div”
“Welcome”
“h1”
“div”
Todo
“Two”
“li”
“ul”
Todo
“One”
“li”
Old New
App
Todos
Header
“div”
“Welcome”
“h1”
“div”
Todo
“Two”
“li”
“ul”
Todo
“Million”
“li”
App
Tree & DOM
Todos
Header
“div”
“Welcome”
“h1”
“div”
Todo
“Two”
“li”
“ul”
Todo
“One”
“li”
“div”
“Welcome”
“h1”
“div”
“Two”
“li”
“ul”
“One”
“li”
Our tree Our DOM
App
Tree & DOM
Todos
Header
“div”
“Welcome”
“h1”
“div”
Todo
“Two”
“li”
“ul”
Todo
“Million”
“li”
“div”
“Welcome”
“h1”
“div”
“Two”
“li”
“ul”
“One”
“li”
Our tree Our DOM
App
Tree & DOM
Todos
Header
“div”
“Welcome”
“h1”
“div”
Todo
“Two”
“li”
“ul”
Todo
“Million”
“li”
“div”
“Welcome”
“h1”
“div”
“Two”
“li”
“ul”
“Million”
“li”
Our tree Our DOM
App
The code?
const updateNode = (treeNode, dom) => {
if (treeNode.type !== dom.type) {
// Delete the dom element
// Create a new dom element
} else {
const styles = dom.getStyle();
const attrs = dom.getAttrs();
const listeners = dom.getListeners();
readAndUpdateStyles(treeNode, dom);
readAndUpdateAttrs(treeNode, dom);
readAndUpdateEventListeners(treeNode, dom);
}
};
Introducing
BORIS JS
1. Call render() to build tree new tree
2. Compare each element to the real DOM
3. Update class/attrs/events when needed
4. Win!
Base code
React docs: “reads are slow”
Lets open PR
Simple diff
const testAndUpdateInnerText = (node, value) => {

if (node.innerText !== value) {

node.innerText = value;

}


}

60fps
Time per frame: 16.6ms
Time for 1000 read / write cycles: 36.15ms
Read
Write
Read & Write
Hmmm….
const updateNode = (elem, value) => {
const prev = elem.innerText;
if (prev !== value) {
dom.innerText = value;
};
};
// Mark DOM Dirty
// Is DOM Dirty? Update and get value
Hmmm….
// Is DOM Dirty? Update and get value1.If DOM not ready - rebuild
2.Get updated value
3.Update value
4.Make DOM dirty
1000x
Hmmm….
// Is DOM Dirty? Update and get value1.If DOM not ready - rebuild
2.Get updated values into array - 1000x
3.Update values from array - 1000x
4.Make DOM dirty
1x
Introducing
BORISJS 2.0
Updated
1.Call render() to build tree
2.Read DOM into “temp tree”
3.Compare each element to temp tree
4.Change when needed
5.Win!
“temp tree”… sounds familiar
But wait
1.Call render() to build tree
2.Read DOM into “temp tree”
3.Compare each element in DOM to temp tree
4.Change DOM when needed
5.Win!
Isn’t “temp tree” equal to DOM?
Pre cache
1. Call render() to build “next tree”
2. Compare each element to “prev tree”
3. Change DOM when needed
4.Save “next tree” as “prev tree”
5. Win!
What is “prev tree” the first time?
Introducing
BORISJS 3.0
Super duper algo
Initial Render
1.Call render() to build tree
2.Save as “prev tree”
3.Create initial DOM
Updates
1.Call render() to build “next tree”
2.Compare each element to “prev tree”
4.Change DOM when needed
5.Save “next tree” as “prev tree”
6.Win!
NO READS?
Todos.setState({ todos: [’XXXXX’, ‘Two’] });

Todos
• One
• Two
Todos
• XXXXX
• Two
todos = document.getElementById('app').children[0].children[1];

todos.removeChild(todos.childNodes[0]);
Todos.setState({ todos: [‘XXXXX’, ‘Dos’] });
Todos
• Dos
Todos
• One
• Two
Todos
• Two
<input />
In React
• Initial Render
• Updates
FIRST RUN
React.createElement(App);

Starting
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
“One”
“li”
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
“One”
“li”
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
“Two”
“li”
“One”
“li”
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
“Two”
“li”
“ul”
“One”
“li”
Mounting DOM
function
Todos()
function
Header()
“div”
“Welcome”
“h1”
“div”
function
Todo()
“Two”
“li”
“ul
function
Todo()
“One”
“li”
function
App()
“Welcome”
“h1”
“div”
“Two”
“li”
“ul”
“One”
“li”
Mounting DOM
“div”
“div”
“Welcome”
“h1”
“div”
“Two”
“li”
“ul”
“One”
“li”
#app
DOM
<body>

<div id="app"></div>

</body>

render(

React.createElement(App),

document.getElementById('app')

);
DOM IS READY!
Or is it?
DOM and React
Event Handers
<Component onClick={} />

Connection
React
onClick
DOM
React DOM
Our Code
Different renderers
DOM - onClick
Native - onPress
What does this mean?
<Header onClick={} />

<Header onPress={} />

What is “React”?
addons 1,334
isomorphic 3,428
shared 7,058
renderers/
art 641
dom 12,337
native 2,735
noop 192
shared 9,368
* lines of code in 15-stable
TREE UPDATE
What will cause React to render again?
• setState()
• forceUpdate()
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“One”
“li”
DOMReact Tree prev Virtual DOM
Todos.setState({
todos: ['Uno', 'Dos']
});

function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“One”
“li”
DOMReact Tree prev Virtual DOM
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“One”
“li”
DOMReact Tree prev Virtual DOM
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“One”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“One”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“One”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“One”
“li”
“div”
“Two”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“Uno”
“li”
“div”
“Two”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“Uno”
“li”
“div”
“Two”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“Uno”
“li”
“div”
“Two”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“Uno”
“li”
“div”
“Two”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Two”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
Flow
1. setState({ todos: [‘Uno’, ‘Dos’] });
2. Todos updated and rendering starts
3. Todo1 needs update
4. DOM updated
5. Todo2 needs update
6. DOM updated
AGAIN?
Todos.setState({
todos: ['Uno', 'Dos']
});

function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
shouldComponentUpdate
Why?
class Todo extends React.Component {

shouldComponentUpdate(nextProps) {

return
nextProps.title !== this.props.title;

}



render() {

return (

<li>{ this.props.title }</li>

)

}

}
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
“div”
“Dos”
“li”
“ul”
“Uno”
“li”
DOMReact Tree prev Virtual DOM
‘UNO’ ‘DOS’
LIFE CYCLE
function
Todos()
“div”
function
Todo()
{ title }
“li”
“ul”
function
Todo()
{ title }
“li”
function
App()
React Tree
componentWillMount
componentDidMount
componentWillUpdate
componentDidUpdate
componentWillUnmount
…
FINAL WORDS
REACT IS COMPLICATED
SO YOUR CODE DOES’T HAVE TO BE
http://redux-book.com
The Complete Redux Book
And read our blog:
http://blog.500tech.com
Don’t <React />, Plan!

From render() to DOM