SlideShare a Scribd company logo
React z pohledu UI vývojáře
Martin Pešout
www.martinpesout.cz
@martinpesout
8x nárůst za poslední mezi roky 2014-2015
React z pohledu UI vývojáře
React z pohledu UI vývojáře
Jak strukturovat 

Javascriptové aplikace?
AngularJS
Dart
Ember.js
Backbone.js
Meteor.js
AngularJS
DartPureMVC
Ember.js
Backbone.js
Closure
Meteor.js Agility.js
Aria Templates
Bolt
CanJS
KnockoutJS
Skel
YUI
Controller
Model
View
Frameworky pracují složitě s modelem
API pro čtení dat
API pro zápis dat
Ukládání dat
Data
Data
Data
Data
Data
Controller
Model
View
Při tvorbě UI je pro mě podstatná vrstva View
Geniální UI
Vychytané animace
Responsivní aplikace
Dotyková gesta
Použitelný design
Spokojený uživatel
– definice na webu Reactu
„Facebook React je knihovna pro tvorbu
uživatelských rozhraní.“
Výchozí data
Změny v reálném
čase
Vstupy uživatele
View
Aplikace
Data putují pouze jedním směrem.
React tím snižuje složitost kódu.
Výchozí data
Změny v reálném
čase
Vstupy uživatele
View
Aplikace
Staráme se o popis toho, jak má výsledek vypadat
Nová data na vstupu
přerenderovaný výsledek
React z pohledu UI vývojáře
DOM (Document Object Model)
Manipulace je náročná a drahá
Svádí k ukládání stavů aplikace
Jak udržet stav elementů při přerenderování?
Virtuální DOM
komponenta(data 1)
= výsledek 1
komponenta(data 2)
= výsledek 2
diff(výsledek 1 - výsledek 2)
= změny
Odlehčená verze běžného DOM
React z pohledu UI vývojáře
React z pohledu UI vývojáře
Univerzálnější využití
React
React DOM již není součástí samotného Reactu
od verze 0.14
React CanvasReact DOM
React Three
React Native
– definice na webu Reactu
„React je celý o tvorbě použitelných
komponent. Ve skutečnosti jediná věc, kterou s
Reactem děláte, je tvorba komponent.“
Funkcionální přístup
Nemáme předem dané jak získáváme data
Vnitřní stavy
Parametr A Parametr B
Předpis
var Component = React.createClass({
});
Povinná render metoda
var Component = React.createClass({
render: function() {
return předpis_výsledku;
}
});
Povinná render metoda
var Component = React.createClass({
render: function() {
return předpis_výsledku;
}
});
Povinná render metoda
Javascript
Jazyk JSX
Krok navíc, který přidává XML syntax do Javascriptu.
render: function render() {
return React.createElement(
"div",
null,
"Hello ",
this.props.name
);
}
render: function() {
return <div>Hello {this.props.name}</div>;
}
JSX
var LoginPage = React.createClass({
render: function() {
return (
<div className="grid">
<div className="sidebar">
<MainNavigation />
</div>
<div className=“content">
<LoginForm />
</div>
</form>
);
},
});
var MainNavigation = React.createClass({
render: function() {
return (
<ul className="main-navigation">
<li><a href="#">Homepage</a></li>
<li><a href="#">Contact info</a></li>
</ul>
);
},
});
var HelloMessage = React.createClass({
render: function() {
}
});
ReactDOM.render(<HelloMessage name="John" />, document.body);
name="John"
<div>Hello John</div>
<HelloMessage /> Žádný stav
var HelloMessage = React.createClass({
render: function() {
return <div>Hello {this.props.name}</div>;
}
});
ReactDOM.render(<HelloMessage name="John" />, document.body);
name="John"
<div>Hello John</div>
<HelloMessage /> Žádný stav
var Menu = React.createClass({
getInitialState: function() {
return {
open: false,
};
},
_toggleMenu: function() {
this.setState({
open: this.state.open ? false : true,
});
},
render: function() {
var componentClasses = classNames({
'main-nav': true,
'main-nav--open': this.state.open,
});
return (
<div className={componentClass} onClick={this._toggleMenu}>
TODO položky navigace...
</div>
);
},
});
<div class="menu">…</div>
<Menu /> Stav: open
Životní cyklus komponenty
Více na: https://facebook.github.io/react/docs/component-specs.html
componentWillReceiveProps: function(nextProps) {
},
componentWillUpdate: function(nextProps, nextState) {
if (this.props.name != nextProps.name) {
console.log('Parameter name has been changed');
}
},
componentDidUpdate: function(prevProps, prevState) {
},
Např. můžeme reagovat na vstupy nových dat:
var LoginForm = React.createClass({
componentDidMount: function() {
this.refs.loginInput.getDOMNode().focus();
},
render: function() {
return (
<form className="auth-form">
<div className="auth-form__row">
<label htmlFor="email">Email address</label>
<input type="email" id="email" ref="loginInput" />
</div>
</form>
);
},
});
React z pohledu UI vývojáře
Skutečné triky,
které ocení nejen UI vývojáři
A
B
C
A B C
Navigace
B C
Navigace
C
Navigace
C
Navigace
<ul class="tabs">
<li><a href="#">Section A</a></li>
<li><a href="#">Section B</a></li>
<li><a href="#">Section C</a></li>
</ul>
A
B
C @media only screen and (min-width: 64em) {
.tabs {
display: none;
}
}
<ul class="tabs">
<li><a href="#">Section A</a></li>
<li><a href="#">Section B</a></li>
<li><a href="#">Section C</a></li>
</ul>
function getViewport() {
return $(window).width() < 640 ? 'mobile' : 'large';
}
var MainLayout = React.createClass({
getInitialState: function() {
return {
viewport: getViewport(),
};
},
pokračování komponenty . . .
_resize: function() {
this.setState({
viewport: getViewport(),
});
},
componentDidMount: function() {
$(window).on('resize.content', this._resize);
},
componentWillUnmount: function() {
$(window).unbind('.content');
},
pokračování . . .
render: function() {
var content;
if (this.state.viewport == 'mobile') {
content = (
<ul class="tabs">
<li><a href="#">Section A</a></li>
<li><a href="#">Section B</a></li>
<li><a href="#">Section C</a></li>
</ul>
<div>
Zobrazení na mobilu
</div>
);
} else {
content = (
<div className="grid">Zobrazení na desktopu</div>
)
}
return content;
}
});
Mobilní navigace
A B
C
Nadpis stránky
A
B
C
Nadpis stránky
A B C
Navigace
Nadpis stránky
Živá ukázka
Děkuji za pozornost
Martin Pešout
www.martinpesout.cz
@martinpesout

