SlideShare uma empresa Scribd logo
1 de 68
Baixar para ler offline
React? Já ouvi falar
Temas abordados
1. Problemas atuais da web
2. Onde a web está
3. Futuro?
4. Como o desenvolvimento é hoje
5. React
6. Flux
Cezar Luiz
Programador Front-End
JavaScript <3
Trabalha na Snowman Labs
23 anos
Web nos dias
de hoje
Muita demanda
de informação
Muita gente conectada
performance !important
Tempo de
resposta
deve ser cada
vez menor
Onde a web
está presente
Falando sobre
front-end
Muito do que se faz hoje
MVC
Mineração de DOM - getElementById, etc
Adiciona classe, retira classe
Problemas de compatibilidade
Dificuldade em escalar e aceitar
grande quantidade de dados
Problemas com MVC
“MVC got really
complicated
really quickly”
!
Virtual DOM
React abstracts away the DOM from
you, giving a simpler programming
model and better performance. React
can also render on the server using
Node, and it can power native apps
using React Native.
Data Flow
React implements one-way reactive
data flow which reduces boilerplate
and is easier to reason about than
traditional data binding.
!framework
Por que não
pensar mais na
sua aplicação, na lógica,
do que ficar se preocupando
com o “DOM”?
import React from 'react';
import ReactDOM from 'react-dom';
class HelloWorld extends React.Component {
render() {
return <div>Hello World!</div>
}
}
ReactDOM.render(<HelloWorld />, mountNode);
JSX
import React from 'react';
import ReactDOM from 'react-dom';
class HelloWorld extends React.Component {
render() {
return React.createElement(
"div",
null,
"Hello World"
);
}
}
ReactDOM.render(React.createElement(HelloWorld), mountNode);
JS compilado
state e PROPS
Onde gerenciamos os dados
da nossa aplicação
import MailHeader from './MailHeaderComponent';
import MailButtons from './MailButtonsComponent';
import MailsTable from './MailTablesComponent';
class Mails extends React.Component {
render() {
return (
<div className="mails-container">
<MailHeader />
<MailButtons />
<MailsTable />
</div>
);
}
}
import HeaderTitle from './header/HeaderTitleComponent';
import HeaderSearch from './header/HeaderSearchComponent';
import Profile from './ProfileComponent';
class MailHeader extends React.Component {
render() {
return (
<header className="mail-header">
<HeaderTitle title="Inbox" />
<HeaderSearch placeholder="Search..." />
<Profile user={user} />
</header>
);
}
}
import MailRow from './MailRowComponent';
class MailTable extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false,
mails: []
};
}
componentDidMount() {
this.setState({ loading: true });
$.ajax({
url: `${host}/mails`
})
.done((response) => {
this.setState({
mails: response.results
});
})
.complete(() => {
this.setState({ loading: false });
});
}
render() {
if (this.state.loading) {
return <p>Carregando emails...</p>
}
if (!this.state.mails.length) {
return <p>Nenhum email por enquanto.</p>
}
return (
<table className="mails-table">
<thead>...</thead>
<tbody>
{this.state.mails.map((mail) => {
return <MailRow mail={mail} />
})}
</tbody>
</table>
);
}
}
import MailRow from './MailRowComponent';
import $ from 'jquery';
class MailTable extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false,
mails: []
};
}
...
}
import MailRow from './MailRowComponent';
import $ from 'jquery';
class MailTable extends React.Component {
...
componentDidMount() {
this.setState({ loading: true });
$.ajax({
url: `${host}/mails`
})
.done((response) => {
this.setState({
mails: response.results
});
})
.complete(() => {
this.setState({ loading: false });
});
}
...
}
import MailRow from './MailRowComponent';
class MailTable extends React.Component {
...
render() {
if (this.state.loading) {
return <p>Carregando emails...</p>
}
if (!this.state.mails.length) {
return <p>Nenhum email por enquanto.</p>
}
return (
<table className="mails-table">
<thead>...</thead>
<tbody>
{this.state.mails.map((mail) => {
return <MailRow mail={mail} />
})}
</tbody>
</table>
);
}
}
class MailRow extends React.Component {
changeCheck() {
let checkbox = this.refs.checkbox;
let dom = React.findDOMNode(checkbox); // Não é tão necessário
let { value, name, type } = checkbox;
...
}
render() {
return (
<tr>
<td>
<input
onChange={this.changeCheck.bind(this)}
type="checkbox"
name="checkMail"
ref="checkbox"
/>
</td>
<td>{this.props.name}</td>
<td>{this.props.resume}</td>
<td>{this.props.date}</td>
</tr>
);
}
}
c o m p o n e n t i z a ç ã o
ciclo
de vida
3 partes principais
Mounting - Um componente irá ser inserido no DOM.
Updating - Um componente está a ser re-renderizado
para determinar se o DOM deverá ser atualizado. (Virtual DOM)
Unmounting - Um componente está sendo removido do DOM.
Além disso, o React fornece métodos de ciclos de vida para
você interceptar esse processo. Métodos do tipo “will”.
Mounting - 3 métodos
getInitialState - Chamado antes de um componente ser
montado. Componentes que usam state devem implementar
isso para retornar dados iniciais.
componentWillMount - Chamado imediatamente antes
de ocorrer a montagem.
componentDidMount - Chamado imediatamente depois
de ocorrer a montagem. Se precisar alterar o DOM, deve vir aqui.
Updating - 4 métodos
componentWillReceiveProps(object nextProps) - Chamado
quando um componente recebe novas propriedades.
shouldComponentUpdate(object nextProps, object nextState)
Deve retornar um boolean se o componente deverá ser
atualizado ou não.
componentWillUpdate(object nextProps, object nextState)
Chamado imediatamente antes de uma atualização acontecer.
Não pode chamar this.setState aqui.
componentDidUpdate(object prevProps, object prevState)
Chamado imediatamente depois da atualização acontecer.
Unmounting - 1 método
componentWillUnmount - Chamado imediatamente antes
de um componente ser desmontado e destruído. Limpezas
devem ser feitas aqui.
state props refs render
ciclos de vida
componentização
JSX e JS compilado
UI complexas
event system (onClick onChange...)
ajax
isso é React
E o tal do flux?
!framework
Arquitetura
de aplicação
para construir
interfaces
“simplificar”
exemplos
com altjs
// dispatcher.js
import alt from 'alt';
let alt = new Alt();
export default alt;
// actions/MailActions.js
import alt from '../dispatcher';
import $ from 'jquery';
class MailActions {
getMails() {
$.ajax({
url: `${host}/mails`
})
.done((res) => {
this.actions.getMailsSuccess(res);
})
.fail(() => {
this.actions.getMailsFail();
});
return true;
}
getMailsSuccess(res) {
return res;
}
getMailsFail() {
// Envia uma notificação de erro para o usuário na tela
return false;
}
}
export default alt.createActions(MailActions);
// stores/MailStore.js
import alt from '../dispatcher';
import MailActions from '../actions/MailActions';
class MailStore {
constructor() {
this.state = {
loading: false,
error: false,
mails: []
};
this.bindActions(MailActions);
}
onGetMails() {
this.setState({
loading: true,
error: false
});
}
onGetMailsSuccess(response) {
this.setState({
loading: false,
mails: response.result
});
}
onGetMailsFail(err) {
this.setState({
loading: false,
error: err,
mails: []
});
}
}
export default alt.createStore(MailStore, 'MailStore');
// components/MailTableComponent.js
import MailRow from './MailRowComponent';
import MailActions from '../actions/MailActions';
import MailStore from '../stores/MailStore';
class MailTable extends React.Component {
constructor(props) {
super(props);
this.state = MailStore.getState();
this.onMailChange = this.onMailChange.bind(this);
}
componentDidMount() {
MailStore.listen(this.onMailChange);
MailActions.getMails();
}
componentWillUnmount() {
MailStore.unlisten(this.onMailChange);
}
onMailChange(state) {
this.setState(state);
}
render() {
if (this.state.loading) {
return <p>Carregando emails...</p>
}
if (!this.state.mails.length) {
return <p>Nenhum email por enquanto.</p>
}
return (
<table className="mails-table">
<thead>...</thead>
<tbody>
{this.state.mails.map((mail) => {
return <MailRow mail={mail} />
})}
</tbody>
</table>
);
}
}
// components/MailTableComponent.js
import MailRow from './MailRowComponent';
import MailActions from '../actions/MailActions';
import MailStore from '../stores/MailStore';
class MailTable extends React.Component {
constructor(props) {
super(props);
this.state = MailStore.getState();
this.onMailChange = this.onMailChange.bind(this);
}
...
}
// components/MailTableComponent.js
import MailRow from './MailRowComponent';
import MailActions from '../actions/MailActions';
import MailStore from '../stores/MailStore';
class MailTable extends React.Component {
...
componentDidMount() {
MailStore.listen(this.onMailChange);
MailActions.getMails();
}
componentWillUnmount() {
MailStore.unlisten(this.onMailChange);
}
onMailChange(state) {
this.setState(state);
}
...
}
// components/MailTableComponent.js
import MailRow from './MailRowComponent';
import MailActions from '../actions/MailActions';
import MailStore from '../stores/MailStore';
class MailTable extends React.Component {
...
render() {
if (this.state.loading) {
return <p>Carregando emails...</p>
}
if (!this.state.mails.length) {
return <p>Nenhum email por enquanto.</p>
}
return (
<table className="mails-table">
<thead>...</thead>
<tbody>
{this.state.mails.map((mail) => {
return <MailRow mail={mail} />
})}
</tbody>
</table>
);
}
}
“simplificar”
O que ele pode fazer por nós
alta escalabilidade
fácil manutenção
isomorfismo
native apps com react-native
programação reativa
Quem já usa
airbnb netflix yahoo asana
atlassian coursera bbc deezer
dropbox facebook instagram
imdb imgur marvelapp
periscope reddit salesforce
uber whatsapp globoplay
(brinks)
Obrigado!
{
github: “CezarLuiz0”,
twitter: “cezar_luiz”,
email: “cezarluiz.c@gmail.com”
}

