SlideShare uma empresa Scribd logo
Globalcode	
  – Open4education
Interfaces  ricas  com  Rails  e  React.JS
Rodrigo  Urubatan
@urubatan
Globalcode	
  – Open4education
Quem?
Programador  desde  1997
Trabalha  com  Ruby  na  Brightwire
Escreveu  "Ruby  On  Rails:  Desenvolvimento  fácil  e  Rápido  de  
aplicações  web”
Já  trabalhou  com  diversas  linguagens  (C,  C++,  Delphi,  PHP,  
ASP,  ColdFusion,  VisualBasic,  C#,  Python,  Ruby,  Assembly,  
…)
Apaixonado  por  Agile  e  atualmente  por  trabalho  remoto
Patinador,  Corredor,  Ciclista  e  agora  resolveu  aprender  Karate  
:D
Pai  de  um  Guri  de  6  anos
http://urubatan.com.br -­ Anda  meio  abandonado  mas  vai  voltar
http://sobrecodigo.com -­ idem
Globalcode	
  – Open4education
Objetivo
Usar  o  Rails  como  backend  da  aplicação
Toda  a  interação  com  o  usuário  será  implementada  
no  cliente
Validações  e  regras  de  negócio  serão  
implementadas  no  servidor
(sim,  eu  poderia  usar  Sinatra  mas  sou  preguiçoso)
Globalcode	
  – Open4education
Cuidado!
Nesta  palestra  vamos  falar  de  uma  SPA  (Single  
Page  Application)
Isto  tem  vantagens  e  desvantagens
Melhora  muito  a  interação  com  o  usuário  sem  
duplicação  de  código,  já  que  o  código  de  
renderização  fica  todo  no  JS
Piora  muito  a  indexação  da  sua  aplicação  por  
buscadores  (adeus  SEO  -­ ou  não…)
Globalcode	
  – Open4education
O  que,  quando,  onde  e  por  
que?
Muitas  aplicações  hoje  em  dia  exigem  um  nível  alto  
de  interação  com  o  usuário
Implementar  isto  usando  bibliotecas  mais  baixo  
nível  é  muito  fácil  de  causar  uma  grande  
confusão  do  código  (PHP  alguem?)
Componentização  evita  duplicação  de  código  e  
facilita  a  organização
Globalcode	
  – Open4education
Por que rails?
Eu gosto :P
Globalcode	
  – Open4education
Por que React.js?
JSX!!!!!!
Unir o  código  Javascript  e  o  Código  HTML  de  
cada  componente  
Facilidade  de  manutenção  
Facilidade  de  organização  
Mantem  o  CSS  separado  de  propósito,  CSS  é  
mais  especifico  de  aplicação  do  que  
componente  (pode  se  usar  imports  SASS  se  
necessário)  
Globalcode	
  – Open4education
Por que React.js?
Virtual  DOM
Fácil  de  testar  em  uma  pequena  parte  de  uma  tela  
Renderização  reativa  
Componentes  stateful  
Comunicação  entre  componentes  via  propriedades  
Globalcode	
  – Open4education
Mãos  a  obra!  (O  blog  mais
feio do  mundo!)
Globalcode	
  – Open4education
Criando  a  aplicação
Uma  aplicação  padrão  Rails  (rails  new  …)
Gemfile  updates
gem 'backbone-on-rails'
gem 'react-rails', github: 'reactjs/react-rails', ref:
'master'
Environment  update  (development.rb  para  
começar)
config.react.variant = :development
config.react.addons = true # defaults to false
config.react.server_renderer =
React::ServerRendering::SprocketsRenderer
bundle  install
rails  g  react:install
Globalcode	
  – Open4education
Componentes
Componentes  javascript  vão  ficar  em  
app/assets/javascript/components
Backbone.js  vai  facilitar  a  comunicação  
cliente/servidor
arquivos  .js.jsx  tem  uma  facilidade  extra,  são  
compilados  pelo  react-­rails  via  asset  pipeline  e  
permitem  adicionar  HTML  inline  
Globalcode	
  – Open4education