More Related Content

PDF
React, když odezní zamilovanost
PDF
Vývoj frontendu na redakčním systému? ... aneb jak udržet pořádek v š...
PDF
Purifying React (with annotations)
PDF
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
PDF
React premature performance optimization
PDF
Použití Next.js a Reactí UI khinihovny v aplikaci
PDF
PDF
Styling React Native Applications
React, když odezní zamilovanost
Vývoj frontendu na redakčním systému? ... aneb jak udržet pořádek v š...
Purifying React (with annotations)
WordPress šablony a rychlost načítání (WordCamp Praha 2017)
React premature performance optimization
Použití Next.js a Reactí UI khinihovny v aplikaci
Styling React Native Applications

Similar to React z pohledu UI vývojáře (16)

PPTX
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
PDF
node.js: zápisky z fronty (Battle guide to node.js)
PPTX
TNPW2-2016-03
PDF
Elm česky
PPTX
WordPress REST API + React + TypeScript
PDF
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
PPTX
TNPW2-2014-03
PDF
Cesta k frontendové revoluci na běžícím projektu v podání Vue.js na akci Veli...
PDF
PDF
Internship u Google - jaké to bylo a jak se tam dostat + soutěž o ceny
PDF
Elm - Funkcionální nebe pro webové vývojáře
PDF
TwigX: pište PHP šablony jako v Reactu
PPTX
TNPW2-2012-03
PPTX
TNPW2-2013-03
PPTX
TNPW2-2011-03
PDF
Web support: nechte uživatele ať si pomohou sami
Čtvrtkon #71 - Marian Benčat - Angular a NativeScript
node.js: zápisky z fronty (Battle guide to node.js)
TNPW2-2016-03
Elm česky
WordPress REST API + React + TypeScript
DEV Čtvrtkon #76 - How to build an evil-free social network: Behind the wheels
TNPW2-2014-03
Cesta k frontendové revoluci na běžícím projektu v podání Vue.js na akci Veli...
Internship u Google - jaké to bylo a jak se tam dostat + soutěž o ceny
Elm - Funkcionální nebe pro webové vývojáře
TwigX: pište PHP šablony jako v Reactu
TNPW2-2012-03
TNPW2-2013-03
TNPW2-2011-03
Web support: nechte uživatele ať si pomohou sami
Ad