Mais conteúdo relacionado

Mais procurados

Vue.js - o framework progressivo
Vue.js - o framework progressivoVue.js - o framework progressivo
Vue.js - o framework progressivoVinicius Reis
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsVinicius Reis
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Migrando para o Angular 2
Migrando para o Angular 2Migrando para o Angular 2
Migrando para o Angular 2Andre Baltieri
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Felipe Mamud
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereJuliano Martins
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoEduardo Mendes
 
Angular 2, TypeScript e Além
Angular 2, TypeScript e AlémAngular 2, TypeScript e Além
Angular 2, TypeScript e AlémAndre Baltieri
 

Mais procurados (20)

Vue.js - o framework progressivo
Vue.js - o framework progressivoVue.js - o framework progressivo
Vue.js - o framework progressivo
 
React Native - JSday
React Native - JSdayReact Native - JSday
React Native - JSday
 
Vue.js
Vue.jsVue.js
Vue.js
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
 
Zk Framework
Zk FrameworkZk Framework
Zk Framework
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Migrando para o Angular 2
Migrando para o Angular 2Migrando para o Angular 2
Migrando para o Angular 2
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
Curso AngularJS - Parte 2
Curso AngularJS - Parte 2Curso AngularJS - Parte 2
Curso AngularJS - Parte 2
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?Minha aplicação Java vai pra nuvem. E agora?
Minha aplicação Java vai pra nuvem. E agora?
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Angular js
Angular jsAngular js
Angular js
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
 