Cadastrando  um  Post
rails  g  scaffold  post  title:string slug:text content:text
Apagar todas as  views  do  post  exceto index.html.erb
Globalcode	
  – Open4education
Alterações  no  controller
Fazer  todos  os  métodos  retornarem  json
Remover  edit,  new  e  show
Apagar  todo  o  código  de  index.html.erb  e  
mudar  para:
<%=  react_component('Blog',  {collection:  
@posts,  item:  @post})  %>
Globalcode	
  – Open4education
Agora  mãos  a  obra
já  temos  uma  “API"  em  Rails,  poderíamos  ter  o  
código  em  Sinatra  que  seria  mais  leve,  mas  eu  
gosto  do  asset  pipeline  e  assim  fica  mais  fácil  para  
um  iniciante
Falta  criar  os  componentes  backbone  para  acessar  
o  backend
Criar  os  componentes  react  para  a  UI
Globalcode	
  – Open4education
backbone.js
app/assets/javascripts/collections/posts.js
var Posts  =  Backbone.Collection.extend({
model:  Post,
url:  '/posts'
});;
app/assets/jaascripts/models/post.js
var Post  =  Backbone.Model.extend({
});;
Globalcode	
  – Open4education
blog.js.jsx
var Blog  =  React.createClass({
…..
render:  function  ()  {
if(this.state.editing)   {
return  (<div>
<div  id="blogList">
<PostList collection={this.state.collection}   viewModel={this.viewModel}  
newModel={this.newModel}/>
</div>
<div  id="blogPost">
<PostForm collection={this.state.collection}   model={this.state.model}  
viewModel={this.viewModel}/>
</div>
</div>);;
}else{
return  (<div>
<div  id="blogList">
<PostList collection={this.state.collection}   viewModel={this.viewModel}  
newModel={this.newModel}/>
</div>
<div  id="blogPost">
<PostView model={this.state.model}   editModel={this.editModel}/>
</div>
</div>);;
}
}
});;
Globalcode	
  – Open4education
post_list.js.jsx
var PostList =  React.createClass({
….
render:  function  ()  {
var users  =  this.props.collection.map(function  (model)  {
var viewModel =  function  ()  {
this.props.viewModel(model);;
};;
return  (
<tr key={model.get("id")}>
<td><a  href="#"  onClick={viewModel.bind(this)}>{model.get("title")}</a></td>
<td>{new  Date(model.get("created_at")).toDateString()}</td>
</tr>
);;
}.bind(this));;
return  (
<div>
<table  className="post-­list">
<thead>
<tr>
<th>Post</th>
<th>Published</th>
</tr>
</thead>
<tbody>
{users}
</tbody>
</table>
<hr/>
<a  href="#"  onClick={this.props.newModel}>Create  post</a>
</div>
);;
}
});;
Globalcode	
  – Open4education
post_view.js.jsx
var PostView =  React.createClass({
editModel:  function  ()  {
this.props.editModel(this.props.model);;
},
render:  function  ()  {
var innerLines =  null;;
if(this.props.model.get("content"))   {
innerLines=_.map(this.props.model.get("content").split("n"),   function  (txt,  idx)  {
return  <p  key={idx}>{txt}</p>
});;
}
return  (
<div  className="blog-­post">
<h1><a  
href={this.props.model.get("slug")}>{this.props.model.get("title")}</a></h1>
<div  className="post-­body">
{innerLines}
</div>
<hr/>
<a  href="#"  onClick={this.editModel}>Edit  post</a>
</div>
);;
}
});;
Globalcode	
  – Open4education
post_form.js.jsx
var PostForm =  React.createClass({
saveModel:  function  ()  {
if  (this.props.model.get("id"))  {
this.props.model.save();;
}  else  {
this.props.collection.create(this.props.model);;
}
this.props.viewModel(this.props.model)
},
render:  function  ()  {
return  (
<div  className="blog-­post">
<InputWithLabel model={this.props.model}  label="Title"  name="title"  type="text"/>
<InputWithLabel model={this.props.model}  label="Body"  name="content"  type="textarea"/>
<div  className="form-­field">
<button  onClick={this.saveModel}>Save</button>
</div>
</div>
);;
}
});;
Globalcode	
  – Open4education
