SlideShare a Scribd company logo
Guido Bellomo
Lead Front End Developer
www.gild.com
guido.bellomo@gmail.com
- React
- Flux & Redux
- React Native
- UmarellsApp
Backbone.View
Backbone.View.extend({
render: function() {
this.$el.html(
'<div>...my-markup...</div>'
);
}
});
Backbone.View
Backbone.View.extend({
render: function() {
this.$el.html(
'<input type="text" /><button>OK</button>'
);
}
});
React
React.createClass({
render: () => {
return <div>
<input type="text" /><button>OK</button>
</div>;
}
});
React
React.createClass({
getInitialState: () => {name: 'Guido'},
render: () => {
return <div>
<span>Hi, {this.state.name}</span>
<input type="text" /><button>OK</button>
</div>;
}
});
React
React.createClass({

getDefaultProps: () => {name: 'Guido'},
render: () => {
return <div>
<span>Hi, {this.props.name}</span>
<input type="text" /><button>OK</button>
</div>;
}
});
Uno state è tutto cio' che non
è controllabile o osservabile
dall'esterno
Il problema con MVC
Il problema con MVC
Il problema con MVC
Il problema con MVC
Flux
React
render: () => {
var {city, state, country} = this.props;
return <div>
<Country value={country}/>
<State value={state} enabled={country == 'US'} />
<City value={city}
lookupState={state}

lookupCountry={country}
enabled={country != null &&
(state != null || country != 'US')}
</div>;
}
React
// ...
dispatch('resetCountry');
// ...
resetCountry: => {
myView.setProps({
country: null,
state: null,
city: null
});
}
Aggiungete stati ai vostri componenti
come se colui che deve scrivere il relativo
getter/setter e logica di aggiornamento
fosse un violento psicopatico che sa dove
abitate

JohnWood