Angular 2
Angular 2Angular 2
Angular 2
 
Java Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuraçãoJava Web 2 - Ferramentas e configuração
Java Web 2 - Ferramentas e configuração
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Angular 2, TypeScript e Além
Angular 2, TypeScript e AlémAngular 2, TypeScript e Além
Angular 2, TypeScript e Além
 

Destaque

Automating Large Applications on Modular and Structured Form with Gulp
Automating Large Applications on Modular and Structured Form with GulpAutomating Large Applications on Modular and Structured Form with Gulp
Automating Large Applications on Modular and Structured Form with GulpAnderson Aguiar
 
React JS and why it's awesome
React JS and why it's awesomeReact JS and why it's awesome
React JS and why it's awesomeAndrew Hull
 
NetBeans Day 2016 - Getting the best of NetBeans IDE
NetBeans Day 2016 - Getting the best of NetBeans IDENetBeans Day 2016 - Getting the best of NetBeans IDE
NetBeans Day 2016 - Getting the best of NetBeans IDELeonardo Zanivan
 
JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]
JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]
JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]Leonardo Zanivan
 
TDC 2016 - Rodando JavaScript Server com Wildfly
TDC 2016 - Rodando JavaScript Server com WildflyTDC 2016 - Rodando JavaScript Server com Wildfly
TDC 2016 - Rodando JavaScript Server com WildflyLeonardo Zanivan
 
NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...
NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...
NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...Leonardo Zanivan
 
TDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EETDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EELeonardo Zanivan
 
O papel e a carreira do arquiteto de software
O papel e a carreira do arquiteto de softwareO papel e a carreira do arquiteto de software
O papel e a carreira do arquiteto de softwareLeonardo Zanivan
 
React e reactividade Meetup Facebook Developer Circles
React e reactividade Meetup Facebook Developer CirclesReact e reactividade Meetup Facebook Developer Circles
React e reactividade Meetup Facebook Developer CirclesJosé Barbosa
 
Understanding Facebook's React.js
Understanding Facebook's React.jsUnderstanding Facebook's React.js
Understanding Facebook's React.jsFederico Torre
 
The Flash no front-end
The Flash no front-endThe Flash no front-end
The Flash no front-endCezar Luiz
 
React Example + Bootstrap
React Example + BootstrapReact Example + Bootstrap
React Example + BootstrapEueung Mulyana
 
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EEJavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EELeonardo Zanivan
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?Leonardo Zanivan
 
Arquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da NetflixArquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da NetflixBruno Tavares
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpMatthew Davis
 

Destaque (20)

Automating Large Applications on Modular and Structured Form with Gulp
Automating Large Applications on Modular and Structured Form with GulpAutomating Large Applications on Modular and Structured Form with Gulp
Automating Large Applications on Modular and Structured Form with Gulp
 
React JS and why it's awesome
React JS and why it's awesomeReact JS and why it's awesome
React JS and why it's awesome
 
JSX
JSXJSX
JSX
 
Aeonflux
AeonfluxAeonflux
Aeonflux
 
NetBeans Day 2016 - Getting the best of NetBeans IDE
NetBeans Day 2016 - Getting the best of NetBeans IDENetBeans Day 2016 - Getting the best of NetBeans IDE
NetBeans Day 2016 - Getting the best of NetBeans IDE
 
JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]
JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]
JavaOne 2014 - Scalable JavaScript Applications with Project Nashorn [CON6423]
 
TDC 2016 - Rodando JavaScript Server com Wildfly
TDC 2016 - Rodando JavaScript Server com WildflyTDC 2016 - Rodando JavaScript Server com Wildfly
TDC 2016 - Rodando JavaScript Server com Wildfly
 
NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...
NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...
NetBeans Day 2015 - Node.js, HTML5, JBoss Forge, and Other Awesome New NetBea...
 
TDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EETDC 2016 - Simplificando a segurança de sua aplicação com Java EE
TDC 2016 - Simplificando a segurança de sua aplicação com Java EE
 
O papel e a carreira do arquiteto de software
O papel e a carreira do arquiteto de softwareO papel e a carreira do arquiteto de software
O papel e a carreira do arquiteto de software
 
React e reactividade Meetup Facebook Developer Circles
React e reactividade Meetup Facebook Developer CirclesReact e reactividade Meetup Facebook Developer Circles
React e reactividade Meetup Facebook Developer Circles
 
Curso Android Básico
Curso Android BásicoCurso Android Básico
Curso Android Básico
 
Understanding Facebook's React.js
Understanding Facebook's React.jsUnderstanding Facebook's React.js
Understanding Facebook's React.js
 
Angular js
Angular jsAngular js
Angular js
 
