103
React.js A Brief Introduction Daniel Gasienica April 10, 2014

React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.jsA Brief Introduction

Daniel Gasienica April 10, 2014

Page 2: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React is a JavaScript library for creating user interfaces by Facebook and Instagram.

Page 3: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

“Building large applications with data that changes over time.”

Page 4: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Hello, WorldA simple component

Page 5: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 6: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 7: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 8: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 9: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 10: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 11: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

{id: 'message', className: 'hidden'}

Page 12: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 13: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

Page 14: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

Page 15: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

Page 16: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode /* e.g. `document.body` */);

Page 17: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

Page 18: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

Page 19: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

Page 20: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode);

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

Page 21: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( <HelloMessage name="FiftyThree" />, mountNode);

/** @jsx React.DOM */var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 22: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( <HelloMessage name="FiftyThree" />, mountNode);

/** @jsx React.DOM */var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 23: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( <HelloMessage name="FiftyThree" />, mountNode);

/** @jsx React.DOM */var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 24: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( <HelloMessage name="FiftyThree" />, mountNode);

/** @jsx React.DOM */var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 25: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( <HelloMessage name="FiftyThree" />, mountNode);

/** @jsx React.DOM */var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 26: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( <HelloMessage name="FiftyThree" />, mountNode);

/** @jsx React.DOM */var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; }});

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name); }});

Page 27: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent( HelloMessage({name: "FiftyThree"}), mountNode)

HelloMessage = React.createClass displayName: 'HelloMessage' render: -> React.DOM.div null, "Hello", @props.name

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

Page 28: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Dummy ImageA stateful component

Page 29: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);
Page 30: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);
Page 31: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

DummyImage = React.createClass displayName: 'DummyImage'! getInitialState: -> keyword: ‘Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}! render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]!React.renderComponent DummyImage(), document.body

Page 32: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

DummyImage = React.createClass displayName: 'DummyImage'! getInitialState: -> keyword: ‘Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}! render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]!React.renderComponent DummyImage(), document.body

Page 33: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

DummyImage = React.createClass

displayName: 'DummyImage'

Page 34: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

DummyImage = React.createClass displayName: 'DummyImage'! getInitialState: -> keyword: ‘Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}! render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]!React.renderComponent DummyImage(), document.body

Page 35: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 36: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 37: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 38: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Dummy Image

Page 39: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 40: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 41: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

f00

Page 42: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 43: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 44: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 45: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 46: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 47: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 48: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 49: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 50: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 51: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]

Page 52: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

DummyImage = React.createClass displayName: 'DummyImage'! getInitialState: -> keyword: 'Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}! render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]!React.renderComponent DummyImage(), document.body

Page 53: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

getInitialState: -> keyword: 'Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}

Page 54: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

getInitialState: -> keyword: 'Dummy Image' color: 'f00' # red! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}

Page 55: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

getInitialState: -> keyword: 'Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}

Page 56: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

getInitialState: -> keyword: 'Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}

Page 57: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

getInitialState: -> keyword: 'Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}

Page 58: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

DummyImage = React.createClass displayName: 'DummyImage'! getInitialState: -> keyword: 'Dummy Image' color: 'f00'! handleKeywordChange: (event) -> @setState {keyword: event.target.value}! handleColorChange: (event) -> {value} = event.target return unless value.match /// ^[A-Fa-f0-9]{0, 6}$ /// @setState {color: value}! handleImageClick: (event) -> @setState {color: Math.random().toString(16)[2...8]}! render: -> React.DOM.div null, [ React.DOM.input value: @state.keyword onChange: @handleKeywordChange! React.DOM.input value: @state.color onChange: @handleColorChange! React.DOM.br null! React.DOM.img onClick: @handleImageClick src: "http://dummyimage.com/600x400/#{@state.color}/ffffff&\ text=#{encodeURIComponent @state.keyword}" ]!React.renderComponent DummyImage(), document.body

Page 59: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent DummyImage(), document.body

Page 60: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent DummyImage(), document.body

Page 61: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent DummyImage(), document.body

Page 62: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.renderComponent DummyImage(), document.body

Page 63: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Behind the Scenes

Page 64: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

In-Memory DOM

Page 65: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

In-Memory DOM

Old State New State

Diff

Page 66: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Benefits

Page 67: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

simple

Page 68: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

fast

Page 69: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

synthetic events

Page 70: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Goodies

Page 71: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

PropTypes

Page 72: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.createClass displayName: 'Avatar'! propTypes: # Required user: React.PropTypes.object.isRequired! # Optional includeLink: React.PropTypes.bool size: React.PropTypes.oneOf ['micro', 'small', 'medium', 'large']

Avatar includeLink: 'http://gasi.ch/' size: 'medium'

Page 73: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.createClass displayName: 'Avatar'! propTypes: # Required user: React.PropTypes.object.isRequired! # Optional includeLink: React.PropTypes.bool size: React.PropTypes.oneOf ['micro', 'small', 'medium', 'large']

Avatar includeLink: 'http://gasi.ch/' size: 'medium'

