SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
React z pohledu UI vývojáře
Martin Pešout
www.martinpesout.cz
@martinpesout
8x nárůst za poslední mezi roky 2014-2015
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
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
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>
);
},
});
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

Más contenido relacionado

Similar a React z pohledu UI vývojáře

Jan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k AndroiduJan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k AndroiduCtvrtkoncz
 
Adam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerViewAdam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerViewmdevtalk
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Develcz
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimizationMartinKritof1
 
Použití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaciPoužití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaciMartin Krištof
 
Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]Karel Minarik
 
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Bohdan Ganický
 

Similar a React z pohledu UI vývojáře (13)

201502.ReinIT.Dev
201502.ReinIT.Dev201502.ReinIT.Dev
201502.ReinIT.Dev
 
Jan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k AndroiduJan Kaštánek - Od webových aplikací k Androidu
Jan Kaštánek - Od webových aplikací k Androidu
 
Adam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerViewAdam Šimek: Optimalizace skrolování, RecyclerView
Adam Šimek: Optimalizace skrolování, RecyclerView
 
TNPW2-2011-03
TNPW2-2011-03TNPW2-2011-03
TNPW2-2011-03
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
 
Úvod do rails
Úvod do railsÚvod do rails
Úvod do rails
 
R85 Designer Tcl
R85 Designer TclR85 Designer Tcl
R85 Designer Tcl
 
R85 Designer
R85 DesignerR85 Designer
R85 Designer
 
React premature performance optimization
React premature performance optimizationReact premature performance optimization
React premature performance optimization
 
Použití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaciPoužití Next.js a Reactí UI khinihovny v aplikaci
Použití Next.js a Reactí UI khinihovny v aplikaci
 
ASP.NET 3.5 / futures
ASP.NET 3.5 / futuresASP.NET 3.5 / futures
ASP.NET 3.5 / futures
 
Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]Představení Ruby on Rails [Junior Internet]
Představení Ruby on Rails [Junior Internet]
 
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
 

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
  • 3.
  • 4.
  • 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
  • 13.
  • 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
  • 16.
  • 17.
  • 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> ); }, });
  • 31.
  • 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