(React Edition)
React
React.createClass({
shouldComponentUpdate: () => {
return this.props.comment.isChanged();
}
});
React
React.createClass({
shouldComponentUpdate: (nextProps) => {
return this.props.comment !== nextProps.comment;
}
});
Redux
1. Stato dell'app in un unico store
2. Action per modificare lo store
3. Reducers = pure functions
Redux
store.dispatch({
type: 'ADD_POI',
poi: {
latitude: 23,
longitude: 45
}
});
Redux
function pois(state = [], action) {
switch (action.type) {
case 'ADD_POI':
return return [...state, action.poi]
default:
return state
}
}
var store = createStore(reducer);
Redux
+ Infiniti do/redo
+ Debug
+ Testing
Nativo (ObjectiveC, Swift)
HTML5 + wrapper
JS Bridge
HTML + Wrapper
+ sviluppo rapido
+ versione mobile del sito gia' pronta
+ porting piu' facile
+ ecosistema JS/HTML
- prestazioni non ottimali
- UI piatta su tutti i dispositivi
- API solo HTML5
Titanium
+ sviluppo rapido
+ utilizzo UI e ottimizzazioni native
+ ecosistema JS
+ prestazioni
- programmazione imperativa
- API frastagliate
React Native
+ sviluppo rapido
+ utilizzo UI e ottimizzazioni native
+ ecosistema JS
+ prestazioni
+ programmazione dichiarativa (JSX)
- API frastagliate
Programmazione Imperativa
var label = Ti.createLabel({label: 'My Label'});
var input = Ti.createText({})
var view = Ti.createView({});
view.append(label);
view.append(input);
container.append(view); // finally
Programmazione Dichiarativa (JSX)
Form = React.createClass({
render: function() {
return <View>
<label>My Label</label>
<input type="text" />
<View>;
}
})
Umarell (s.m. bolognese - Omarello, ometto)
Umarells (p.m. omarelli, ometti, pensionati
bolognesismo + inglesismo globish)
Debugging
Debugging
var Page = React.createClass({
render: function() {
debugger;
return <Map pois={this.state.pois}/>
);
}
});
Firebase
Bind with Firebase 1/2
var POI = React.createClass({
componentWillMount: function() {
this.ref = new Firebase(
Config.pathFireBase + '/comments/' + poi.id
);
this.bindAsArray(this.ref, 'comments');
}
});
Bind with Firebase 2/2
var POI = React.createClass({
render: function() {
return _(this.state.comments).map((comment) {
return <Comment comment={comment} key={comment.id}/>
});
}
});
MapView &Annotations
render: () => {
return <MapView

annotations={_(this.state.pois).map((poi) => {
return {
latitude: poi.latitude,
longitude: poi.longitude
};
})}/>;
}
GeoHash
GeoHash
URL
1
10
GeoHash
URL
11
1
0
GeoHash
URL
110
10
GeoHash
URL
11011
0
GeoHash
1. Precisione migliora con la lunghezza
2. Punti vicini iniziano con lo stesso hash
Set Geofire Key
// ...
this.geoFire.set(newPoi.key(), [
latitude,
longitude
]);
// ...
MapView &Annotations
render: () => {
return <MapView

onRegionChangeComplete={(region) => this.setState({region})}

annotations={_(this.state.pois).map((poi) => {
return {
latitude: poi.latitude,
longitude: poi.longitude
};
})}/>;
}
Bind with Geofire
componentWillMount: function() {
var {region} = this.state;
var ref = new Firebase(Config.pathFireBase + '/geofire');

this.geoFire = new GeoFire(ref);

this.geoQuery = this.geoFire.query({

center: [region.latitude, region.longitude],

radius: 20 // km

});
...
Bind with Geofire
var {pois} = this.state;
this.geoQuery.on('key_entered',(key) => {

var ref = new Firebase(Config.pathFireBase + '/pois/' + key);

ref.once('value', (snapshot) => {

this.setState({
pois: _.union(pois, snapshot.val())
});
});
});
Bind with Geofire
var {pois} = this.state;
this.geoQuery.on('key_exited',(key) => {

this.setState({

pois: _(pois).reject((poi) => poi.id == key)

});

});
Conclusioni
+ indistinguibile da app nativa
+ tool di debug
+ integrato con XCode
+ divertente!
- Ancora alla 0.18 ...
Stay hungry, stai in coda

More Related Content

Similar to Umarells

ReactJS for beginners
ReactJS for beginnersReactJS for beginners
ReactJS for beginners
Ilaria Franchini
 
Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0
firenze-gtug
 
Yagwto
YagwtoYagwto
How To React - Gestione Stato Applicativo
How To React - Gestione Stato ApplicativoHow To React - Gestione Stato Applicativo
How To React - Gestione Stato Applicativo
AldoNoschese
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacyTommaso Torti
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
Matteo Magni
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
Matteo Magni
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
Dominopoint - Italian Lotus User Group
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
XeDotNet
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
Dominopoint - Italian Lotus User Group
 
Reactive programming principles
Reactive programming principlesReactive programming principles
Reactive programming principles
Riccardo Cardin
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
Riccardo Piccioni
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
Davide Cerbo
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
Sabino Labarile
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
Alessandro Martin
 
Oo Javascript
Oo JavascriptOo Javascript
Oo Javascript
maraexception
 
Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1
Steve Maraspin
 
Html5 e PHP
Html5 e PHPHtml5 e PHP
Html5 e PHP
Mariano Fiorentino
 
Android Widget @ whymca 2011
Android Widget @ whymca 2011Android Widget @ whymca 2011
Android Widget @ whymca 2011
Fabio Collini
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3
Martino Bordin
 

Similar to Umarells (20)

ReactJS for beginners
ReactJS for beginnersReactJS for beginners
ReactJS for beginners
 
Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0Luca Masini: Introduzione a GWT 2.0
Luca Masini: Introduzione a GWT 2.0
 
Yagwto
YagwtoYagwto
Yagwto
 
How To React - Gestione Stato Applicativo
How To React - Gestione Stato ApplicativoHow To React - Gestione Stato Applicativo
How To React - Gestione Stato Applicativo
 
Dominare il codice legacy
Dominare il codice legacyDominare il codice legacy
Dominare il codice legacy
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
jQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesignerjQuery - 1 | WebMaster & WebDesigner
jQuery - 1 | WebMaster & WebDesigner
 
XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13XPages Tips & Tricks, #dd13
XPages Tips & Tricks, #dd13
 
Write less do more...with jQuery
Write less do more...with jQueryWrite less do more...with jQuery
Write less do more...with jQuery
 
#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2#dd12 grillo daniele_xpages_tips_tricks_rev2
#dd12 grillo daniele_xpages_tips_tricks_rev2
 
Reactive programming principles
Reactive programming principlesReactive programming principles
Reactive programming principles
 
corso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascriptcorso web developer - Introduzione a Javascript
corso web developer - Introduzione a Javascript
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
 
E suap - tecnologie client
E suap - tecnologie client E suap - tecnologie client
E suap - tecnologie client
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
 
Oo Javascript
Oo JavascriptOo Javascript
Oo Javascript
 
Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1
 
Html5 e PHP
Html5 e PHPHtml5 e PHP
Html5 e PHP
 
Android Widget @ whymca 2011
Android Widget @ whymca 2011Android Widget @ whymca 2011
Android Widget @ whymca 2011
 
Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3Entity Framework 4 vs NHibernate 3
Entity Framework 4 vs NHibernate 3
 

Umarells