The Flash no front-end
The Flash no front-endThe Flash no front-end
The Flash no front-end
 
React Example + Bootstrap
React Example + BootstrapReact Example + Bootstrap
React Example + Bootstrap
 
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EEJavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
JavaOne 2015 - Simplificando a segurança de sua aplicação com Java EE
 
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?JavaOne 2016 - Kotlin: The Language of The Future For JVM?
JavaOne 2016 - Kotlin: The Language of The Future For JVM?
 
Arquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da NetflixArquitetura JavaScript Escalável da Netflix
Arquitetura JavaScript Escalável da Netflix
 
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and GulpOptimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
Optimising Your Front End Workflow With Symfony, Twig, Bower and Gulp
 

Semelhante a React: Entendendo o framework

Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no FrontendHenrique Gogó
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesCI&T
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
React - Compartilhando estado entre componentes
React - Compartilhando estado entre componentesReact - Compartilhando estado entre componentes
React - Compartilhando estado entre componentesJefferson Mariano de Souza
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no NubankDevCamp Campinas
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Eduardo Mendes
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusDenis L Presciliano
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webelliando dias
 
WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08Gilson Silva
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
Apresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVCApresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVCZarathon Maia
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYraquelcarsi
 

Semelhante a React: Entendendo o framework (20)

Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
JavaScript Model-View no Frontend
JavaScript Model-View no FrontendJavaScript Model-View no Frontend
JavaScript Model-View no Frontend
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
React js
React js React js
React js
 
React - Compartilhando estado entre componentes
React - Compartilhando estado entre componentesReact - Compartilhando estado entre componentes
React - Compartilhando estado entre componentes
 
Pilares do desenvolvimento Mobile no Nubank
 Pilares do desenvolvimento Mobile no Nubank Pilares do desenvolvimento Mobile no Nubank
Pilares do desenvolvimento Mobile no Nubank
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 
Artigoajax
ArtigoajaxArtigoajax
Artigoajax
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta Cactus
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08WEB 2 - Aula 01 - 02.08
WEB 2 - Aula 01 - 02.08
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
 
Hello vue
Hello vueHello vue
Hello vue
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Apresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVCApresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVC
 
Jdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITYJdbc, JAVA DATABASE CONNECTIVITY
Jdbc, JAVA DATABASE CONNECTIVITY
 
servlet-introducao
servlet-introducaoservlet-introducao
servlet-introducao
 
Java e Cloud Computing
Java e Cloud ComputingJava e Cloud Computing
Java e Cloud Computing
 

