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.
UI • 130KB v0.12.2 (minificada) • Desarrollada por Facebook • Utilizada internamente algunos años, hecha Open Source en 2013 • http://facebook.github.io/react/
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
• 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)
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:
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
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);
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);
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> ); } });
Stock(); // add items to stock int numberOfItems = stock.items.size(); class Stock { Set<Item> items; int numberOfItems; // extra state, extra complexity }
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
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
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
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
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™
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