input_with_label.js.jsx
var InputWithLabel = React.createClass({
handleChange: function(event) {
this.props.model.set(this.props.name,event.target.value)
},
render: function() {
return <div className="form-field">
<label htmlFor={this.props.name}>{this.props.label}</label>
<div>
<input id={this.props.name} type={this.props.type} name={this.props.name} ref="input"
onChange={this.handleChange} value={this.props.model.get(this.props.name)}/>
</div>
</div>;
}
});
Globalcode	
  – Open4education
Globalcode	
  – Open4education
indexação?  performance?
renderização  no  servidor:
<%=  react_component('Layout',  {collection:  
@users},  {prerender:  true})  %>
components.js
//=  require  underscore
//=  require  backbone
//=  require_tree  ./models
//=  require_tree  ./collections
//=  require_tree  ./components
Globalcode	
  – Open4education
Mas  é  só  isto?
React-­router
Backbone.Router
Flux  -­ arquitetura  JS  usada  pelo  Facebook
Globalcode	
  – Open4education

Mais conteúdo relacionado

PDF
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
PDF
React Native na globo.com
PDF
Curso de ReactJS
PDF
Mean Stack
PDF
Curso de Grails
PDF
React + Flux (Alt)
PDF
Construindo APIs RESTful com Spring
PDF
Web Offline
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
React Native na globo.com
Curso de ReactJS
Mean Stack
Curso de Grails
React + Flux (Alt)
Construindo APIs RESTful com Spring
Web Offline

Mais procurados (20)

PDF
Oficina groovy grails - infoway
ODP
Grails: O Java em Alta Produtividade
ODP
Groovy grails
PDF
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
PDF
Começando com Zend Framework 2
PDF
Java Web 3 - Servlets e JSP 1
PDF
Angular js
PPT
Servlets e jsp
PDF
Zend Framework 1.11
PDF
Desenvolvimento para a Web com CakePHP
PDF
Beyond Ruby with NodeJS - RubyConf Brasil 2010
PDF
Java Web 2 - Ferramentas e configuração
PDF
Introdução ao vraptor
PPTX
PDF
Mini curso: Ionic Framework
PPT
Desenvolvimento web em java com JSP e Servlets
PPTX
Grails
PDF
React - Introdução
PPT
Rapida apresentacao sobre o Grails
PDF
Desenvolvimento Front end (AngularJS e Bootstrap)
Oficina groovy grails - infoway
Grails: O Java em Alta Produtividade
Groovy grails
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
Começando com Zend Framework 2
Java Web 3 - Servlets e JSP 1
Angular js
Servlets e jsp
Zend Framework 1.11
Desenvolvimento para a Web com CakePHP
Beyond Ruby with NodeJS - RubyConf Brasil 2010
Java Web 2 - Ferramentas e configuração
Introdução ao vraptor
Mini curso: Ionic Framework
Desenvolvimento web em java com JSP e Servlets
Grails
React - Introdução
Rapida apresentacao sobre o Grails
Desenvolvimento Front end (AngularJS e Bootstrap)
Anúncio

Semelhante a TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS (20)

PDF
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
PDF
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
PDF
Rails API com GraphQL
PDF
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
PDF
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
PDF
React nos Trilhos
PDF
Começando com React.js
PDF
Palestra JavaCE - FrontEnd
PDF
435142330-Guia-Completo-React-Js.pdf
PPTX
ASP.NET vNext no .NET Architects Days 2014
PDF
Restful APIs com Spring 3
PPTX
Introdução ao NodeJS
PDF
From Zero to App - Usando React e Firebase
PDF
Curso de Ruby on Rails - Aula 01
KEY
Palestra Fatec
PDF
Vacinando mais de 200 mil pessoas com ReactJS e GraphQL
PDF
Transformando um legado front-end em uma SPA com React
PDF
Kete Rufino e Christiano Milfont - Transformando um front-end legado em uma R...
PDF
React js
PDF
TDC2018SP | Trilha Mobile - Learn once, code anywhere
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
Rails API com GraphQL
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
Introduzindo StimulusJS: o novo Framework JavaScript para Ruby On Rails.
React nos Trilhos
Começando com React.js
Palestra JavaCE - FrontEnd
435142330-Guia-Completo-React-Js.pdf
ASP.NET vNext no .NET Architects Days 2014
Restful APIs com Spring 3
Introdução ao NodeJS
From Zero to App - Usando React e Firebase
Curso de Ruby on Rails - Aula 01
Palestra Fatec
Vacinando mais de 200 mil pessoas com ReactJS e GraphQL
Transformando um legado front-end em uma SPA com React
Kete Rufino e Christiano Milfont - Transformando um front-end legado em uma R...
React js
TDC2018SP | Trilha Mobile - Learn once, code anywhere
Anúncio