Page 74: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.createClass displayName: 'Avatar'! propTypes: # Required user: React.PropTypes.object.isRequired! # Optional includeLink: React.PropTypes.bool size: React.PropTypes.oneOf ['micro', 'small', 'medium', 'large']

Avatar includeLink: 'http://gasi.ch/' size: 'medium'

Page 75: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.createClass displayName: 'Avatar'! propTypes: # Required user: React.PropTypes.object.isRequired! # Optional includeLink: React.PropTypes.bool size: React.PropTypes.oneOf ['micro', 'small', 'medium', 'large']

Avatar includeLink: 'http://gasi.ch/' size: 'medium'

Page 76: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.createClass displayName: 'Avatar'! propTypes: # Required user: React.PropTypes.object.isRequired! # Optional includeLink: React.PropTypes.bool size: React.PropTypes.oneOf ['micro', 'small', 'medium', 'large']

Avatar includeLink: 'http://gasi.ch/' size: 'medium'

Page 77: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.createClass displayName: 'Avatar'! propTypes: # Required user: React.PropTypes.object.isRequired! # Optional includeLink: React.PropTypes.bool size: React.PropTypes.oneOf ['micro', 'small', 'medium', 'large']

Avatar includeLink: 'http://gasi.ch/' size: 'medium'

Page 78: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Server-Side Rendering

Page 79: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 80: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 81: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 82: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 83: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 84: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 85: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

app.get '/', (req, res) -> props = currentUser: firstName: 'Daniel' lastName: 'Gasienica' content = React.renderComponentToString App props res.render 'app.toffee', {content, props}

<!doctype html><html><body> #{raw content} <script src="http://fb.me/react-0.10.0.js"></script> <script src="/scripts/app.js"></script> <script> React.renderComponent(App(#{props}), document.body); </script></body></html>

Page 86: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

Page 87: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

Page 88: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

<div data-reactid=".dbuc1iytj4" data-react-checksum="-695455966"> <span data-reactid=".dbuc1iytj4.0">Hello </span> <span data-reactid=".dbuc1iytj4.1">FiftyThree</span></div>

Page 89: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

CSSTransitionGroup

Page 90: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.addons.CSSTransitionGroup transitionName: 'notification' , if @state.notification Notification {message: @state.notification} else []

.notification &-enter opacity: 0.01 transition: opacity 0.2s ease-in! &-active opacity: 1

.notification &-leave opacity: 1 transition: opacity 0.1s ease-in! &-active opacity: 0.01

Component

Enter Styles* Leave Styles*

* Stylus

Page 91: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.addons.CSSTransitionGroup transitionName: 'notification' , if @state.notification Notification {message: @state.notification} else []

.notification &-enter opacity: 0.01 transition: opacity 0.2s ease-in! &-active opacity: 1

.notification &-leave opacity: 1 transition: opacity 0.1s ease-in! &-active opacity: 0.01

Component

Enter Styles* Leave Styles*

* Stylus

Page 92: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.addons.CSSTransitionGroup transitionName: 'notification' , if @state.notification Notification {message: @state.notification} else []

.notification &-enter opacity: 0.01 transition: opacity 0.2s ease-in! &-active opacity: 1!.notification-enter-active

.notification &-leave opacity: 1 transition: opacity 0.1s ease-in! &-active opacity: 0.01

Component

Enter Styles* Leave Styles*

* Stylus

Page 93: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.addons.CSSTransitionGroup transitionName: 'notification' , if @state.notification Notification {message: @state.notification} else []

.notification &-enter opacity: 0.01 transition: opacity 0.2s ease-in! &-active opacity: 1

.notification &-leave opacity: 1 transition: opacity 0.1s ease-in! &-active opacity: 0.01

Component

Enter Styles* Leave Styles*

* Stylus

Page 94: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.addons.CSSTransitionGroup transitionName: 'notification' , if @state.notification Notification {message: @state.notification} else []

.notification &-enter opacity: 0.01 transition: opacity 0.2s ease-in! &-active opacity: 1

.notification &-leave opacity: 1 transition: opacity 0.1s ease-in! &-active opacity: 0.01

Component

Enter Styles* Leave Styles*

* Stylus

Page 95: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

render: -> React.addons.CSSTransitionGroup transitionName: 'notification' , if @state.notification Notification {message: @state.notification} else []

.notification &-enter opacity: 0.01 transition: opacity 0.2s ease-in! &-active opacity: 1

.notification &-leave opacity: 1 transition: opacity 0.1s ease-in! &-active opacity: 0.01

Enter Styles* Leave Styles*

Component

* Stylus

Page 96: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Why am I excited about

React?

Page 97: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

simple

Page 98: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

declarative

Page 99: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

composable

Page 100: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

encourages good practices

Page 101: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

React.jsNeo4j

CoffeeScript

Node.js

Streamline.js

Page 102: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Give It Five Minutesor: write one component

Page 103: React - Gasi · var HelloMessage = React.createClass({ displayName: 'HelloMessage', render: function() { return React.DOM.div(null, "Hello ", this.props.name);

Questions?