React z pohledu UI vývojáře

  • 1. React z pohledu UI vývojáře Martin Pešout www.martinpesout.cz @martinpesout
  • 2. 8x nárůst za poslední mezi roky 2014-2015
  • 8. Controller Model View Frameworky pracují složitě s modelem API pro čtení dat API pro zápis dat Ukládání dat Data Data Data Data Data
  • 9. Controller Model View Při tvorbě UI je pro mě podstatná vrstva View Geniální UI Vychytané animace Responsivní aplikace Dotyková gesta Použitelný design Spokojený uživatel
  • 10. – definice na webu Reactu „Facebook React je knihovna pro tvorbu uživatelských rozhraní.“
  • 11. Výchozí data Změny v reálném čase Vstupy uživatele View Aplikace Data putují pouze jedním směrem. React tím snižuje složitost kódu.
  • 12. Výchozí data Změny v reálném čase Vstupy uživatele View Aplikace Staráme se o popis toho, jak má výsledek vypadat Nová data na vstupu přerenderovaný výsledek
  • 14. DOM (Document Object Model) Manipulace je náročná a drahá Svádí k ukládání stavů aplikace Jak udržet stav elementů při přerenderování?
  • 15. Virtuální DOM komponenta(data 1) = výsledek 1 komponenta(data 2) = výsledek 2 diff(výsledek 1 - výsledek 2) = změny Odlehčená verze běžného DOM
  • 18. Univerzálnější využití React React DOM již není součástí samotného Reactu od verze 0.14 React CanvasReact DOM React Three React Native
  • 19. – definice na webu Reactu „React je celý o tvorbě použitelných komponent. Ve skutečnosti jediná věc, kterou s Reactem děláte, je tvorba komponent.“
  • 20. Funkcionální přístup Nemáme předem dané jak získáváme data Vnitřní stavy Parametr A Parametr B Předpis
  • 21. var Component = React.createClass({ }); Povinná render metoda
  • 22. var Component = React.createClass({ render: function() { return předpis_výsledku; } }); Povinná render metoda
  • 23. var Component = React.createClass({ render: function() { return předpis_výsledku; } }); Povinná render metoda Javascript
  • 24. Jazyk JSX Krok navíc, který přidává XML syntax do Javascriptu. render: function render() { return React.createElement( "div", null, "Hello ", this.props.name ); } render: function() { return <div>Hello {this.props.name}</div>; } JSX
  • 25. var LoginPage = React.createClass({ render: function() { return ( <div className="grid"> <div className="sidebar"> <MainNavigation /> </div> <div className=“content"> <LoginForm /> </div> </form> ); }, }); var MainNavigation = React.createClass({ render: function() { return ( <ul className="main-navigation"> <li><a href="#">Homepage</a></li> <li><a href="#">Contact info</a></li> </ul> ); }, });
  • 26. var HelloMessage = React.createClass({ render: function() { } }); ReactDOM.render(<HelloMessage name="John" />, document.body); name="John" <div>Hello John</div> <HelloMessage /> Žádný stav
  • 27. var HelloMessage = React.createClass({ render: function() { return <div>Hello {this.props.name}</div>; } }); ReactDOM.render(<HelloMessage name="John" />, document.body); name="John" <div>Hello John</div> <HelloMessage /> Žádný stav
  • 28. var Menu = React.createClass({ getInitialState: function() { return { open: false, }; }, _toggleMenu: function() { this.setState({ open: this.state.open ? false : true, }); }, render: function() { var componentClasses = classNames({ 'main-nav': true, 'main-nav--open': this.state.open, }); return ( <div className={componentClass} onClick={this._toggleMenu}> TODO položky navigace... </div> ); }, }); <div class="menu">…</div> <Menu /> Stav: open
  • 29. Životní cyklus komponenty Více na: https://facebook.github.io/react/docs/component-specs.html componentWillReceiveProps: function(nextProps) { }, componentWillUpdate: function(nextProps, nextState) { if (this.props.name != nextProps.name) { console.log('Parameter name has been changed'); } }, componentDidUpdate: function(prevProps, prevState) { }, Např. můžeme reagovat na vstupy nových dat:
  • 30. var LoginForm = React.createClass({ componentDidMount: function() { this.refs.loginInput.getDOMNode().focus(); }, render: function() { return ( <form className="auth-form"> <div className="auth-form__row"> <label htmlFor="email">Email address</label> <input type="email" id="email" ref="loginInput" /> </div> </form> ); }, });
  • 32. Skutečné triky, které ocení nejen UI vývojáři
  • 33. A B C
  • 37. C Navigace <ul class="tabs"> <li><a href="#">Section A</a></li> <li><a href="#">Section B</a></li> <li><a href="#">Section C</a></li> </ul>
  • 38. A B C @media only screen and (min-width: 64em) { .tabs { display: none; } } <ul class="tabs"> <li><a href="#">Section A</a></li> <li><a href="#">Section B</a></li> <li><a href="#">Section C</a></li> </ul>
  • 39. function getViewport() { return $(window).width() < 640 ? 'mobile' : 'large'; } var MainLayout = React.createClass({ getInitialState: function() { return { viewport: getViewport(), }; }, pokračování komponenty . . .
  • 40. _resize: function() { this.setState({ viewport: getViewport(), }); }, componentDidMount: function() { $(window).on('resize.content', this._resize); }, componentWillUnmount: function() { $(window).unbind('.content'); }, pokračování . . .
  • 41. render: function() { var content; if (this.state.viewport == 'mobile') { content = ( <ul class="tabs"> <li><a href="#">Section A</a></li> <li><a href="#">Section B</a></li> <li><a href="#">Section C</a></li> </ul> <div> Zobrazení na mobilu </div> ); } else { content = ( <div className="grid">Zobrazení na desktopu</div> ) } return content; } }); Mobilní navigace
  • 46. Děkuji za pozornost Martin Pešout www.martinpesout.cz @martinpesout