Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducción a React

Introducción a React

React hace que crear interfaces de usuario dinámicas sea hoy mas fácil (y divertido) que nunca, no podía desaprovechar la oportunidad de dar una charla a mis compañeros y explicarles todas sus bondades.

jlpiedrahita

March 15, 2015
Tweet

Other Decks in Programming

Transcript

  1. ¿Que es React? • Librería Javascript para la creación de

    UI • 130KB v0.12.2 (minificada) • Desarrollada por Facebook • Utilizada internamente algunos años, hecha Open Source en 2013 • http://facebook.github.io/react/
  2. Agility.jsɾAngularJSɾAria Templates ɾBackbone.jsɾBatman.js BoltɾCanJS ɾChaplin + BrunchɾClosureɾcujo.jsɾDart DerbyɾdermisɾDijonɾDojoɾDUELɾEmber.jsɾEpitome Ext.jsɾFunnyface.jsɾGWTɾKendo UIɾKnockback.js

    KnockoutJSɾMaria ɾMarionetteɾMeteorɾMontageɾOlives PlastronJSɾPureMVCɾrAppid.jsɾSammy.jsɾSerenade.js SocketStremɾsoma.js ɾSpineɾStrapesɾThoraxɾYUI ¿Una más?
  3. ¿Por qué React? • No plantillas: se adopta el concepto

    de componente! • Componentes: encapsulados, componibles, reusables! • Declarativos: declaras como debe lucir la UI, React se encarga de aplicar los cambios necesarios cuando los datos que esta representa cambian • Ultra eficiente: solo se realizan las modificaciones del DOM estrictamente necesarias • No bindings: flujo unidireccional de los datos • Simple: ej. solo un método necesario para definir un componente
  4. Replanteando las buenas practicas • HTML incluido en código Javascript

    • Aprovecha todo el poder de Javascript y no un pseudo-lenguaje de plantillas • Separación de responsabilidades por componentes, no por tecnologías (HTML, Javascript, CSS, etc)
  5. Plantilla HTML <!DOCTYPE html> <html> <head> <script src="http://fb.me/react-0.12.2.min.js"></script> </head> <body>

    <script type="text/javascript"> // React code goes here </script> </body> </html>
  6. API ! 1. Métodos objeto global React 2. Métodos en

    ReactComponent 3. Metodos a implementar al definir un componente
  7. API ! 1. Métodos objeto global React 2. Métodos en

    ReactComponent 3. Metodos a implementar al definir un componente
  8. API • Definir componente: ! ReactClass React.createClass(object specification) var HelloComponent

    = React.createClass({ render: function () { return null; // TODO } });
  9. API • Crear un elemento: ! ReactElement React.createElement( string/ReactClass type,

    [object props], [children ...] ) var HelloComponent = React.createClass({ render: function () { return React.createElement("div", null, "Hello React!"); } });
  10. API a abbr address area article aside audio b base

    bdi bdo big blockquote body br button canvas caption cite code col colgroup data datalist dd del details dfn dialog div dl dt em embed fieldset figcaption figure footer form h1 h2 h3 h4 h5 h6 head header hr html i iframe img input ins kbd keygen label legend li link main map mark menu menuitem meta meter nav noscript object ol optgroup option output p param picture pre progress q rp rt ruby s samp script section select small source span strong style sub summary sup table tbody td textarea tfoot th thead time title tr track u ul var video wbr • Etiquetas soportadas:
  11. API • Crear un elemento (factoria): ! ReactElement React.DOM.[type]( [object

    props], [children ...] ) var HelloComponent = React.createClass({ render: function () { return React.DOM.div(null, "Hello React!"); } });
  12. API • Presentar un componente: ! React.render( ReactElement element, DOMElement

    container, [function callback] ) var HelloComponent = React.createClass({ render: function () { return React.createElement("div", null, "Hello React!"); } }); React.render(React.createElement(HelloComponent), document.body);
  13. JSX • HTML (casi…) en código Javascript • Conveniente para

    crear componentes (XML expresa mejor estructuras en árbol) • Transformación “in-browser” o como preprocesado (recomendado para producción) • Live JSX Compiler: http://facebook.github.io/react/jsx-compiler.html • Opcional
  14. var HelloComponent = React.createClass({ render: function () { return React.createElement("div",

    null, "Hello React!"); } }); ! React.render(React.createElement(HelloComponent), document.body); No JSX
  15. var HelloComponent = React.createClass({ render: function () { return <div>Hello

    React!</div>; } }); ! React.render(<HelloComponent/>, document.body); JSX var HelloComponent = React.createClass({ render: function () { return React.createElement("div", null, "Hello React!"); } }); ! React.render(React.createElement(HelloComponent), document.body); No JSX
  16. var HelloComponent = React.createClass({ render: function () { return <div>Hello

    React!</div>; } }); ! React.render(<HelloComponent/>, document.body); JSX var HelloComponent = React.createClass({ render: function () { return React.createElement("div", null, "Hello React!"); } }); ! React.render(React.createElement(HelloComponent), document.body); No JSX
  17. Transformación JSX “In-browser” <!DOCTYPE html> <html> <head> <script src="http://fb.me/react-0.12.2.min.js"></script> <script

    src="http://fb.me/JSXTransformer-0.12.2.js"></script> </head> <body> <script type="text/jsx"> // React + JSX code goes here </script> </body> </html>
  18. this.props • Forma de pasar datos a un componente •

    Similares a los argumentos de un constructor • Inmutables var HelloComponent = React.createClass({ render: function () { return <div>Hello {this.props.name}!</div>; } }); ! React.render(<HelloComponent name="Mobile"/>, document.body);
  19. this.props • Forma de pasar datos a un componente •

    Similares a los argumentos de un constructor • Inmutables var HelloComponent = React.createClass({ render: function () { return <div>Hello {this.props.name}!</div>; } }); ! React.render(<HelloComponent name="Mobile"/>, document.body);
  20. this.props • Valores por defecto propiedades object getDefaultProps() • Validación

    tipos propiedades object propTypes var HelloComponent = React.createClass({ getDefaultProps: function() { return { name: "Vueling" }; }, propTypes: { name: React.PropTypes.string }, … });
  21. Componer componentes • Componentes se pueden anidar de la misma

    manera en que lo hacen los tags en xml/html: ! ! ! ! • Permitiendo crear componentes mas complejos a partir de otros componentes var ComplexComponent = React.createClass({ render: function() { return ( <div> <SubComponentA/> <SubComponentB/> <SubComponentc/> </div> ); } });
  22. var ProfilePic = React.createClass({ render: function() { return ( <img

    src={'http://graph.facebook.com/' + this.props.username + '/picture'} /> ); } }); ! var ProfileLink = React.createClass({ render: function() { return ( <a href={'http://www.facebook.com/' + this.props.username}> {this.props.username} </a> ); } }); ! var Avatar = React.createClass({ render: function() { return ( <div> <ProfilePic username={this.props.username} /> <ProfileLink username={this.props.username} /> </div> ); } }); ! React.render(<Avatar username=“jlpiedrahita" />, document.getElementById('example'));
  23. Estado • State is the root of all programming evil

    • Mas estado == mas complejidad • Los programadores somos malos lidiando con estado
  24. Por el amor de dios, NO! class Stock { Set<Item>

    items; int numberOfItems; // extra state, extra complexity }
  25. Por el amor de dios, NO! Stock stock = new

    Stock(); // add items to stock int numberOfItems = stock.items.size(); class Stock { Set<Item> items; int numberOfItems; // extra state, extra complexity }
  26. this.state • UI dinámicas representan estado que cambia en el

    tiempo • Esto introduce un problema: sincronización • OK… BINDINGS!!! • React elimina la necesidad de bindings • Declarativo: React hace el trabajo duro: tratar el estado de la UI • Reactivo: automáticamente se actualiza la UI ante cambios en el estado
  27. var numbers = [1,2,3,4,5] var total = 0 ! for(var

    i = 1; i < numbers.length; i++) { total += numbers[i] } console.log(total) // 15 var numbers = [1,2,3,4,5] ! var total = numbers.reduce(function(sum, n) { return sum + n }); console.log(total) // 15
  28. var numbers = [1,2,3,4,5] var total = 0 ! for(var

    i = 1; i < numbers.length; i++) { total += numbers[i] } console.log(total) // 15 var numbers = [1,2,3,4,5] ! var total = numbers.reduce(function(sum, n) { return sum + n }); console.log(total) // 15 Declarative way Imperative way
  29. SQL, declarative before it was cool SELECT * from dogs

    INNER JOIN owners WHERE dogs.owner_id = owners.id
  30. //dogs = [{name: 'Fido', owner_id: 1}, {...}, ... ] //owners

    = [{id: 1, name: 'Bob'}, {...}, ...] ! var dogsWithOwners = [] var dog, owner ! for(var di=0; di < dogs.length; di++) { dog = dogs[di] ! for(var oi=0; oi < owners.length; oi++) { owner = owners[oi] if (owner && dog.owner_id == owner.id) { dogsWithOwners.push({ dog: dog, owner: owner }) } }} }
  31. UI Declarativas • render() especifica como debe lucir el componente

    en todo momento • setState() muta el estado del componente y genera una actualización completa del componente (nueva llamada a render()) • boolean shouldComponentUpdate() Previene actualización del componente
  32. var CounterComponent = React.createClass({ getInitialState: function() { return { count:

    0 }; }, increment: function() { this.setState({ count: this.state.count + 1 }); }, render: function () { return ( <div className="counter"> <h1>{this.state.count}</h1> <button onClick={this.increment}>Incrementar</button> </div> ); } });
  33. Reconciliación • Modificar el DOM es de las operaciones mas

    costosas en JS • React utiliza la representación actual (DOM Virtual), la compara contra la nueva (ultima llamada a render()) y calcula el menor numero de modificaciones del DOM necesarias para que el componente represente correctamente el nuevo estado • En términos de React esto se conoce como reconciliación • Este proceso esta muy optimizado (O(n)), lo que hace que la actualización del componente sea hiper-ultra-mega-maxi-rapida™
  34. Ciclo de vida de un componente React • Mounting componentWillMount()

    componentDidMount() componentWillUnmount() ! • Updating componentWillReceiveProps(object nextProps) boolean shouldComponentUpdate(object nextProps, object nextState) componentWillUpdate(object nextProps, object nextState) componentDidUpdate(object prevProps, object prevState)
  35. var RefsDemoComponent = React.createClass({ ! handleClick: function () { alert(this.refs.message.getDOMNode().value);

    }, render: function () { return ( <div> <input ref="message"/> <button onClick={this.handleClick}>Alert!</button> </div> ); } }); ! React.render(<RefsDemoComponent/>, document.body); this.refs • Acceso a los nodos fuera de render()
  36. this.refs • Acceso a los nodos fuera de render() var

    RefsDemoComponent = React.createClass({ ! handleClick: function () { alert(this.refs.message.getDOMNode().value); }, render: function () { return ( <div> <input ref="message"/> <button onClick={this.handleClick}>Alert!</button> </div> ); } }); ! React.render(<RefsDemoComponent/>, document.body);
  37. Recap • Librería Javascript para la creación de Interfaces de

    Usuario, V en MVC. • Separación de responsabilidades por componentes, no tecnologías • Componentes: encapsulados, componibles, faciles de mantener • Declarativos: como quiero que luzca, React se encarga del resto • Reactiva: sincronización automática de la UI cuando el estado que representan cambia
  38. React Native • Desarrollo de aplicaciones nativas (iOS/Android) con React

    • Mismo modelo que web • Componentes predefinidos que se corresponden con los nativos • "Learn once, write anywhere"
  39. “I say with confidence as a former UIKit author: React's

    model for the UI layer is vastly better than UIKit's. React Native is a *huge* deal.” - Andy Matuschak Ex-ingeniero Apple, UIKit Team
  40. Más… • FLUX (http://facebook.github.io/flux/): arquitectura para aplicaciones React • Generación

    de html en el servidor React.renderToString(): componentes compatibles con SEO • Debug: mensajes de error precisos • Testing: React.addons.TestUtil