Mais de Rodrigo Urubatan (20)

PPTX
Ruby code smells
PPTX
Data science in ruby is it possible? is it fast? should we use it?
PDF
Data science in ruby, is it possible? is it fast? should we use it?
PPTX
2018 the conf put git to work - increase the quality of your rails project...
PPTX
2018 RubyHACK: put git to work - increase the quality of your rails project...
PDF
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
PDF
Your first game with unity3d framework
PDF
Tdc Floripa 2017 - 8 falácias da programação distribuída
PPTX
Rubyconf2016 - Solving communication problems in distributed teams with BDD
PDF
resolvendo problemas de comunicação em equipes distribuídas com bdd
PDF
vantagens e desvantagens de trabalhar remoto
PDF
Using BDD to Solve communication problems
PDF
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
PDF
Ruby para programadores java
PPTX
Treinamento html5, css e java script apresentado na HP
PPTX
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
PPTX
Mini curso rails 3
PPT
Aplicações Hibridas com Phonegap e HTML5
PPTX
Git presentation to some coworkers some time ago
PDF
Intrudução ao Behavior Driven Development (BDD) com Ruby on Rails
Ruby code smells
Data science in ruby is it possible? is it fast? should we use it?
Data science in ruby, is it possible? is it fast? should we use it?
2018 the conf put git to work - increase the quality of your rails project...
2018 RubyHACK: put git to work - increase the quality of your rails project...
TDC2017 - POA - Aprendendo a usar Xamarin para desenvolver aplicações moveis ...
Your first game with unity3d framework
Tdc Floripa 2017 - 8 falácias da programação distribuída
Rubyconf2016 - Solving communication problems in distributed teams with BDD
resolvendo problemas de comunicação em equipes distribuídas com bdd
vantagens e desvantagens de trabalhar remoto
Using BDD to Solve communication problems
Full Text Search com Solr, MySQL Full text e PostgreSQL Full Text
Ruby para programadores java
Treinamento html5, css e java script apresentado na HP
Ruby on rails impressione a você mesmo, seu chefe e seu cliente
Mini curso rails 3
Aplicações Hibridas com Phonegap e HTML5
Git presentation to some coworkers some time ago
Intrudução ao Behavior Driven Development (BDD) com Ruby on Rails

Último (20)

PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PPTX
Aula sobre banco de dados com firebase db
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PPTX
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PDF
Processos na gestão de transportes, TM100 Col18
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Aula sobre banco de dados com firebase db
Curso de Java 9 - (Threads) Multitarefas.pptx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
Apple Pippin Uma breve introdução. - David Glotz
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Aula 18 - Manipulacao De Arquivos python
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Custos e liquidação no SAP Transportation Management, TM130 Col18
COBITxITIL-Entenda as diferença em uso governança TI
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Processos na gestão de transportes, TM100 Col18

TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS

  • 1. Globalcode  – Open4education Interfaces  ricas  com  Rails  e  React.JS Rodrigo  Urubatan @urubatan
  • 2. Globalcode  – Open4education Quem? Programador  desde  1997 Trabalha  com  Ruby  na  Brightwire Escreveu  "Ruby  On  Rails:  Desenvolvimento  fácil  e  Rápido  de   aplicações  web” Já  trabalhou  com  diversas  linguagens  (C,  C++,  Delphi,  PHP,   ASP,  ColdFusion,  VisualBasic,  C#,  Python,  Ruby,  Assembly,   …) Apaixonado  por  Agile  e  atualmente  por  trabalho  remoto Patinador,  Corredor,  Ciclista  e  agora  resolveu  aprender  Karate   :D Pai  de  um  Guri  de  6  anos http://urubatan.com.br -­ Anda  meio  abandonado  mas  vai  voltar http://sobrecodigo.com -­ idem
  • 3. Globalcode  – Open4education Objetivo Usar  o  Rails  como  backend  da  aplicação Toda  a  interação  com  o  usuário  será  implementada   no  cliente Validações  e  regras  de  negócio  serão   implementadas  no  servidor (sim,  eu  poderia  usar  Sinatra  mas  sou  preguiçoso)
  • 4. Globalcode  – Open4education Cuidado! Nesta  palestra  vamos  falar  de  uma  SPA  (Single   Page  Application) Isto  tem  vantagens  e  desvantagens Melhora  muito  a  interação  com  o  usuário  sem   duplicação  de  código,  já  que  o  código  de   renderização  fica  todo  no  JS Piora  muito  a  indexação  da  sua  aplicação  por   buscadores  (adeus  SEO  -­ ou  não…)
  • 5. Globalcode  – Open4education O  que,  quando,  onde  e  por   que? Muitas  aplicações  hoje  em  dia  exigem  um  nível  alto   de  interação  com  o  usuário Implementar  isto  usando  bibliotecas  mais  baixo   nível  é  muito  fácil  de  causar  uma  grande   confusão  do  código  (PHP  alguem?) Componentização  evita  duplicação  de  código  e   facilita  a  organização
  • 6. Globalcode  – Open4education Por que rails? Eu gosto :P
  • 7. Globalcode  – Open4education Por que React.js? JSX!!!!!! Unir o  código  Javascript  e  o  Código  HTML  de   cada  componente   Facilidade  de  manutenção   Facilidade  de  organização   Mantem  o  CSS  separado  de  propósito,  CSS  é   mais  especifico  de  aplicação  do  que   componente  (pode  se  usar  imports  SASS  se   necessário)  
  • 8. Globalcode  – Open4education Por que React.js? Virtual  DOM Fácil  de  testar  em  uma  pequena  parte  de  uma  tela   Renderização  reativa   Componentes  stateful   Comunicação  entre  componentes  via  propriedades  
  • 9. Globalcode  – Open4education Mãos  a  obra!  (O  blog  mais feio do  mundo!)
  • 10. Globalcode  – Open4education Criando  a  aplicação Uma  aplicação  padrão  Rails  (rails  new  …) Gemfile  updates gem 'backbone-on-rails' gem 'react-rails', github: 'reactjs/react-rails', ref: 'master' Environment  update  (development.rb  para   começar) config.react.variant = :development config.react.addons = true # defaults to false config.react.server_renderer = React::ServerRendering::SprocketsRenderer bundle  install rails  g  react:install
  • 11. Globalcode  – Open4education Componentes Componentes  javascript  vão  ficar  em   app/assets/javascript/components Backbone.js  vai  facilitar  a  comunicação   cliente/servidor arquivos  .js.jsx  tem  uma  facilidade  extra,  são   compilados  pelo  react-­rails  via  asset  pipeline  e   permitem  adicionar  HTML  inline  
  • 12. Globalcode  – Open4education Cadastrando  um  Post rails  g  scaffold  post  title:string slug:text content:text Apagar todas as  views  do  post  exceto index.html.erb
  • 13. Globalcode  – Open4education Alterações  no  controller Fazer  todos  os  métodos  retornarem  json Remover  edit,  new  e  show Apagar  todo  o  código  de  index.html.erb  e   mudar  para: <%=  react_component('Blog',  {collection:   @posts,  item:  @post})  %>
  • 14. Globalcode  – Open4education Agora  mãos  a  obra já  temos  uma  “API"  em  Rails,  poderíamos  ter  o   código  em  Sinatra  que  seria  mais  leve,  mas  eu   gosto  do  asset  pipeline  e  assim  fica  mais  fácil  para   um  iniciante Falta  criar  os  componentes  backbone  para  acessar   o  backend Criar  os  componentes  react  para  a  UI
  • 15. Globalcode  – Open4education backbone.js app/assets/javascripts/collections/posts.js var Posts  =  Backbone.Collection.extend({ model:  Post, url:  '/posts' });; app/assets/jaascripts/models/post.js var Post  =  Backbone.Model.extend({ });;
  • 16. Globalcode  – Open4education blog.js.jsx var Blog  =  React.createClass({ ….. render:  function  ()  { if(this.state.editing)   { return  (<div> <div  id="blogList"> <PostList collection={this.state.collection}   viewModel={this.viewModel}   newModel={this.newModel}/> </div> <div  id="blogPost"> <PostForm collection={this.state.collection}   model={this.state.model}   viewModel={this.viewModel}/> </div> </div>);; }else{ return  (<div> <div  id="blogList"> <PostList collection={this.state.collection}   viewModel={this.viewModel}   newModel={this.newModel}/> </div> <div  id="blogPost"> <PostView model={this.state.model}   editModel={this.editModel}/> </div> </div>);; } } });;
  • 17. Globalcode  – Open4education post_list.js.jsx var PostList =  React.createClass({ …. render:  function  ()  { var users  =  this.props.collection.map(function  (model)  { var viewModel =  function  ()  { this.props.viewModel(model);; };; return  ( <tr key={model.get("id")}> <td><a  href="#"  onClick={viewModel.bind(this)}>{model.get("title")}</a></td> <td>{new  Date(model.get("created_at")).toDateString()}</td> </tr> );; }.bind(this));; return  ( <div> <table  className="post-­list"> <thead> <tr> <th>Post</th> <th>Published</th> </tr> </thead> <tbody> {users} </tbody> </table> <hr/> <a  href="#"  onClick={this.props.newModel}>Create  post</a> </div> );; } });;
  • 18. Globalcode  – Open4education post_view.js.jsx var PostView =  React.createClass({ editModel:  function  ()  { this.props.editModel(this.props.model);; }, render:  function  ()  { var innerLines =  null;; if(this.props.model.get("content"))   { innerLines=_.map(this.props.model.get("content").split("n"),   function  (txt,  idx)  { return  <p  key={idx}>{txt}</p> });; } return  ( <div  className="blog-­post"> <h1><a   href={this.props.model.get("slug")}>{this.props.model.get("title")}</a></h1> <div  className="post-­body"> {innerLines} </div> <hr/> <a  href="#"  onClick={this.editModel}>Edit  post</a> </div> );; } });;
  • 19. Globalcode  – Open4education post_form.js.jsx var PostForm =  React.createClass({ saveModel:  function  ()  { if  (this.props.model.get("id"))  { this.props.model.save();; }  else  { this.props.collection.create(this.props.model);; } this.props.viewModel(this.props.model) }, render:  function  ()  { return  ( <div  className="blog-­post"> <InputWithLabel model={this.props.model}  label="Title"  name="title"  type="text"/> <InputWithLabel model={this.props.model}  label="Body"  name="content"  type="textarea"/> <div  className="form-­field"> <button  onClick={this.saveModel}>Save</button> </div> </div> );; } });;
  • 20. Globalcode  – Open4education input_with_label.js.jsx var InputWithLabel = React.createClass({ handleChange: function(event) { this.props.model.set(this.props.name,event.target.value) }, render: function() { return <div className="form-field"> <label htmlFor={this.props.name}>{this.props.label}</label> <div> <input id={this.props.name} type={this.props.type} name={this.props.name} ref="input" onChange={this.handleChange} value={this.props.model.get(this.props.name)}/> </div> </div>; } });
  • 22. Globalcode  – Open4education indexação?  performance? renderização  no  servidor: <%=  react_component('Layout',  {collection:   @users},  {prerender:  true})  %> components.js //=  require  underscore //=  require  backbone //=  require_tree  ./models //=  require_tree  ./collections //=  require_tree  ./components
  • 23. Globalcode  – Open4education Mas  é  só  isto? React-­router Backbone.Router Flux  -­ arquitetura  JS  usada  pelo  Facebook