React Js
React Js
React Js
js
React.js for the win! - STLJS
CodeWinds
Jeff Barczewski Training
codewinds.com
Who am I?
Veteran - 26 yrs as professional developer
Last 3+ years fulltime in JavaScript and Node.js
Created CodeWinds to publish high quality
video training courses
@jeffbski [email protected]
Good Code by XKCD Licensed CC BY-NC 2.5
Question for you
What are your greatest difficulties or challenges
that you face when building web apps?
codewinds.com CodeWinds
Agenda
Learn why React.js is special
Core concepts
Family: react-router, Flux, React Native
codewinds.com CodeWinds
What makes React.js special?
Simple to learn
Composable Components
Declarative
Easy to use with existing projects
codewinds.com CodeWinds
Kevin Old - Coupa
"I have been surprised at how easy it was to
incorporate in a very established codebase..."
Demo
codewinds.com CodeWinds
React.js core concepts
Just the view
Virtual DOM
Components
Top down data flow
codewinds.com CodeWinds
Just the view
class Greeting extends React.Component {
render() { // the heart of React.js
// pass in any type of js objects, methods, or fns
return <div>{ this.props.user.name }</div>;
}
}
Virtual DOM
Render virtual tree Virtual DOM Actual DOM
Fast diff
Adapters to DOM, ...
=>
codewinds.com CodeWinds
Components
class Name ... // can be in another file
class Greeting extends React.Component {
render() { // focus on my props
return (
<div>
Hello
<Name value={this.props.name} />
</div>
);
}
}
Top down data flow
// from main.js
<App name={appName} items={items} />
// transforms into
return React.createElement('div', {}, [
React.createElement('h1', {}, this.props.title),
React.createElement(MyDate, { val: this.props.date }, [])
]);
React.js API - JSX p2
const errorStyle = {
color: 'red',
marginRight: '10px'
};
const html = marked('The quick brown fox...');
return (
<div className="foo bar" data-baz="a"> { /* comment */ }
<span style={errorStyle}>{this.props.msg}</span>
<input autoFocus="true" onClick={this.myfn.bind(this)} />
<div dangerouslySetInnerHTML={{ __html: html }} />
</div> );
React.js API - render, props
var mainDiv = document.querySelector('#mainDiv');
React.render(<App title={myTitle} items={myItems} />,
mainDiv); // apply here
sendData(e) {
e.preventDefault();
var submitButton = React.findDOMNode(this.refs.submitButton);
submitButton.disabled = true; // re-enable after post completes
// send data, then submitButton.disabled = false;
}
React.js API - prop validation
MyComponent.propTypes = {
foo: React.PropTypes.object, // any object
bar: React.PropTypes.shape({ f: React.PropTypes.string }),
baz: React.PropTypes.array, // also arrayOf(propType...)
cat: React.PropTypes.func.isRequired, // fn + required
dog: React.PropTypes.node, // number, string, array, element
egg: React.PropTypes.any.isRequired, // anything + required
fig: React.PropTypes.instanceOf(Message),
gib: React.PropTypes.oneOf(['optionA', 'optionB']), // enum
hib: function (props, propName, compName) { // custom
if (...) { return new Error('my validation error'); } }};
React.js API - default props
// cached and used as the defaults
MyComponent.defaultProps = {
foo: 'default value',
bar: 1
};
React.js API - Lifecycle
React Component Lifecycle
Mount
componentWillMount()
componentDidMount()
Updates
componentWillReceiveProps(nextProps)
shouldComponentUpdate(nextProps, nextState)
componentWillUpdate(nextProps, nextState)
componentDidUpdate(prevProps, prevState)
Unmount
componentWillUnmount()
React.js API - perf tuning
return (
<ul>
{ items.map(i => <li key={i.id}>{i.name}</li>) }
</ul>
);
codewinds.com CodeWinds
react-router
const routes = (<Route handler={App} path="/">
<DefaultRoute handler={Home} />
<Route name="about" handler={About} />
</Route>);
Router.run(routes, Router.HistoryLocation, (Handler, props) =>
// can fetch data for props.routes here
React.render(<Handler />, document.querySelector('#appDiv'));
});