Slide 1

Slide 1 text

React on ES6+

Slide 2

Slide 2 text

React on ES6+ @nikgraf Nik Graf @nikgraf
 [email protected] Creator of Belle Working with StarterSquad

Slide 3

Slide 3 text

React on ES6+ @nikgraf ECMAScript 5 December 2009 - ECMAScript 5 was published

Slide 4

Slide 4 text

React on ES6+ @nikgraf Why bother about ES6+? Classes
 Enhanced Object Literals
 Block-scoped binding constructs (let + const)
 Property Initialisers
 Arrow Functions
 Template Strings
 Spread Attributes
 Deconstructing Attributes
 Generators
 DataStructures (Map, Set, WeakMap, WeakSet)
 … and many more

Slide 5

Slide 5 text

React on ES6+ @nikgraf ES6 is finalised 
 Final Draft April 14, 2015 Rev 38
 http://wiki.ecmascript.org/doku.php?id=harmony:specification_drafts#final_draft
 


Slide 6

Slide 6 text

React on ES6+ @nikgraf People use ES6+

Slide 7

Slide 7 text

React on ES6+ @nikgraf ECMAScript 6 April 2015 - ECMAScript 2015 (ES6) finalised

Slide 8

Slide 8 text

React on ES6+ @nikgraf Compilers Traceur JSTransform (deprecated) Babel

Slide 9

Slide 9 text

React on ES6+ @nikgraf 
 Created by Sebastian McKenzie (started fall 2014) 
 - JSX Support, ES6 Support, ES7 Support
 - Widely adopted

Slide 10

Slide 10 text

React on ES6+ @nikgraf Facebook ❤ Babel

Slide 11

Slide 11 text

React on ES6+ @nikgraf Block-scoped binding constructs const hello = 'Hello'; hello = 'Hola'; // this is not valid

Slide 12

Slide 12 text

React on ES6+ @nikgraf Block-scoped binding constructs function varTest() { var x = 31; if (true) { var x = 71; // same variable! console.log(x); // 71 } console.log(x); // 71 }

Slide 13

Slide 13 text

React on ES6+ @nikgraf Block-scoped binding constructs function letTest() { let x = 31; if (true) { let x = 71; // different variable console.log(x); // 71 } console.log(x); // 31 }

Slide 14

Slide 14 text

React on ES6+ @nikgraf Classes // The ES5 way var Photo = React.createClass({ handleDoubleTap: function(e) { … }, render: function() { … }, }); // The ES6+ way class Photo extends React.Component { handleDoubleTap(e) { … } render() { … } }

Slide 15

Slide 15 text

React on ES6+ @nikgraf Classes // The ES5 way var EmbedModal = React.createClass({ componentWillMount: function() { … }, }); // The ES6+ way class EmbedModal extends React.Component { constructor(props) { super(props); } }

Slide 16

Slide 16 text

React on ES6+ @nikgraf Property Initialisers // The ES5 way var Video = React.createClass({ getDefaultProps: function() { return { autoPlay: false, maxLoops: 10, }; }, getInitialState: function() { return { loopsRemaining: this.props.maxLoops, }; }, propTypes: { autoPlay: React.PropTypes.bool.isRequired, maxLoops: React.PropTypes.number.isRequired }, });

Slide 17

Slide 17 text

React on ES6+ @nikgraf Property Initialisers // The ES6+ way class Video extends React.Component { static defaultProps = { autoPlay: false, maxLoops: 10, } static propTypes = { autoPlay: React.PropTypes.bool.isRequired, maxLoops: React.PropTypes.number.isRequired } state = { loopsRemaining: this.props.maxLoops, } }

Slide 18

Slide 18 text

React on ES6+ @nikgraf Arrow Functions // ES5 [2,2,3].map(function(item) { return item + 1; }); // Expression bodies [2,2,3].map(item => item + 1); // [3,3,4] [2,2,3].map((item, index) => item + index); // [2,3,5] // Statement bodies [2,2,3].forEach(item => { if (item === 2) { console.log('Found the number 2'); } });

Slide 19

Slide 19 text

React on ES6+ @nikgraf Arrow Functions // Lexical this const bob = { _name: "Bob", _friends: [], printFriends() { this._friends.forEach(friend => console.log(this._name + " knows " + friend)); } }

Slide 20

Slide 20 text

React on ES6+ @nikgraf Template Strings // Multiline strings const text = `In ES5 this is not legal. Good to know.`; // Interpolate variable bindings const city = 'Vienna'; const time = 'today'; // ES5 console.log('Hello ' + city + ', how are you ' + time + '?'); // ES6+ console.log(`Hello ${city}, how are you ${time}?`); // results in "Hello Vienna, how are you today?"

Slide 21

Slide 21 text

React on ES6+ @nikgraf Spread Attributes const photoSet = { coverIndex: 1, photos: [ { url: '…' }, { url: '…' } ] } // explicit assignment // spread attributes

Slide 22

Slide 22 text

React on ES6+ @nikgraf Deconstructing var x = [1,2,3]; // ES5 var a = x[0]; var b = x[2]; // ES6+ list matching const [a, , b] = x;

Slide 23

Slide 23 text

React on ES6+ @nikgraf Deconstructing this.props = { className: 'photo box', isSquare: true, width: 200 } const { className, ...others } = this.props; // others contains all properties of this.props // except for className // className == 'photo box' // others == { isSquare: true, width: 200 }

Slide 24

Slide 24 text

React on ES6+ @nikgraf Deconstruct & Spread class PhotoPage extends React.Component { onLoadMore() { … } render() { const { className, ...otherProps } = this.props; return (
Load more
); } }

Slide 25

Slide 25 text

React on ES6+ @nikgraf ProTip: Eslint created by Nicholas Zakas - Enable/Disabled Rules on demand - Follows the standard + JSX Support - AirBnB’s fantastic JavaScript Guide + .eslintrc
 https://github.com/airbnb/javascript/

Slide 26

Slide 26 text

React on ES6+ @nikgraf Eslint as Atom Plugin

Slide 27

Slide 27 text

React on ES6+ @nikgraf End Special thanks to Steven Luscher for the original post on “React on ES6+”
 https://babeljs.io/blog/2015/06/07/react-on-es6-plus Checkout Belle
 https://nikgraf.github.io/belle/