React: Entendendo o framework

  • 2. Temas abordados 1. Problemas atuais da web 2. Onde a web está 3. Futuro? 4. Como o desenvolvimento é hoje 5. React 6. Flux
  • 3. Cezar Luiz Programador Front-End JavaScript <3 Trabalha na Snowman Labs 23 anos
  • 5.
  • 6.
  • 10. Tempo de resposta deve ser cada vez menor
  • 11. Onde a web está presente
  • 12.
  • 13.
  • 14.
  • 15.
  • 17. Muito do que se faz hoje MVC Mineração de DOM - getElementById, etc Adiciona classe, retira classe Problemas de compatibilidade Dificuldade em escalar e aceitar grande quantidade de dados
  • 20.
  • 21.
  • 22.
  • 23. !
  • 24. Virtual DOM React abstracts away the DOM from you, giving a simpler programming model and better performance. React can also render on the server using Node, and it can power native apps using React Native.
  • 25. Data Flow React implements one-way reactive data flow which reduces boilerplate and is easier to reason about than traditional data binding.
  • 27.
  • 28. Por que não pensar mais na sua aplicação, na lógica, do que ficar se preocupando com o “DOM”?
  • 29. import React from 'react'; import ReactDOM from 'react-dom'; class HelloWorld extends React.Component { render() { return <div>Hello World!</div> } } ReactDOM.render(<HelloWorld />, mountNode); JSX
  • 30.
  • 31. import React from 'react'; import ReactDOM from 'react-dom'; class HelloWorld extends React.Component { render() { return React.createElement( "div", null, "Hello World" ); } } ReactDOM.render(React.createElement(HelloWorld), mountNode); JS compilado
  • 32. state e PROPS Onde gerenciamos os dados da nossa aplicação
  • 33.
  • 34. import MailHeader from './MailHeaderComponent'; import MailButtons from './MailButtonsComponent'; import MailsTable from './MailTablesComponent'; class Mails extends React.Component { render() { return ( <div className="mails-container"> <MailHeader /> <MailButtons /> <MailsTable /> </div> ); } }
  • 35. import HeaderTitle from './header/HeaderTitleComponent'; import HeaderSearch from './header/HeaderSearchComponent'; import Profile from './ProfileComponent'; class MailHeader extends React.Component { render() { return ( <header className="mail-header"> <HeaderTitle title="Inbox" /> <HeaderSearch placeholder="Search..." /> <Profile user={user} /> </header> ); } }
  • 36. import MailRow from './MailRowComponent'; class MailTable extends React.Component { constructor(props) { super(props); this.state = { loading: false, mails: [] }; } componentDidMount() { this.setState({ loading: true }); $.ajax({ url: `${host}/mails` }) .done((response) => { this.setState({ mails: response.results }); }) .complete(() => { this.setState({ loading: false }); }); } render() { if (this.state.loading) { return <p>Carregando emails...</p> } if (!this.state.mails.length) { return <p>Nenhum email por enquanto.</p> } return ( <table className="mails-table"> <thead>...</thead> <tbody> {this.state.mails.map((mail) => { return <MailRow mail={mail} /> })} </tbody> </table> ); } }
  • 37.
  • 38. import MailRow from './MailRowComponent'; import $ from 'jquery'; class MailTable extends React.Component { constructor(props) { super(props); this.state = { loading: false, mails: [] }; } ... }
  • 39. import MailRow from './MailRowComponent'; import $ from 'jquery'; class MailTable extends React.Component { ... componentDidMount() { this.setState({ loading: true }); $.ajax({ url: `${host}/mails` }) .done((response) => { this.setState({ mails: response.results }); }) .complete(() => { this.setState({ loading: false }); }); } ... }
  • 40. import MailRow from './MailRowComponent'; class MailTable extends React.Component { ... render() { if (this.state.loading) { return <p>Carregando emails...</p> } if (!this.state.mails.length) { return <p>Nenhum email por enquanto.</p> } return ( <table className="mails-table"> <thead>...</thead> <tbody> {this.state.mails.map((mail) => { return <MailRow mail={mail} /> })} </tbody> </table> ); } }
  • 41. class MailRow extends React.Component { changeCheck() { let checkbox = this.refs.checkbox; let dom = React.findDOMNode(checkbox); // Não é tão necessário let { value, name, type } = checkbox; ... } render() { return ( <tr> <td> <input onChange={this.changeCheck.bind(this)} type="checkbox" name="checkMail" ref="checkbox" /> </td> <td>{this.props.name}</td> <td>{this.props.resume}</td> <td>{this.props.date}</td> </tr> ); } }
  • 42. c o m p o n e n t i z a ç ã o
  • 44. 3 partes principais Mounting - Um componente irá ser inserido no DOM. Updating - Um componente está a ser re-renderizado para determinar se o DOM deverá ser atualizado. (Virtual DOM) Unmounting - Um componente está sendo removido do DOM. Além disso, o React fornece métodos de ciclos de vida para você interceptar esse processo. Métodos do tipo “will”.
  • 45. Mounting - 3 métodos getInitialState - Chamado antes de um componente ser montado. Componentes que usam state devem implementar isso para retornar dados iniciais. componentWillMount - Chamado imediatamente antes de ocorrer a montagem. componentDidMount - Chamado imediatamente depois de ocorrer a montagem. Se precisar alterar o DOM, deve vir aqui.
  • 46. Updating - 4 métodos componentWillReceiveProps(object nextProps) - Chamado quando um componente recebe novas propriedades. shouldComponentUpdate(object nextProps, object nextState) Deve retornar um boolean se o componente deverá ser atualizado ou não. componentWillUpdate(object nextProps, object nextState) Chamado imediatamente antes de uma atualização acontecer. Não pode chamar this.setState aqui. componentDidUpdate(object prevProps, object prevState) Chamado imediatamente depois da atualização acontecer.
  • 47. Unmounting - 1 método componentWillUnmount - Chamado imediatamente antes de um componente ser desmontado e destruído. Limpezas devem ser feitas aqui.
  • 48. state props refs render ciclos de vida componentização JSX e JS compilado UI complexas event system (onClick onChange...) ajax isso é React
  • 49. E o tal do flux?
  • 52.
  • 55. // dispatcher.js import alt from 'alt'; let alt = new Alt(); export default alt;
  • 56. // actions/MailActions.js import alt from '../dispatcher'; import $ from 'jquery'; class MailActions { getMails() { $.ajax({ url: `${host}/mails` }) .done((res) => { this.actions.getMailsSuccess(res); }) .fail(() => { this.actions.getMailsFail(); }); return true; } getMailsSuccess(res) { return res; } getMailsFail() { // Envia uma notificação de erro para o usuário na tela return false; } } export default alt.createActions(MailActions);
  • 57. // stores/MailStore.js import alt from '../dispatcher'; import MailActions from '../actions/MailActions'; class MailStore { constructor() { this.state = { loading: false, error: false, mails: [] }; this.bindActions(MailActions); } onGetMails() { this.setState({ loading: true, error: false }); } onGetMailsSuccess(response) { this.setState({ loading: false, mails: response.result }); } onGetMailsFail(err) { this.setState({ loading: false, error: err, mails: [] }); } } export default alt.createStore(MailStore, 'MailStore');
  • 58. // components/MailTableComponent.js import MailRow from './MailRowComponent'; import MailActions from '../actions/MailActions'; import MailStore from '../stores/MailStore'; class MailTable extends React.Component { constructor(props) { super(props); this.state = MailStore.getState(); this.onMailChange = this.onMailChange.bind(this); } componentDidMount() { MailStore.listen(this.onMailChange); MailActions.getMails(); } componentWillUnmount() { MailStore.unlisten(this.onMailChange); } onMailChange(state) { this.setState(state); } render() { if (this.state.loading) { return <p>Carregando emails...</p> } if (!this.state.mails.length) { return <p>Nenhum email por enquanto.</p> } return ( <table className="mails-table"> <thead>...</thead> <tbody> {this.state.mails.map((mail) => { return <MailRow mail={mail} /> })} </tbody> </table> ); } }
  • 59.
  • 60. // components/MailTableComponent.js import MailRow from './MailRowComponent'; import MailActions from '../actions/MailActions'; import MailStore from '../stores/MailStore'; class MailTable extends React.Component { constructor(props) { super(props); this.state = MailStore.getState(); this.onMailChange = this.onMailChange.bind(this); } ... }
  • 61. // components/MailTableComponent.js import MailRow from './MailRowComponent'; import MailActions from '../actions/MailActions'; import MailStore from '../stores/MailStore'; class MailTable extends React.Component { ... componentDidMount() { MailStore.listen(this.onMailChange); MailActions.getMails(); } componentWillUnmount() { MailStore.unlisten(this.onMailChange); } onMailChange(state) { this.setState(state); } ... }
  • 62. // components/MailTableComponent.js import MailRow from './MailRowComponent'; import MailActions from '../actions/MailActions'; import MailStore from '../stores/MailStore'; class MailTable extends React.Component { ... render() { if (this.state.loading) { return <p>Carregando emails...</p> } if (!this.state.mails.length) { return <p>Nenhum email por enquanto.</p> } return ( <table className="mails-table"> <thead>...</thead> <tbody> {this.state.mails.map((mail) => { return <MailRow mail={mail} /> })} </tbody> </table> ); } }
  • 64. O que ele pode fazer por nós alta escalabilidade fácil manutenção isomorfismo native apps com react-native programação reativa
  • 65. Quem já usa airbnb netflix yahoo asana atlassian coursera bbc deezer dropbox facebook instagram imdb imgur marvelapp periscope reddit salesforce uber whatsapp globoplay
  • 66.