{
    "componentChunkName": "component---node-modules-gatsby-theme-try-ghost-src-templates-post-js",
    "path": "/react-js-i-cambios-en-un-mismo-componente/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__5a338158333e0f134c248f1b","title":"React Superhero (I): Cambios en un mismo componente","slug":"react-js-i-cambios-en-un-mismo-componente","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Captain-Atom.jpg","excerpt":"Vamos a empezar a ver donde está realmente la gracia de esta librería, lo que\nvimos en el post de introducción bien lo podíamos tener con un poco de código\nHTML de toda la vida. Ahora vamos a darle algo de dinamismo a nuestro código.\nTeníamos este código al final de nuestro primer post:\n\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>Hello World</title>\n    <!-- Libreria para trabajar con React -->\n    <script src=\"https://unpkg.com/react@latest/dist/react.js\"></script>\n","custom_excerpt":null,"visibility":"public","created_at_pretty":"29 Jul 2017","published_at_pretty":"14 Aug 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-29T19:26:15.000+02:00","published_at":"2017-08-14T13:11:00.000+02:00","updated_at":"2017-10-11T13:47:52.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null},"tags":[{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null}],"plaintext":"Vamos a empezar a ver donde está realmente la gracia de esta librería, lo que\nvimos en el post de introducción bien lo podíamos tener con un poco de código\nHTML de toda la vida. Ahora vamos a darle algo de dinamismo a nuestro código.\nTeníamos este código al final de nuestro primer post:\n\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>Hello World</title>\n    <!-- Libreria para trabajar con React -->\n    <script src=\"https://unpkg.com/react@latest/dist/react.js\"></script>\n    <!-- Libreria de react para trabajar con el Dom-->\n    <script src=\"https://unpkg.com/react-dom@latest/dist/react-dom.js\"></script>\n    <!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no \n    funcione en todos -->\n    <script src=\"https://unpkg.com/babel-standalone@6.15.0/babel.min.js\"></script>\n    <script type=\"text/babel\">\n\n        class SuperComponente extends React.Component{\n          render(){\n            return (\n              <div>\n                <h2>Hello with React</h2>\n                <MiSegundoComponente/>\n              </div>\n            );\n          }\n        }\n\n        class MiSegundoComponente extends React.Component{\n          render(){\n            return (\n              <h2>REACT is in the HOUSE...YEAH!!!!</h2>            \n            )\n          }\n        }\n\n        ReactDOM.render(\n          <SuperComponente/>,\n          document.getElementById('root')\n        );\n\n      </script>\n   \n  </head>\n  <body>\n      <div id=\"root\"></div>\n  </body>\n</html>\n\n\nBien tenemos 2 componentes y los renderizamos dentro del body en nuestro div con\nid root, pues bien, vamos a añadir/modificar lo siguiente en nuestro \nMiSegundoComponente:\n\nclass MiSegundoComponente extends React.Component{\n    constructor(){\n      super();\n      this.name = {\n         nombre: \"Your Super Name\"\n      }\n    }\n    render(){\n       return (\n         <div>\n           <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n           <h4> { this.name.nombre } </h4>\n         </div>\n        )\n     }\n}\n\n\nLo que hacemos es crear un método constructor (OJO es palabra reservada no es\nque lo haya puesto yo), por el momento siempre llamamos a super (esencial para\nque se ejecute), y hacemos que nuestra instancia del componente (nuestro amigo \nthis) tenga una propiedad name, que es un objeto de clave=valor en este caso con\nuna key nombre con un texto. Asimismo en la parte de render entre {}, llamamos a \nthis, es decir, a la instancia de nuestro componente, pasándole la propiedad y\nel key que hemos creado. ESTO SERIA PROPIO DE JSX, este superpoder nos permite\nañadir JS en nuestro código HTML. Si ahora ejecutamos esto:\n\nVemos como nos añade el contenido de la key nombre, \"pues muy bien, y esto pa\nque cansino??\" diréis...vale realmente Your superName es un placeholder, la idea\nes que ese texto cambie en algún momento.\n\nPara ello necesitamos \"escuchar algo en algún sitio\" y hacérselo saber a nuestra\npropiedad nombre. Pero... ¿como hacemos esto? Muy fácil, vamos por partes,\nprimero como \"escuchamos\":\n\n//Añadimos un input con la propiedad onChange\n<input onChange={}/>\n<h4> { this.name.nombre } </h4>\n\n\nY esto que hace, básicamente envía los eventos de cambio de ese elemento a lo\nque tengamos dentro de {} y ¿que debemos poner dentro? pues como es costumbre un\nmétodo que creemos a través de nuestra instancia(this):\n\n//Fuera de render\ngetName(input){\n    console.log(input)\n}\n\n//Dentro de render\n<input onChange={this.getName}></input>\n<h4> { this.name.nombre } </h4>\n\n\nComo véis tenemos un método getName que recibe algo por parámetro, y le pasamos\ndentro del onChange, nuestra instancia llamando al método getName. De momento le\nponemos un console.log para que podamos ver que es lo que nos pasa cada vez que\nescribimos. Si guardamos y abrimos nuestro index.html, cada vez que escribamos\nalgo en nuestro input, recibiremos algo del estilo a esto:\n\nEs un objeto con nombre Proxy y mogollón de información. Es un estilo de\nelemento clásico de eventos(digo estilo), pero claro no es lo que realmente\nbuscamos, como conseguimos el contenido de nuestro input:\n\ngetName(input){\n    console.log(input.target.value)\n}\n\n\nEsto lo habréis tenido que ver alguna vez ya, simplemente buscamos el value del \ntarget de nuestro elemento, y ahora nuesto console.log nos ofrece, esta\ninformación según escribimos:\n\nBien ya tenemos lo que necesitamos, ahora completemos la función para que nos\nmodifique nuestro placeholder.\n\ngetName(input){\n  this.setState(this.name = {nombre: input.target.value});\n}\n\n\nPara modificar \"el estado\" de un objeto o elemento del DOM tenemos el método o\npropiedad setState, el cual modificaría solo lo que le pasemos entre ().\nTeóricamente sería algo como esto, pero lo habéis probado? Si lo probáis veréis\nque no funciona,nos indica que this es undefined\n\npero.....¿por qué? Básicamente porque this no está disponible como propiedad u\nobjeto de las funciones o métodos que nosotros mismos creamos, para hacer que\nfuncione es necesario enlazar(bind) el this con el contexto de ejecución. Para\nello solo seria necesario hacer el siguiente cambio:\n\n<div>\n    <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n    <input onChange={this.getName.bind(this)}></input>\n    <h4> { this.name.nombre } </h4>\n</div>\n\n\nComo veis dentro de nuestro método render le hemos añadido bind(this), es decir,\nenlazame el this de render con mi método getName et voilá:\n\n\nRealmente es todo muy sencillo ¿verdad?\nAntes de terminar con este post me faltaría comentar otro concepto, fijaros en\nesta parte del código que casi no hemos comentado:\n\nthis.setState(this.name = {nombre: input.target.value});\n\n\nHemos hablado de la propiedad setState pero no mucho de lo que hay dentro, si\nmiráis un poco el código esto es prácticamente lo mismo que tenemos dentro de\nnuestro método constructor(es un poco feo no?). Pues bien realmente la propiedad\ntiene un motivo por el que se llama setState() y es porque el método constructor \nya está preparado para gestionar los cambios de estado, si cambiamos el nombre\nde la propiedad y en lugar de name ponemos state:\n\nconstructor(){\n  super();\n  this.state = {\n     nombre: \"Your Super Name\"\n  }\n}\n\n\nVeamos como tendría que quedar nuestro método getName:\n\ngetName(input){\n  this.setState({nombre: input.target.value});\n}\n\n\nY que no se nos olvide cambiar nuestro placeholder:\n\n<input onChange={this.getName.bind(this)}></input>\n<h4> { this.state.nombre } </h4>\n\n\nSi lo probáis veréis que todo funciona correctamente y hemos quitado alguna cosa\nque no quedaba del todo bien, aún así puede que algún momento queramos usarlo\npor lo que solo tenemos que recordar que si en el constructor no lo hacemos todo\ndentro del this.state, a la hora de usarlo es necesario indicar la estructura\ncompleta del objeto o propiedad que queremos cambiar.\nEn el próximo post veremos como comunicarnos entre componentes y alguna cosa\nmás. Nos vemooooooos","html":"<!--kg-card-begin: markdown--><p>Vamos a empezar a ver donde está realmente la gracia de esta librería, lo que vimos en el post de introducción bien lo podíamos tener con un poco de código HTML de toda la vida. Ahora vamos a darle algo de dinamismo a nuestro código.<br>\nTeníamos este código al final de nuestro primer post:</p>\n<pre><code>&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n  &lt;head&gt;\n    &lt;meta charset=&quot;UTF-8&quot; /&gt;\n    &lt;title&gt;Hello World&lt;/title&gt;\n    &lt;!-- Libreria para trabajar con React --&gt;\n    &lt;script src=&quot;https://unpkg.com/react@latest/dist/react.js&quot;&gt;&lt;/script&gt;\n    &lt;!-- Libreria de react para trabajar con el Dom--&gt;\n    &lt;script src=&quot;https://unpkg.com/react-dom@latest/dist/react-dom.js&quot;&gt;&lt;/script&gt;\n    &lt;!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no \n    funcione en todos --&gt;\n    &lt;script src=&quot;https://unpkg.com/babel-standalone@6.15.0/babel.min.js&quot;&gt;&lt;/script&gt;\n    &lt;script type=&quot;text/babel&quot;&gt;\n\n        class SuperComponente extends React.Component{\n          render(){\n            return (\n              &lt;div&gt;\n                &lt;h2&gt;Hello with React&lt;/h2&gt;\n                &lt;MiSegundoComponente/&gt;\n              &lt;/div&gt;\n            );\n          }\n        }\n\n        class MiSegundoComponente extends React.Component{\n          render(){\n            return (\n              &lt;h2&gt;REACT is in the HOUSE...YEAH!!!!&lt;/h2&gt;            \n            )\n          }\n        }\n\n        ReactDOM.render(\n          &lt;SuperComponente/&gt;,\n          document.getElementById('root')\n        );\n\n      &lt;/script&gt;\n   \n  &lt;/head&gt;\n  &lt;body&gt;\n      &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;\n  &lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n<p>Bien tenemos 2 componentes y los renderizamos dentro del <strong>body</strong> en nuestro div con id <strong>root</strong>, pues bien, vamos a añadir/modificar lo siguiente en nuestro <strong>MiSegundoComponente</strong>:</p>\n<pre><code>class MiSegundoComponente extends React.Component{\n    constructor(){\n      super();\n      this.name = {\n         nombre: &quot;Your Super Name&quot;\n      }\n    }\n    render(){\n       return (\n         &lt;div&gt;\n           &lt;h2&gt;REACT is in the HOUSE...YEAH!!!!&lt;/h2&gt;\n           &lt;h4&gt; { this.name.nombre } &lt;/h4&gt;\n         &lt;/div&gt;\n        )\n     }\n}\n</code></pre>\n<p>Lo que hacemos es crear un método <strong>constructor</strong> (OJO es palabra reservada no es que lo haya puesto yo), por el momento siempre llamamos a <strong>super</strong> (esencial para que se ejecute), y hacemos que nuestra instancia del componente (nuestro amigo <strong>this</strong>) tenga una propiedad <strong>name</strong>, que es un <strong>objeto de clave=valor</strong> en este caso con una key <strong>nombre</strong> con un texto. Asimismo en la parte de render entre <strong>{}</strong>, llamamos a <strong>this</strong>, es decir, a la instancia de nuestro componente, pasándole la propiedad y el key que hemos creado. <strong>ESTO SERIA PROPIO DE JSX</strong>, este superpoder nos permite añadir JS en nuestro código HTML. Si ahora ejecutamos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.51.45.png\" alt=\"PlaceHolder name\"><br>\nVemos como nos añade el contenido de la key nombre, &quot;pues muy bien, y esto pa que cansino??&quot; diréis...vale realmente <strong>Your superName</strong> es un placeholder, la idea es que ese texto cambie en algún momento.</p>\n<p>Para ello necesitamos &quot;escuchar algo en algún sitio&quot; y hacérselo saber a nuestra propiedad nombre. Pero... ¿como hacemos esto? Muy fácil, vamos por partes, primero como &quot;escuchamos&quot;:</p>\n<pre><code>//Añadimos un input con la propiedad onChange\n&lt;input onChange={}/&gt;\n&lt;h4&gt; { this.name.nombre } &lt;/h4&gt;\n</code></pre>\n<p>Y esto que hace, básicamente envía los eventos de cambio de ese elemento a lo que tengamos dentro de <strong>{}</strong> y ¿que debemos poner dentro? pues como es costumbre un método que creemos a través de nuestra instancia(this):</p>\n<pre><code>//Fuera de render\ngetName(input){\n    console.log(input)\n}\n\n//Dentro de render\n&lt;input onChange={this.getName}&gt;&lt;/input&gt;\n&lt;h4&gt; { this.name.nombre } &lt;/h4&gt;\n</code></pre>\n<p>Como véis tenemos un método <strong>getName</strong> que recibe algo por parámetro, y le pasamos dentro del <strong>onChange</strong>, nuestra instancia llamando al método getName. De momento le ponemos un <strong>console.log</strong> para que podamos ver que es lo que nos pasa cada vez que escribimos. Si guardamos y abrimos nuestro <strong>index.html</strong>, cada vez que escribamos algo en nuestro input, recibiremos algo del estilo a esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-20.18.10.png\" alt=\"Input onChange\"><br>\nEs un objeto con nombre <strong>Proxy</strong> y mogollón de información. Es un estilo de elemento clásico de eventos(digo estilo), pero claro no es lo que realmente buscamos, como conseguimos el contenido de nuestro input:</p>\n<pre><code>getName(input){\n    console.log(input.target.value)\n}\n</code></pre>\n<p>Esto lo habréis tenido que ver alguna vez ya, simplemente buscamos el <strong>value</strong> del <strong>target</strong> de nuestro elemento, y ahora nuesto console.log nos ofrece, esta información según escribimos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-20.22.58.png\" alt=\"Input Changes\"><br>\nBien ya tenemos lo que necesitamos, ahora completemos la función para que nos modifique nuestro placeholder.</p>\n<pre><code>getName(input){\n  this.setState(this.name = {nombre: input.target.value});\n}\n</code></pre>\n<p>Para modificar &quot;el estado&quot; de un objeto o elemento del DOM tenemos el método o propiedad <strong>setState</strong>, el cual modificaría solo lo que le pasemos entre <strong>()</strong>.<br>\nTeóricamente sería algo como esto, pero lo habéis probado? Si lo probáis veréis que no funciona,nos indica que this es <strong>undefined</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-08.33.45.png\" alt=\"This undefined Error\"><br>\npero.....¿por qué? Básicamente porque <strong>this</strong> no está disponible como propiedad u objeto de las funciones o métodos que nosotros mismos creamos, para hacer que funcione es necesario <strong>enlazar(bind)</strong> el this con el contexto de ejecución. Para ello solo seria necesario hacer el siguiente cambio:</p>\n<pre><code>&lt;div&gt;\n    &lt;h2&gt;REACT is in the HOUSE...YEAH!!!!&lt;/h2&gt;\n    &lt;input onChange={this.getName.bind(this)}&gt;&lt;/input&gt;\n    &lt;h4&gt; { this.name.nombre } &lt;/h4&gt;\n&lt;/div&gt;\n</code></pre>\n<p>Como veis dentro de nuestro método <strong>render</strong> le hemos añadido <strong>bind(this)</strong>, es decir, enlazame el this de render con mi método getName et voilá:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-08.41.36.png\" alt=\"Its alive\"><br>\nRealmente es todo muy sencillo ¿verdad?<br>\nAntes de terminar con este post me faltaría comentar otro concepto, fijaros en esta parte del código que casi no hemos comentado:</p>\n<pre><code>this.setState(this.name = {nombre: input.target.value});\n</code></pre>\n<p>Hemos hablado de la propiedad <strong>setState</strong> pero no mucho de lo que hay dentro, si miráis un poco el código esto es prácticamente lo mismo que tenemos dentro de nuestro método constructor(es un poco feo no?). Pues bien realmente la propiedad tiene un motivo por el que se llama <strong>setState()</strong> y es porque el método <strong>constructor</strong> ya está preparado para gestionar <strong>los cambios de estado</strong>, si cambiamos el nombre de la propiedad y en lugar de <strong>name</strong> ponemos <strong>state</strong>:</p>\n<pre><code>constructor(){\n  super();\n  this.state = {\n     nombre: &quot;Your Super Name&quot;\n  }\n}\n</code></pre>\n<p>Veamos como tendría que quedar nuestro método <strong>getName</strong>:</p>\n<pre><code>getName(input){\n  this.setState({nombre: input.target.value});\n}\n</code></pre>\n<p>Y que no se nos olvide cambiar nuestro placeholder:</p>\n<pre><code>&lt;input onChange={this.getName.bind(this)}&gt;&lt;/input&gt;\n&lt;h4&gt; { this.state.nombre } &lt;/h4&gt;\n</code></pre>\n<p>Si lo probáis veréis que todo funciona correctamente y hemos quitado alguna cosa que no quedaba del todo bien, aún así puede que algún momento queramos usarlo por lo que solo tenemos que recordar que si en el constructor no lo hacemos todo dentro del <strong>this.state</strong>, a la hora de usarlo es necesario indicar la estructura completa del objeto o propiedad que queremos cambiar.<br>\nEn el próximo post veremos como comunicarnos entre componentes y alguna cosa más. Nos vemooooooos</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/react-js-i-cambios-en-un-mismo-componente/","canonical_url":null,"uuid":"64b73dda-8bcc-4b57-a123-304622500943","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"40","reading_time":5,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Vamos a empezar a ver donde está realmente la gracia de esta librería, lo que vimos en el post de introducción bien lo podíamos tener con un poco de código HTML de toda la vida. Ahora vamos a darle algo de dinamismo a nuestro código.<br>\nTeníamos este código al final de nuestro primer post:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;!DOCTYPE html>\n&#x3C;html>\n  &#x3C;head>\n    &#x3C;meta charset=\"UTF-8\" />\n    &#x3C;title>Hello World&#x3C;/title>\n    &#x3C;!-- Libreria para trabajar con React -->\n    &#x3C;script src=\"https://unpkg.com/react@latest/dist/react.js\">&#x3C;/script>\n    &#x3C;!-- Libreria de react para trabajar con el Dom-->\n    &#x3C;script src=\"https://unpkg.com/react-dom@latest/dist/react-dom.js\">&#x3C;/script>\n    &#x3C;!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no \n    funcione en todos -->\n    &#x3C;script src=\"https://unpkg.com/babel-standalone@6.15.0/babel.min.js\">&#x3C;/script>\n    &#x3C;script type=\"text/babel\">\n\n        class SuperComponente extends React.Component{\n          render(){\n            return (\n              &#x3C;div>\n                &#x3C;h2>Hello with React&#x3C;/h2>\n                &#x3C;MiSegundoComponente/>\n              &#x3C;/div>\n            );\n          }\n        }\n\n        class MiSegundoComponente extends React.Component{\n          render(){\n            return (\n              &#x3C;h2>REACT is in the HOUSE...YEAH!!!!&#x3C;/h2>            \n            )\n          }\n        }\n\n        ReactDOM.render(\n          &#x3C;SuperComponente/>,\n          document.getElementById('root')\n        );\n\n      &#x3C;/script>\n   \n  &#x3C;/head>\n  &#x3C;body>\n      &#x3C;div id=\"root\">&#x3C;/div>\n  &#x3C;/body>\n&#x3C;/html>\n</code></pre></div>\n<p>Bien tenemos 2 componentes y los renderizamos dentro del <strong>body</strong> en nuestro div con id <strong>root</strong>, pues bien, vamos a añadir/modificar lo siguiente en nuestro <strong>MiSegundoComponente</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class MiSegundoComponente extends React.Component{\n    constructor(){\n      super();\n      this.name = {\n         nombre: \"Your Super Name\"\n      }\n    }\n    render(){\n       return (\n         &#x3C;div>\n           &#x3C;h2>REACT is in the HOUSE...YEAH!!!!&#x3C;/h2>\n           &#x3C;h4> { this.name.nombre } &#x3C;/h4>\n         &#x3C;/div>\n        )\n     }\n}\n</code></pre></div>\n<p>Lo que hacemos es crear un método <strong>constructor</strong> (OJO es palabra reservada no es que lo haya puesto yo), por el momento siempre llamamos a <strong>super</strong> (esencial para que se ejecute), y hacemos que nuestra instancia del componente (nuestro amigo <strong>this</strong>) tenga una propiedad <strong>name</strong>, que es un <strong>objeto de clave=valor</strong> en este caso con una key <strong>nombre</strong> con un texto. Asimismo en la parte de render entre <strong>{}</strong>, llamamos a <strong>this</strong>, es decir, a la instancia de nuestro componente, pasándole la propiedad y el key que hemos creado. <strong>ESTO SERIA PROPIO DE JSX</strong>, este superpoder nos permite añadir JS en nuestro código HTML. Si ahora ejecutamos esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.51.45.png\" alt=\"PlaceHolder name\"><br>\nVemos como nos añade el contenido de la key nombre, \"pues muy bien, y esto pa que cansino??\" diréis...vale realmente <strong>Your superName</strong> es un placeholder, la idea es que ese texto cambie en algún momento.</p>\n<p>Para ello necesitamos \"escuchar algo en algún sitio\" y hacérselo saber a nuestra propiedad nombre. Pero... ¿como hacemos esto? Muy fácil, vamos por partes, primero como \"escuchamos\":</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Añadimos un input con la propiedad onChange\n&#x3C;input onChange={}/>\n&#x3C;h4> { this.name.nombre } &#x3C;/h4>\n</code></pre></div>\n<p>Y esto que hace, básicamente envía los eventos de cambio de ese elemento a lo que tengamos dentro de <strong>{}</strong> y ¿que debemos poner dentro? pues como es costumbre un método que creemos a través de nuestra instancia(this):</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Fuera de render\ngetName(input){\n    console.log(input)\n}\n\n//Dentro de render\n&#x3C;input onChange={this.getName}>&#x3C;/input>\n&#x3C;h4> { this.name.nombre } &#x3C;/h4>\n</code></pre></div>\n<p>Como véis tenemos un método <strong>getName</strong> que recibe algo por parámetro, y le pasamos dentro del <strong>onChange</strong>, nuestra instancia llamando al método getName. De momento le ponemos un <strong>console.log</strong> para que podamos ver que es lo que nos pasa cada vez que escribimos. Si guardamos y abrimos nuestro <strong>index.html</strong>, cada vez que escribamos algo en nuestro input, recibiremos algo del estilo a esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-20.18.10.png\" alt=\"Input onChange\"><br>\nEs un objeto con nombre <strong>Proxy</strong> y mogollón de información. Es un estilo de elemento clásico de eventos(digo estilo), pero claro no es lo que realmente buscamos, como conseguimos el contenido de nuestro input:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">getName(input){\n    console.log(input.target.value)\n}\n</code></pre></div>\n<p>Esto lo habréis tenido que ver alguna vez ya, simplemente buscamos el <strong>value</strong> del <strong>target</strong> de nuestro elemento, y ahora nuesto console.log nos ofrece, esta información según escribimos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-20.22.58.png\" alt=\"Input Changes\"><br>\nBien ya tenemos lo que necesitamos, ahora completemos la función para que nos modifique nuestro placeholder.</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">getName(input){\n  this.setState(this.name = {nombre: input.target.value});\n}\n</code></pre></div>\n<p>Para modificar \"el estado\" de un objeto o elemento del DOM tenemos el método o propiedad <strong>setState</strong>, el cual modificaría solo lo que le pasemos entre <strong>()</strong>.<br>\nTeóricamente sería algo como esto, pero lo habéis probado? Si lo probáis veréis que no funciona,nos indica que this es <strong>undefined</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-08.33.45.png\" alt=\"This undefined Error\"><br>\npero.....¿por qué? Básicamente porque <strong>this</strong> no está disponible como propiedad u objeto de las funciones o métodos que nosotros mismos creamos, para hacer que funcione es necesario <strong>enlazar(bind)</strong> el this con el contexto de ejecución. Para ello solo seria necesario hacer el siguiente cambio:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;div>\n    &#x3C;h2>REACT is in the HOUSE...YEAH!!!!&#x3C;/h2>\n    &#x3C;input onChange={this.getName.bind(this)}>&#x3C;/input>\n    &#x3C;h4> { this.name.nombre } &#x3C;/h4>\n&#x3C;/div>\n</code></pre></div>\n<p>Como veis dentro de nuestro método <strong>render</strong> le hemos añadido <strong>bind(this)</strong>, es decir, enlazame el this de render con mi método getName et voilá:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-08.41.36.png\" alt=\"Its alive\"><br>\nRealmente es todo muy sencillo ¿verdad?<br>\nAntes de terminar con este post me faltaría comentar otro concepto, fijaros en esta parte del código que casi no hemos comentado:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">this.setState(this.name = {nombre: input.target.value});\n</code></pre></div>\n<p>Hemos hablado de la propiedad <strong>setState</strong> pero no mucho de lo que hay dentro, si miráis un poco el código esto es prácticamente lo mismo que tenemos dentro de nuestro método constructor(es un poco feo no?). Pues bien realmente la propiedad tiene un motivo por el que se llama <strong>setState()</strong> y es porque el método <strong>constructor</strong> ya está preparado para gestionar <strong>los cambios de estado</strong>, si cambiamos el nombre de la propiedad y en lugar de <strong>name</strong> ponemos <strong>state</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">constructor(){\n  super();\n  this.state = {\n     nombre: \"Your Super Name\"\n  }\n}\n</code></pre></div>\n<p>Veamos como tendría que quedar nuestro método <strong>getName</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">getName(input){\n  this.setState({nombre: input.target.value});\n}\n</code></pre></div>\n<p>Y que no se nos olvide cambiar nuestro placeholder:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;input onChange={this.getName.bind(this)}>&#x3C;/input>\n&#x3C;h4> { this.state.nombre } &#x3C;/h4>\n</code></pre></div>\n<p>Si lo probáis veréis que todo funciona correctamente y hemos quitado alguna cosa que no quedaba del todo bien, aún así puede que algún momento queramos usarlo por lo que solo tenemos que recordar que si en el constructor no lo hacemos todo dentro del <strong>this.state</strong>, a la hora de usarlo es necesario indicar la estructura completa del objeto o propiedad que queremos cambiar.<br>\nEn el próximo post veremos como comunicarnos entre componentes y alguna cosa más. Nos vemooooooos</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a empezar a ver donde está realmente la gracia de esta librería, lo que vimos en el post de introducción bien lo podíamos tener con un poco de código HTML de toda la vida. Ahora vamos a darle algo de dinamismo a nuestro código."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nTeníamos este código al final de nuestro primer post:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>Hello World</title>\n    <!-- Libreria para trabajar con React -->\n    <script src=\"https://unpkg.com/react@latest/dist/react.js\"></script>\n    <!-- Libreria de react para trabajar con el Dom-->\n    <script src=\"https://unpkg.com/react-dom@latest/dist/react-dom.js\"></script>\n    <!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no \n    funcione en todos -->\n    <script src=\"https://unpkg.com/babel-standalone@6.15.0/babel.min.js\"></script>\n    <script type=\"text/babel\">\n\n        class SuperComponente extends React.Component{\n          render(){\n            return (\n              <div>\n                <h2>Hello with React</h2>\n                <MiSegundoComponente/>\n              </div>\n            );\n          }\n        }\n\n        class MiSegundoComponente extends React.Component{\n          render(){\n            return (\n              <h2>REACT is in the HOUSE...YEAH!!!!</h2>            \n            )\n          }\n        }\n\n        ReactDOM.render(\n          <SuperComponente/>,\n          document.getElementById('root')\n        );\n\n      </script>\n   \n  </head>\n  <body>\n      <div id=\"root\"></div>\n  </body>\n</html>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien tenemos 2 componentes y los renderizamos dentro del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"body"}]},{"type":"text","value":" en nuestro div con id "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"root"}]},{"type":"text","value":", pues bien, vamos a añadir/modificar lo siguiente en nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"MiSegundoComponente"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class MiSegundoComponente extends React.Component{\n    constructor(){\n      super();\n      this.name = {\n         nombre: \"Your Super Name\"\n      }\n    }\n    render(){\n       return (\n         <div>\n           <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n           <h4> { this.name.nombre } </h4>\n         </div>\n        )\n     }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo que hacemos es crear un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"constructor"}]},{"type":"text","value":" (OJO es palabra reservada no es que lo haya puesto yo), por el momento siempre llamamos a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"super"}]},{"type":"text","value":" (esencial para que se ejecute), y hacemos que nuestra instancia del componente (nuestro amigo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":") tenga una propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"name"}]},{"type":"text","value":", que es un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"objeto de clave=valor"}]},{"type":"text","value":" en este caso con una key "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"nombre"}]},{"type":"text","value":" con un texto. Asimismo en la parte de render entre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"{}"}]},{"type":"text","value":", llamamos a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":", es decir, a la instancia de nuestro componente, pasándole la propiedad y el key que hemos creado. "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ESTO SERIA PROPIO DE JSX"}]},{"type":"text","value":", este superpoder nos permite añadir JS en nuestro código HTML. Si ahora ejecutamos esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.51.45.png","alt":"PlaceHolder name"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVemos como nos añade el contenido de la key nombre, \"pues muy bien, y esto pa que cansino??\" diréis...vale realmente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Your superName"}]},{"type":"text","value":" es un placeholder, la idea es que ese texto cambie en algún momento."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para ello necesitamos \"escuchar algo en algún sitio\" y hacérselo saber a nuestra propiedad nombre. Pero... ¿como hacemos esto? Muy fácil, vamos por partes, primero como \"escuchamos\":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Añadimos un input con la propiedad onChange\n<input onChange={}/>\n<h4> { this.name.nombre } </h4>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y esto que hace, básicamente envía los eventos de cambio de ese elemento a lo que tengamos dentro de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"{}"}]},{"type":"text","value":" y ¿que debemos poner dentro? pues como es costumbre un método que creemos a través de nuestra instancia(this):"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Fuera de render\ngetName(input){\n    console.log(input)\n}\n\n//Dentro de render\n<input onChange={this.getName}></input>\n<h4> { this.name.nombre } </h4>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis tenemos un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"getName"}]},{"type":"text","value":" que recibe algo por parámetro, y le pasamos dentro del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onChange"}]},{"type":"text","value":", nuestra instancia llamando al método getName. De momento le ponemos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"console.log"}]},{"type":"text","value":" para que podamos ver que es lo que nos pasa cada vez que escribimos. Si guardamos y abrimos nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"index.html"}]},{"type":"text","value":", cada vez que escribamos algo en nuestro input, recibiremos algo del estilo a esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-20.18.10.png","alt":"Input onChange"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEs un objeto con nombre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Proxy"}]},{"type":"text","value":" y mogollón de información. Es un estilo de elemento clásico de eventos(digo estilo), pero claro no es lo que realmente buscamos, como conseguimos el contenido de nuestro input:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"getName(input){\n    console.log(input.target.value)\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto lo habréis tenido que ver alguna vez ya, simplemente buscamos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"value"}]},{"type":"text","value":" del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"target"}]},{"type":"text","value":" de nuestro elemento, y ahora nuesto console.log nos ofrece, esta información según escribimos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-20.22.58.png","alt":"Input Changes"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien ya tenemos lo que necesitamos, ahora completemos la función para que nos modifique nuestro placeholder."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"getName(input){\n  this.setState(this.name = {nombre: input.target.value});\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para modificar \"el estado\" de un objeto o elemento del DOM tenemos el método o propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setState"}]},{"type":"text","value":", el cual modificaría solo lo que le pasemos entre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"()"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nTeóricamente sería algo como esto, pero lo habéis probado? Si lo probáis veréis que no funciona,nos indica que this es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"undefined"}]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-08.33.45.png","alt":"This undefined Error"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\npero.....¿por qué? Básicamente porque "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":" no está disponible como propiedad u objeto de las funciones o métodos que nosotros mismos creamos, para hacer que funcione es necesario "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"enlazar(bind)"}]},{"type":"text","value":" el this con el contexto de ejecución. Para ello solo seria necesario hacer el siguiente cambio:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<div>\n    <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n    <input onChange={this.getName.bind(this)}></input>\n    <h4> { this.name.nombre } </h4>\n</div>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como veis dentro de nuestro método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"render"}]},{"type":"text","value":" le hemos añadido "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bind(this)"}]},{"type":"text","value":", es decir, enlazame el this de render con mi método getName et voilá:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-08.41.36.png","alt":"Its alive"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nRealmente es todo muy sencillo ¿verdad?"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAntes de terminar con este post me faltaría comentar otro concepto, fijaros en esta parte del código que casi no hemos comentado:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"this.setState(this.name = {nombre: input.target.value});\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hemos hablado de la propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setState"}]},{"type":"text","value":" pero no mucho de lo que hay dentro, si miráis un poco el código esto es prácticamente lo mismo que tenemos dentro de nuestro método constructor(es un poco feo no?). Pues bien realmente la propiedad tiene un motivo por el que se llama "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setState()"}]},{"type":"text","value":" y es porque el método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"constructor"}]},{"type":"text","value":" ya está preparado para gestionar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"los cambios de estado"}]},{"type":"text","value":", si cambiamos el nombre de la propiedad y en lugar de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"name"}]},{"type":"text","value":" ponemos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"state"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"constructor(){\n  super();\n  this.state = {\n     nombre: \"Your Super Name\"\n  }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos como tendría que quedar nuestro método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"getName"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"getName(input){\n  this.setState({nombre: input.target.value});\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y que no se nos olvide cambiar nuestro placeholder:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<input onChange={this.getName.bind(this)}></input>\n<h4> { this.state.nombre } </h4>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si lo probáis veréis que todo funciona correctamente y hemos quitado alguna cosa que no quedaba del todo bien, aún así puede que algún momento queramos usarlo por lo que solo tenemos que recordar que si en el constructor no lo hacemos todo dentro del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this.state"}]},{"type":"text","value":", a la hora de usarlo es necesario indicar la estructura completa del objeto o propiedad que queremos cambiar."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn el próximo post veremos como comunicarnos entre componentes y alguna cosa más. Nos vemooooooos"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[]},"featureImageSharp":{"base":"Captain-Atom.jpg","publicURL":"/static/ea41313c22f611d45d277d453c4273d1/Captain-Atom.jpg","imageMeta":{"width":864,"height":648},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBv/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/aAAwDAQACEAMQAAABojay1bnBz//EABkQAQACAwAAAAAAAAAAAAAAAAECAwARE//aAAgBAQABBQKoAmdchqqPFMlZGuC7f//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEiH/2gAIAQMBAT8BONov/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERE0H/2gAIAQIBAT8BbK50/8QAHhAAAwAABwEAAAAAAAAAAAAAAAERAhIiMTJRUmH/2gAIAQEABj8C0x9lWxlq+j9ImHkVn//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExQf/aAAgBAQABPyHlOmjsuNqMAiJQe2TspkuwMcZ4otX5GdLXWf/aAAwDAQACAAMAAAAQy/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBB/9oACAEDAQE/ECLJZf/EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAgEBPxBJcpVz/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBUWHR/9oACAEBAAE/ECGZHOFc9RXVMNQfYPyzYFbcsWTgugFwsFDeqNnrnxyXBPYm2f/Z","aspectRatio":1.3333333333333333,"src":"/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom.jpg","srcSet":"/static/ea41313c22f611d45d277d453c4273d1/65d8c/Captain-Atom.jpg 260w,\n/static/ea41313c22f611d45d277d453c4273d1/c5f21/Captain-Atom.jpg 520w,\n/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom.jpg 864w","srcWebp":"/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom.webp","srcSetWebp":"/static/ea41313c22f611d45d277d453c4273d1/dc8f3/Captain-Atom.webp 260w,\n/static/ea41313c22f611d45d277d453c4273d1/2db4b/Captain-Atom.webp 520w,\n/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom.webp 864w","sizes":"(max-width: 864px) 100vw, 864px"}}}},"prev":{"id":"Ghost__Post__5a338158333e0f134c248f1e","title":"Don't stop the party: Node JS (I)","slug":"dont-stop-the-party-node-js-i","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/nodebaner.jpg","excerpt":"Comienzo otra nueva sección también dedicada al mundo JavaScript en este caso de \nNodeJS pero...\n\n¿Que es NodeJS?\nBien en este caso la mejor explicación corta es la de la página oficial de \nNodeJS [https://nodejs.org/es/]:\n\n> Node.js® es un entorno de ejecución para JavaScript construido con el motor de\nJavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y\norientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes\nde Node.js, npm, es el ecosistema m","custom_excerpt":null,"visibility":"public","created_at_pretty":"7 Aug 2017","published_at_pretty":"17 Aug 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-08-07T08:59:17.000+02:00","published_at":"2017-08-17T10:19:00.000+02:00","updated_at":"2017-10-11T13:35:59.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"nodejs","url":"https://jlgarcia.fulldev.ninja/tag/nodejs/","name":"nodejs","visibility":"public","feature_image":null,"description":null,"meta_title":"NodeJS Ninjas","meta_description":"Aprenderemos desde lo básico este framework de JS para backend, muy bueno en concurrencia y en API Rest y que forma parte del stack MEAN o MERN.","featureImageSharp":null},"tags":[{"slug":"nodejs","url":"https://jlgarcia.fulldev.ninja/tag/nodejs/","name":"nodejs","visibility":"public","feature_image":null,"description":null,"meta_title":"NodeJS Ninjas","meta_description":"Aprenderemos desde lo básico este framework de JS para backend, muy bueno en concurrencia y en API Rest y que forma parte del stack MEAN o MERN.","featureImageSharp":null}],"plaintext":"Comienzo otra nueva sección también dedicada al mundo JavaScript en este caso de \nNodeJS pero...\n\n¿Que es NodeJS?\nBien en este caso la mejor explicación corta es la de la página oficial de \nNodeJS [https://nodejs.org/es/]:\n\n> Node.js® es un entorno de ejecución para JavaScript construido con el motor de\nJavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y\norientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes\nde Node.js, npm, es el ecosistema mas grande de librerías de código abierto en\nel mundo.\n\n\nPara aclarar un poco NodeJS es la parte de backend de JavaScript y uno de sus\npuntos fuertes al ser no bloqueante (como dice arriba) es la concurrencia, es\ndecir maneja peticiones sin detenerse o bloquear las que le llegan (tiene\nlímites por supuesto) y esta orientado a eventos, que para el que no lo sepa\neste tipo de programación basa su funcionamiento en eventos o mensajes recibidos\ndesde otros hilos, programas....desde donde sea.\n\nOtro de sus puntos fuertes es npm, ¿y esto que es? bueno como hemos comentado\narriba es el gestor de paquetes de código abierto más grande del mundo\n(orientados a JS), en el que podemos encontrar librerías de casi todo lo que se\nnos ocurra al ser open-source se beneficia de que cualquiera puede subir\npaquetes por lo que el límite es prácticamente la imaginación ;)\n\nEn un principio esta sección esta centrada solo en NodeJS pero en los primeros\nposts comentaré algunas características de JavaScript que nos ayudarán en el\nentendimiento del conjunto, de todas formas ya os adelanto que posiblemente haga\nalguna sección con pequeños trucos o ejemplos de uso de JS.\nHablaremos de Node no de JS pero si explicaremos lo necesario para entender lo\nque estamos haciendo.\n\nVeamos un poco de que va esto de Node.\n\nInstalación\nNo me voy a entretener en la instalación en la página oficial de Node\n[https://nodejs.org/es/] viene muy bien explicado lo que tenemos que hacer en\ncada plataforma (en el caso de que sea distinto de descargar e instalar\njejejeje)\nYo recomiendo instalar la versión LTS ya que es a la que van dando soporte a lo\nlargo del tiempo, las nuevas pueden tener bugs o dar problemas, pero podéis\nprobar si queréis jejeje.\nLa instalación nos provee también de npm por lo que ya lo tendríamos también\ndisponible para usarlo. Más adelante iremos viendo como usar npm y que tenemos\nque tener en cuenta de su uso.\n\nPues sin mucho más vamos a empezar por ver algo de JavaScript.\n\nCallbacks\nEn node todos los usos de entrada o salida deberían ser asíncronos (no deben\nbloquear el hilo principal que es el que gestiona ), y una gran parte de la\nayuda la obtenemos de los callbacks. Y que son los callbacks, para explicarlo de\nforma sencilla podríamos decir que son funciones que estando en el ciclo de vida\nde otra se ejecutan al final, es decir, son funciones que se llaman al terminar\notra y no antes(aprovechándonos muchas veces de la posibilidad de pasar\nfunciones como parámetros), veamos un ejemplo de función asíncrona con\ncallbacks, para ello nos ayudaremos de la función setTimeout que para el que no\nlo sepa nos da la posibilidad de ejecutar algo tras el periodo de tiempo que le\nindiquemos:\n\n\"use strict\";\n\nconsole.log('Empezamos');\n\nfunction showAfter2Seconds(text, callbackFunc){\n    setTimeout(()=>{\n        console.log(text);\n\n        callbackFunc();\n\n    },2000);\n}\n\nshowAfter2Seconds('Pasaron 2 segundos',()=>{\n    console.log('Soy el callback');\n});\n\nconsole.log('Estoy fuera de la función')\n\n\nPara ejecutarlo solo tenemos que usar el comando node seguido del nombre de\nnuestro fichero js:\n\nnode callbacks.js\n\n\nY tendriamos algo como esto:\n\n\nComo vemos primero nos muestra 'Empezamos' y luego directamente vemos 'Estoy\nfuera de la función' pero...¿por qué?. Bien esto de debe a como funciona la\nasincronía en sí, cuando trabajamos con asincronía tenemos que pensar que\ntenemos más de 1 trabajador jugando con nuestro código, tenemos el principal(el\nque manda) el que siempre curra y luego tenemos a los que este llama para que\ntrabajen en segundo plano mientras el continua, es decir, cuando nuestro worker\nprincipal se encuentra con código asíncrono avisa a un compi para que lo haga y\nel continúa por donde estaba sin detenerse, por eso nos retorna el log que esta\nal final, porque el hilo principal ha llegado allí antes de que nuesto worker en\nsegundo plano terminara. Pero claro esto no es tan simple como usar una función\ncomo parámetro y ya está, no nos confundamos, usar una función como parámetro y\nllamarla cuando nos interese es solo una ventaja del lenguaje que nos ayuda a\nevitar lo que se conoce como race condition, y que se ejecute nuestro código\ncomo nosotros queremos, si nosotros quitamos el setTimeout y ponemos otro tipo\nde función que nos detenga la ejecución lo que haría el código seria pararse en\nese punto, devolver 'Soy el callback' y a continuación nos mostraría nuestro log \n'Estoy fuera de la función'. En este caso lo que sucede es que setTimeout es una\nfunción asíncrona de por sí, es decir, cuando nuestro hilo principal se\nencuentra con esta función llama a algún compi disponible para que la ejecute y\nya el compi es el responsable de lo que pase dentro de setTimeout, puede que sea\nun poco lioso y yo me haya extendido mucho en este punto pero es realmente \nIMPORTANTE entender esto para poder trabajar bien con NodeJS. Node comunmente se\nusa con una librería llamada async, la cual nos abstrae un poco de tener que\nhacer funciones como la que hemos visto arriba para usar asincronia, la\ndocumentación oficial esta muy bien explicada por lo que creo que es suficiente\ncon que miréis un poco de que va aquí [https://caolan.github.io/async/].\n\nBueno para empezar creo que es suficiente nos vemosss en el siguiente\nNinjaaaassssssss","html":"<!--kg-card-begin: markdown--><p>Comienzo otra nueva sección también dedicada al mundo JavaScript en este caso de <strong>NodeJS</strong> pero...</p>\n<h2 id=\"queesnodejs\">¿Que es NodeJS?</h2>\n<p>Bien en este caso la mejor explicación corta es la de la página oficial de <a href=\"https://nodejs.org/es/\">NodeJS</a>:</p>\n<blockquote>\n<p>Node.js® es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema mas grande de librerías de código abierto en el mundo.</p>\n</blockquote>\n<p>Para aclarar un poco NodeJS es la parte de backend de JavaScript y uno de sus puntos fuertes al ser <em>no bloqueante</em> (como dice arriba) es la concurrencia, es decir maneja peticiones sin detenerse o bloquear las que le llegan (tiene límites por supuesto) y esta orientado a eventos, que para el que no lo sepa este tipo de programación basa su funcionamiento en eventos o mensajes recibidos desde otros hilos, programas....desde donde sea.</p>\n<p>Otro de sus puntos fuertes es <strong>npm</strong>, ¿y esto que es? bueno como hemos comentado arriba es el gestor de paquetes de código abierto más grande del mundo (orientados a JS), en el que podemos encontrar librerías de casi todo lo que se nos ocurra al ser <em>open-source</em> se beneficia de que cualquiera puede subir paquetes por lo que el límite es prácticamente la imaginación ;)</p>\n<p>En un principio esta sección esta centrada solo en <strong>NodeJS</strong> pero en los primeros posts comentaré algunas características de JavaScript que nos ayudarán en el entendimiento del conjunto, de todas formas ya os adelanto que posiblemente haga alguna sección con pequeños trucos o ejemplos de uso de JS.<br>\nHablaremos de Node no de JS pero si explicaremos lo necesario para entender lo que estamos haciendo.</p>\n<p>Veamos un poco de que va esto de Node.</p>\n<h3 id=\"instalacin\">Instalación</h3>\n<p>No me voy a entretener en la instalación en la página oficial de <a href=\"https://nodejs.org/es/\">Node</a> viene muy bien explicado lo que tenemos que hacer en cada plataforma (en el caso de que sea distinto de descargar e instalar jejejeje)<br>\nYo recomiendo instalar la versión <strong>LTS</strong> ya que es a la que van dando soporte a lo largo del tiempo, las nuevas pueden tener bugs o dar problemas, pero podéis probar si queréis jejeje.<br>\nLa instalación nos provee también de <strong>npm</strong> por lo que ya lo tendríamos también disponible para usarlo. Más adelante iremos viendo como usar npm y que tenemos que tener en cuenta de su uso.</p>\n<p>Pues sin mucho más vamos a empezar por ver algo de JavaScript.</p>\n<h3 id=\"callbacks\">Callbacks</h3>\n<p>En node todos los usos de entrada o salida deberían ser asíncronos (no deben bloquear el hilo principal que es el que gestiona ), y una gran parte de la ayuda la obtenemos de los callbacks. Y que son los callbacks, para explicarlo de forma sencilla podríamos decir que son funciones que estando en el ciclo de vida de otra se ejecutan al final, es decir, son funciones que se llaman al terminar otra y no antes(aprovechándonos muchas veces de la posibilidad de pasar funciones como parámetros), veamos un ejemplo de función asíncrona con callbacks, para ello nos ayudaremos de la función <strong>setTimeout</strong> que para el que no lo sepa nos da la posibilidad de ejecutar algo tras el periodo de tiempo que le indiquemos:</p>\n<pre><code>&quot;use strict&quot;;\n\nconsole.log('Empezamos');\n\nfunction showAfter2Seconds(text, callbackFunc){\n    setTimeout(()=&gt;{\n        console.log(text);\n\n        callbackFunc();\n\n    },2000);\n}\n\nshowAfter2Seconds('Pasaron 2 segundos',()=&gt;{\n    console.log('Soy el callback');\n});\n\nconsole.log('Estoy fuera de la función')\n</code></pre>\n<p>Para ejecutarlo solo tenemos que usar el comando <strong>node</strong> seguido del nombre de nuestro fichero js:</p>\n<pre><code>node callbacks.js\n</code></pre>\n<p>Y tendriamos algo como esto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/callbackDemo.gif\" alt=\"Callback Demo\"><br>\nComo vemos primero nos muestra <strong>'Empezamos'</strong> y luego directamente vemos <strong>'Estoy fuera de la función'</strong> pero...¿por qué?. Bien esto de debe a como funciona la asincronía en sí, cuando trabajamos con asincronía tenemos que pensar que tenemos más de 1 trabajador jugando con nuestro código, tenemos el principal(el que manda) el que siempre curra y luego tenemos a los que este llama para que trabajen en segundo plano <strong>mientras el continua</strong>, es decir, cuando nuestro worker principal se encuentra con código asíncrono avisa a un compi para que lo haga y el continúa por donde estaba sin detenerse, por eso nos retorna el log que esta al final, porque el hilo principal ha llegado allí antes de que nuesto worker en segundo plano terminara. Pero claro esto no es tan simple como usar una función como parámetro y ya está, no nos confundamos, usar una función como parámetro y llamarla cuando nos interese es solo una ventaja del lenguaje que nos ayuda a evitar lo que se conoce como <strong>race condition</strong>, y que se ejecute nuestro código como nosotros queremos, si nosotros quitamos el <strong>setTimeout</strong> y ponemos otro tipo de función que nos detenga la ejecución lo que haría el código seria pararse en ese punto, devolver <strong>'Soy el callback'</strong> y a continuación nos mostraría nuestro log <strong>'Estoy fuera de la función'</strong>. En este caso lo que sucede es que <strong>setTimeout</strong> es una función <strong>asíncrona</strong> de por sí, es decir, cuando nuestro hilo principal se encuentra con esta función llama a algún compi disponible para que la ejecute y ya el compi es el responsable de lo que pase dentro de <strong>setTimeout</strong>, puede que sea un poco lioso y yo me haya extendido mucho en este punto pero es realmente <strong>IMPORTANTE</strong> entender esto para poder trabajar bien con <strong>NodeJS</strong>. Node comunmente se usa con una librería llamada <strong>async</strong>, la cual nos abstrae un poco de tener que hacer funciones como la que hemos visto arriba para usar asincronia, la documentación oficial esta muy bien explicada por lo que creo que es suficiente con que miréis un poco de que va <a href=\"https://caolan.github.io/async/\">aquí</a>.</p>\n<p>Bueno para empezar creo que es suficiente nos vemosss en el siguiente Ninjaaaassssssss</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/dont-stop-the-party-node-js-i/","canonical_url":null,"uuid":"9ebd7605-d6ad-4c5a-b3ee-d91dafb57a16","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"43","reading_time":4,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Comienzo otra nueva sección también dedicada al mundo JavaScript en este caso de <strong>NodeJS</strong> pero...</p>\n<h2 id=\"queesnodejs\">¿Que es NodeJS?</h2>\n<p>Bien en este caso la mejor explicación corta es la de la página oficial de <a href=\"https://nodejs.org/es/\">NodeJS</a>:</p>\n<blockquote>\n<p>Node.js® es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema mas grande de librerías de código abierto en el mundo.</p>\n</blockquote>\n<p>Para aclarar un poco NodeJS es la parte de backend de JavaScript y uno de sus puntos fuertes al ser <em>no bloqueante</em> (como dice arriba) es la concurrencia, es decir maneja peticiones sin detenerse o bloquear las que le llegan (tiene límites por supuesto) y esta orientado a eventos, que para el que no lo sepa este tipo de programación basa su funcionamiento en eventos o mensajes recibidos desde otros hilos, programas....desde donde sea.</p>\n<p>Otro de sus puntos fuertes es <strong>npm</strong>, ¿y esto que es? bueno como hemos comentado arriba es el gestor de paquetes de código abierto más grande del mundo (orientados a JS), en el que podemos encontrar librerías de casi todo lo que se nos ocurra al ser <em>open-source</em> se beneficia de que cualquiera puede subir paquetes por lo que el límite es prácticamente la imaginación ;)</p>\n<p>En un principio esta sección esta centrada solo en <strong>NodeJS</strong> pero en los primeros posts comentaré algunas características de JavaScript que nos ayudarán en el entendimiento del conjunto, de todas formas ya os adelanto que posiblemente haga alguna sección con pequeños trucos o ejemplos de uso de JS.<br>\nHablaremos de Node no de JS pero si explicaremos lo necesario para entender lo que estamos haciendo.</p>\n<p>Veamos un poco de que va esto de Node.</p>\n<h3 id=\"instalacin\">Instalación</h3>\n<p>No me voy a entretener en la instalación en la página oficial de <a href=\"https://nodejs.org/es/\">Node</a> viene muy bien explicado lo que tenemos que hacer en cada plataforma (en el caso de que sea distinto de descargar e instalar jejejeje)<br>\nYo recomiendo instalar la versión <strong>LTS</strong> ya que es a la que van dando soporte a lo largo del tiempo, las nuevas pueden tener bugs o dar problemas, pero podéis probar si queréis jejeje.<br>\nLa instalación nos provee también de <strong>npm</strong> por lo que ya lo tendríamos también disponible para usarlo. Más adelante iremos viendo como usar npm y que tenemos que tener en cuenta de su uso.</p>\n<p>Pues sin mucho más vamos a empezar por ver algo de JavaScript.</p>\n<h3 id=\"callbacks\">Callbacks</h3>\n<p>En node todos los usos de entrada o salida deberían ser asíncronos (no deben bloquear el hilo principal que es el que gestiona ), y una gran parte de la ayuda la obtenemos de los callbacks. Y que son los callbacks, para explicarlo de forma sencilla podríamos decir que son funciones que estando en el ciclo de vida de otra se ejecutan al final, es decir, son funciones que se llaman al terminar otra y no antes(aprovechándonos muchas veces de la posibilidad de pasar funciones como parámetros), veamos un ejemplo de función asíncrona con callbacks, para ello nos ayudaremos de la función <strong>setTimeout</strong> que para el que no lo sepa nos da la posibilidad de ejecutar algo tras el periodo de tiempo que le indiquemos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">\"use strict\";\n\nconsole.log('Empezamos');\n\nfunction showAfter2Seconds(text, callbackFunc){\n    setTimeout(()=>{\n        console.log(text);\n\n        callbackFunc();\n\n    },2000);\n}\n\nshowAfter2Seconds('Pasaron 2 segundos',()=>{\n    console.log('Soy el callback');\n});\n\nconsole.log('Estoy fuera de la función')\n</code></pre></div>\n<p>Para ejecutarlo solo tenemos que usar el comando <strong>node</strong> seguido del nombre de nuestro fichero js:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">node callbacks.js\n</code></pre></div>\n<p>Y tendriamos algo como esto:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/callbackDemo.gif\" alt=\"Callback Demo\"><br>\nComo vemos primero nos muestra <strong>'Empezamos'</strong> y luego directamente vemos <strong>'Estoy fuera de la función'</strong> pero...¿por qué?. Bien esto de debe a como funciona la asincronía en sí, cuando trabajamos con asincronía tenemos que pensar que tenemos más de 1 trabajador jugando con nuestro código, tenemos el principal(el que manda) el que siempre curra y luego tenemos a los que este llama para que trabajen en segundo plano <strong>mientras el continua</strong>, es decir, cuando nuestro worker principal se encuentra con código asíncrono avisa a un compi para que lo haga y el continúa por donde estaba sin detenerse, por eso nos retorna el log que esta al final, porque el hilo principal ha llegado allí antes de que nuesto worker en segundo plano terminara. Pero claro esto no es tan simple como usar una función como parámetro y ya está, no nos confundamos, usar una función como parámetro y llamarla cuando nos interese es solo una ventaja del lenguaje que nos ayuda a evitar lo que se conoce como <strong>race condition</strong>, y que se ejecute nuestro código como nosotros queremos, si nosotros quitamos el <strong>setTimeout</strong> y ponemos otro tipo de función que nos detenga la ejecución lo que haría el código seria pararse en ese punto, devolver <strong>'Soy el callback'</strong> y a continuación nos mostraría nuestro log <strong>'Estoy fuera de la función'</strong>. En este caso lo que sucede es que <strong>setTimeout</strong> es una función <strong>asíncrona</strong> de por sí, es decir, cuando nuestro hilo principal se encuentra con esta función llama a algún compi disponible para que la ejecute y ya el compi es el responsable de lo que pase dentro de <strong>setTimeout</strong>, puede que sea un poco lioso y yo me haya extendido mucho en este punto pero es realmente <strong>IMPORTANTE</strong> entender esto para poder trabajar bien con <strong>NodeJS</strong>. Node comunmente se usa con una librería llamada <strong>async</strong>, la cual nos abstrae un poco de tener que hacer funciones como la que hemos visto arriba para usar asincronia, la documentación oficial esta muy bien explicada por lo que creo que es suficiente con que miréis un poco de que va <a href=\"https://caolan.github.io/async/\">aquí</a>.</p>\n<p>Bueno para empezar creo que es suficiente nos vemosss en el siguiente Ninjaaaassssssss</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Comienzo otra nueva sección también dedicada al mundo JavaScript en este caso de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":" pero..."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"queesnodejs"},"children":[{"type":"text","value":"¿Que es NodeJS?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien en este caso la mejor explicación corta es la de la página oficial de "},{"type":"element","tagName":"a","properties":{"href":"https://nodejs.org/es/"},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"blockquote","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Node.js® es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema mas grande de librerías de código abierto en el mundo."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para aclarar un poco NodeJS es la parte de backend de JavaScript y uno de sus puntos fuertes al ser "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"no bloqueante"}]},{"type":"text","value":" (como dice arriba) es la concurrencia, es decir maneja peticiones sin detenerse o bloquear las que le llegan (tiene límites por supuesto) y esta orientado a eventos, que para el que no lo sepa este tipo de programación basa su funcionamiento en eventos o mensajes recibidos desde otros hilos, programas....desde donde sea."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Otro de sus puntos fuertes es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"npm"}]},{"type":"text","value":", ¿y esto que es? bueno como hemos comentado arriba es el gestor de paquetes de código abierto más grande del mundo (orientados a JS), en el que podemos encontrar librerías de casi todo lo que se nos ocurra al ser "},{"type":"element","tagName":"em","properties":{},"children":[{"type":"text","value":"open-source"}]},{"type":"text","value":" se beneficia de que cualquiera puede subir paquetes por lo que el límite es prácticamente la imaginación ;)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En un principio esta sección esta centrada solo en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":" pero en los primeros posts comentaré algunas características de JavaScript que nos ayudarán en el entendimiento del conjunto, de todas formas ya os adelanto que posiblemente haga alguna sección con pequeños trucos o ejemplos de uso de JS."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nHablaremos de Node no de JS pero si explicaremos lo necesario para entender lo que estamos haciendo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos un poco de que va esto de Node."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"instalacin"},"children":[{"type":"text","value":"Instalación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"No me voy a entretener en la instalación en la página oficial de "},{"type":"element","tagName":"a","properties":{"href":"https://nodejs.org/es/"},"children":[{"type":"text","value":"Node"}]},{"type":"text","value":" viene muy bien explicado lo que tenemos que hacer en cada plataforma (en el caso de que sea distinto de descargar e instalar jejejeje)"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nYo recomiendo instalar la versión "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"LTS"}]},{"type":"text","value":" ya que es a la que van dando soporte a lo largo del tiempo, las nuevas pueden tener bugs o dar problemas, pero podéis probar si queréis jejeje."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLa instalación nos provee también de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"npm"}]},{"type":"text","value":" por lo que ya lo tendríamos también disponible para usarlo. Más adelante iremos viendo como usar npm y que tenemos que tener en cuenta de su uso."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pues sin mucho más vamos a empezar por ver algo de JavaScript."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"callbacks"},"children":[{"type":"text","value":"Callbacks"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En node todos los usos de entrada o salida deberían ser asíncronos (no deben bloquear el hilo principal que es el que gestiona ), y una gran parte de la ayuda la obtenemos de los callbacks. Y que son los callbacks, para explicarlo de forma sencilla podríamos decir que son funciones que estando en el ciclo de vida de otra se ejecutan al final, es decir, son funciones que se llaman al terminar otra y no antes(aprovechándonos muchas veces de la posibilidad de pasar funciones como parámetros), veamos un ejemplo de función asíncrona con callbacks, para ello nos ayudaremos de la función "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setTimeout"}]},{"type":"text","value":" que para el que no lo sepa nos da la posibilidad de ejecutar algo tras el periodo de tiempo que le indiquemos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"\"use strict\";\n\nconsole.log('Empezamos');\n\nfunction showAfter2Seconds(text, callbackFunc){\n    setTimeout(()=>{\n        console.log(text);\n\n        callbackFunc();\n\n    },2000);\n}\n\nshowAfter2Seconds('Pasaron 2 segundos',()=>{\n    console.log('Soy el callback');\n});\n\nconsole.log('Estoy fuera de la función')\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para ejecutarlo solo tenemos que usar el comando "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"node"}]},{"type":"text","value":" seguido del nombre de nuestro fichero js:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"node callbacks.js\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y tendriamos algo como esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/callbackDemo.gif","alt":"Callback Demo"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo vemos primero nos muestra "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"'Empezamos'"}]},{"type":"text","value":" y luego directamente vemos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"'Estoy fuera de la función'"}]},{"type":"text","value":" pero...¿por qué?. Bien esto de debe a como funciona la asincronía en sí, cuando trabajamos con asincronía tenemos que pensar que tenemos más de 1 trabajador jugando con nuestro código, tenemos el principal(el que manda) el que siempre curra y luego tenemos a los que este llama para que trabajen en segundo plano "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mientras el continua"}]},{"type":"text","value":", es decir, cuando nuestro worker principal se encuentra con código asíncrono avisa a un compi para que lo haga y el continúa por donde estaba sin detenerse, por eso nos retorna el log que esta al final, porque el hilo principal ha llegado allí antes de que nuesto worker en segundo plano terminara. Pero claro esto no es tan simple como usar una función como parámetro y ya está, no nos confundamos, usar una función como parámetro y llamarla cuando nos interese es solo una ventaja del lenguaje que nos ayuda a evitar lo que se conoce como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"race condition"}]},{"type":"text","value":", y que se ejecute nuestro código como nosotros queremos, si nosotros quitamos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setTimeout"}]},{"type":"text","value":" y ponemos otro tipo de función que nos detenga la ejecución lo que haría el código seria pararse en ese punto, devolver "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"'Soy el callback'"}]},{"type":"text","value":" y a continuación nos mostraría nuestro log "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"'Estoy fuera de la función'"}]},{"type":"text","value":". En este caso lo que sucede es que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setTimeout"}]},{"type":"text","value":" es una función "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"asíncrona"}]},{"type":"text","value":" de por sí, es decir, cuando nuestro hilo principal se encuentra con esta función llama a algún compi disponible para que la ejecute y ya el compi es el responsable de lo que pase dentro de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setTimeout"}]},{"type":"text","value":", puede que sea un poco lioso y yo me haya extendido mucho en este punto pero es realmente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IMPORTANTE"}]},{"type":"text","value":" entender esto para poder trabajar bien con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":". Node comunmente se usa con una librería llamada "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"async"}]},{"type":"text","value":", la cual nos abstrae un poco de tener que hacer funciones como la que hemos visto arriba para usar asincronia, la documentación oficial esta muy bien explicada por lo que creo que es suficiente con que miréis un poco de que va "},{"type":"element","tagName":"a","properties":{"href":"https://caolan.github.io/async/"},"children":[{"type":"text","value":"aquí"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bueno para empezar creo que es suficiente nos vemosss en el siguiente Ninjaaaassssssss"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"queesnodejs","heading":"¿Que es NodeJS?","items":[{"id":"instalacin","heading":"Instalación"},{"id":"callbacks","heading":"Callbacks"}]}]},"featureImageSharp":{"base":"nodebaner.jpg","publicURL":"/static/ebae59fce798d71ce68bf2a304f1491f/nodebaner.jpg","imageMeta":{"width":1680,"height":420},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAFABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAIEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAME/9oADAMBAAIQAxAAAAGrMokzQT//xAAXEAEBAQEAAAAAAAAAAAAAAAACASIh/9oACAEBAAEFAgMKdU1//8QAFhEBAQEAAAAAAAAAAAAAAAAAAAEx/9oACAEDAQE/AamP/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAEx/9oACAECAQE/AV1//8QAFRABAQAAAAAAAAAAAAAAAAAAEHH/2gAIAQEABj8Cr//EABgQAQADAQAAAAAAAAAAAAAAAAEAETEh/9oACAEBAAE/Ido1iddq0QhE/9oADAMBAAIAAwAAABDz/wD/xAAWEQEBAQAAAAAAAAAAAAAAAAABABH/2gAIAQMBAT8QbrNxf//EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAgEBPxAgav/EABgQAQADAQAAAAAAAAAAAAAAAAEAETFx/9oACAEBAAE/ECLXUGFQ03NnlQ0Zc//Z","aspectRatio":3.977272727272727,"src":"/static/ebae59fce798d71ce68bf2a304f1491f/ea4ab/nodebaner.jpg","srcSet":"/static/ebae59fce798d71ce68bf2a304f1491f/477ba/nodebaner.jpg 175w,\n/static/ebae59fce798d71ce68bf2a304f1491f/06776/nodebaner.jpg 350w,\n/static/ebae59fce798d71ce68bf2a304f1491f/ea4ab/nodebaner.jpg 700w,\n/static/ebae59fce798d71ce68bf2a304f1491f/3055e/nodebaner.jpg 1050w,\n/static/ebae59fce798d71ce68bf2a304f1491f/eff08/nodebaner.jpg 1400w,\n/static/ebae59fce798d71ce68bf2a304f1491f/34c3a/nodebaner.jpg 1680w","srcWebp":"/static/ebae59fce798d71ce68bf2a304f1491f/89afa/nodebaner.webp","srcSetWebp":"/static/ebae59fce798d71ce68bf2a304f1491f/9fca7/nodebaner.webp 175w,\n/static/ebae59fce798d71ce68bf2a304f1491f/37a4e/nodebaner.webp 350w,\n/static/ebae59fce798d71ce68bf2a304f1491f/89afa/nodebaner.webp 700w,\n/static/ebae59fce798d71ce68bf2a304f1491f/78e7a/nodebaner.webp 1050w,\n/static/ebae59fce798d71ce68bf2a304f1491f/03d34/nodebaner.webp 1400w,\n/static/ebae59fce798d71ce68bf2a304f1491f/41aa5/nodebaner.webp 1680w","sizes":"(max-width: 700px) 100vw, 700px"}}}},"next":{"id":"Ghost__Post__5a338158333e0f134c248f1a","title":"React Superhero : Introducción","slug":"react-superhero-introduccion","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Captain-Atom.jpg","excerpt":"Empiezo nueva sección en el blog (tenía muchísimas ganas de empezar con React).\n\nOs cuento un poco que es esto:\n\n * Esta desarrollado por Facebook que aunque no lo parezca nos da algo de\n   confianza en cuanto a su durabilidad a la larga y su estabilidad.\n * Se centra mucho en la parte de UI, es decir seria la V del MVC.\n * Es muy útil para construir grandes aplicaciones que cambian con el tiempo.\n * Gracias a su Virtual DOM el rendimiento no se ve severamente afectado cuando\n   la información n","custom_excerpt":null,"visibility":"public","created_at_pretty":"29 Jul 2017","published_at_pretty":"7 Aug 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-29T11:24:17.000+02:00","published_at":"2017-08-07T17:33:00.000+02:00","updated_at":"2017-10-11T13:47:25.000+02:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null},"tags":[{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null}],"plaintext":"Empiezo nueva sección en el blog (tenía muchísimas ganas de empezar con React).\n\nOs cuento un poco que es esto:\n\n * Esta desarrollado por Facebook que aunque no lo parezca nos da algo de\n   confianza en cuanto a su durabilidad a la larga y su estabilidad.\n * Se centra mucho en la parte de UI, es decir seria la V del MVC.\n * Es muy útil para construir grandes aplicaciones que cambian con el tiempo.\n * Gracias a su Virtual DOM el rendimiento no se ve severamente afectado cuando\n   la información necesita actualizarse.\n * Se basa en componentes, haciéndolos reutilizables fácilmente.\n * Lo podemos integrar a cualquier API.\n * Y es JavaScript :)\n * Se puede integrar con Node, Ruby o cualquier otro lenguaje de backend.\n * Tiene framework para mobile (React Native, que lo venden como 'nativo'), que\n   será lo siguiente que veremos cuando terminemos con el básico ;)\n * Usa JSX que es una especie de lenguaje tipo XML para crear nuestros\n   componentes. Básicamente nos permite usar código HTML en variables de JS.\n   Tenéis mas información sobre esto en la pagina oficial de React\n   [https://facebook.github.io/react/docs/introducing-jsx.html].\n\nSuena bien no?? A mi me encanta:\n\n\nPara trabajar con React necesitamos agregar mínimo 3 librerías a nuestro\nproyecto, es decir a nuestro index.html\n\n<!-- Libreria para trabajar con React -->\n<script src=\"https://unpkg.com/react@latest/dist/react.js\"></script>\n<!-- Libreria de react para trabajar con el Dom-->\n<script src=\"https://unpkg.com/react-dom@latest/dist/react-dom.js\"></script>\n<!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no funcione en todos -->\n<script src=\"https://unpkg.com/babel-standalone@6.15.0/babel.min.js\"></script>\n\n\nBien con esto ya tenemos lo básico para trabajar con React. Como extra yo me\ndescargado un plugin para Visual Studio Code para que reconozca el trabajo con\nbabel en su momento. No es en absoluto necesario.\n\nPues bien antes de continuar hagamos una prueba para comprobar que todo funciona\nbien, si alguno ha trabajado o conoce un poco Angular vera como ciertos\nconceptos con parecidos.\n\nVamos a añadir una cabecera a nuestro fichero HTML usando React, para ello\nincluimos lo siguiente:\n\n<script type=\"text/babel\">\n        ReactDOM.render(\n          <h2>Hello with React</h2>,\n          document.getElementById('root');\n        );\n</script>\n\n\nComo vemos usamos en lugar de nuestro text/javascript típico, hemos puesto babel \npara que reconozca que tiene que usar babel. Y a continuación le indicamos que\nrenderice en nuestro DOM el HTML que le pasamos, pero......¿donde? bien aquí es\ndonde viene un concepto similar a angular. En Angular 1.5 por ejemplo teníamos\nnuestro ng-app:\n\n<body ng-app=\"appName\">\n\n\nDonde le indicabamos donde empezaba a funcionar nuestra WebAPP, pues con React\nel concepto es parecido, si veis en el código superior hemos puesto que busque\nun elemento con el ID root(que podria ser cualquier otro nombre), que sera donde\nrenderice el código, por lo que en algún sitio de nuestro código html tenemos\nque añadirlo jejejejje\n\n<div id=\"root\"></div>\n\n\nBien y si todo ha ido bien tendríamos que tener algo similar a esto:\n\nPerfecto, como prueba de concepto esta bien, pero realmente así no se trabaja\ncon React, es un lenguaje basado en componentes por lo que vamos a empezar por\ncrear nuestro primer componente.\n\nPrimer Componente\nNuestro primer componente solo para ver de una forma rápida y facil como se\nharían, lo crearemos en el mismo index.html, dentro de nuestra etiqueta script\n\n<script type=\"text/babel\">\nclass Supercomponente extends React.Component{\n      render(){\n          return <h2>Hello with React</h2>;\n      }\n}\n\n\nComo veis hemos creado una clase Principal (Ojo el nombre tiene que empezar en\nmayúsculas mas abajo veremos porque, y normalmente usamos inglés para los\nnombres, solo he puesto ese superNombre para que quede claro), la cual extiende\nde React.Component. Luego simplemente creamos un método render que devuelve el\nmismo código que teníamos antes, pero... y como lo llamamos, bien aqui viene el\nporque de las mayúsculas al crear el componente.\nLos componentes pasan a ser etiquetas al estilo HTML y las ponemos en mayúsculas\npara diferenciarlas de las etiquetas normales, quedando la llamada al componente\nde esta manera:\n\nReactDOM.render(\n   <SuperComponente/>,\n   document.getElementById('root')\n);\n\n\nPonemos la etiqueta (importante cerrándola al final), y con esto debería\nfuncionarnos igual que antes, y ya habríamos creado y usado nuestro primer\ncomponente.\n\nFácil verdad? Bien como importante recordar que un componente siempre tiene que\ntener un método render y que en las llamadas del ReactDOM, solo repito solo \npodemos pasarle un componente. Y ahora viene cuando nos deberíamos preguntar, ¿Y\ncomo hago para usar varios componentes unos con otros?¿No me digas que tenemos\nque hacer para todos un ReactDOM.render?......Pues no, no es necesario,\nrealmente podemos integrar unos componentes con otros, pero a nivel de\ncomponentes, es decir, un componente puede tener y devolver otros componentes,\nvamos a crear otro componente y hagamos la prueba\n\nclass MiSegundoComponente extends React.Component{\n       render(){\n            return <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n       }\n}\n\n\nYa tenemos otro componente y para llamarlo, lo hacemos desde el primero como si\nde otra etiqueta HTML normal se tratara, algo así no?:\n\nclass SuperComponente extends React.Component{\nrender(){\n     return (\n            <h2>Hello with React</h2>\n            <MiSegundoComponente/>\n        );\n     }\n}\n\n\nFijaros que en el return he metido el contenido entre (), pero hagamos la\nprueba.....upssss no carga nada y si abrimos la consola del navegador vemos lo\nsiguiente:\n\nBien he puesto este error a propósito para que lo tengamos en cuenta como\nimportante, TODOS LOS COMPONENTES ES NECESARIO QUE ESTEN DENTRO DE UNA ETIQUETA\nPADRE, es decir tienen que ser elementos HTML por si solos. En este caso seria\nsimplemente meterlo todo dentro de un div:\n\nclass SuperComponente extends React.Component{\n  render(){\n         return (\n           <div>\n             <h2>Hello with React</h2>\n             <MiSegundoComponente/>\n           </div>\n        );\n   }\n }\n\n\nY ahora ya si nos funcionaria:\n\n\nComo véis el uso de React es bastante fácil solo tenemos que tener unas pequeñas\ncosas en cuenta, como por ejemplo que los componentes tengan que estar\nencapsulados dentro de una etiqueta principal para que funcionen.\n\nY hasta aquí este post introductorio de React, os animo a seguir los siguientes\nsi queréis aprender al mismo tiempo que yo a usar React, nos vemos en el\nsiguiente.","html":"<!--kg-card-begin: markdown--><p>Empiezo nueva sección en el blog (tenía muchísimas ganas de empezar con React).</p>\n<p>Os cuento un poco que es esto:</p>\n<ul>\n<li>Esta desarrollado por Facebook que aunque no lo parezca nos da algo de confianza en cuanto a su durabilidad a la larga y su estabilidad.</li>\n<li>Se centra mucho en la parte de UI, es decir seria la V del MVC.</li>\n<li>Es muy útil para construir grandes aplicaciones que cambian con el tiempo.</li>\n<li>Gracias a su <strong>Virtual DOM</strong> el rendimiento no se ve severamente afectado cuando la información necesita actualizarse.</li>\n<li>Se basa en componentes, haciéndolos reutilizables fácilmente.</li>\n<li>Lo podemos integrar a cualquier API.</li>\n<li>Y es JavaScript :)</li>\n<li>Se puede integrar con Node, Ruby o cualquier otro lenguaje de backend.</li>\n<li>Tiene framework para mobile (<strong>React Native</strong>, que lo venden como 'nativo'), que será lo siguiente que veremos cuando terminemos con el básico ;)</li>\n<li>Usa <strong>JSX</strong> que es una especie de lenguaje tipo XML para crear nuestros componentes. Básicamente nos permite usar código HTML en variables de JS. Tenéis mas información sobre esto en la pagina oficial de <a href=\"https://facebook.github.io/react/docs/introducing-jsx.html\">React</a>.</li>\n</ul>\n<p>Suena bien no?? A mi me encanta:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/1839631-catom_cv1-1.jpg\" alt=\"Captian Atom\"></p>\n<p>Para trabajar con React necesitamos agregar mínimo 3 librerías a nuestro proyecto, es decir a nuestro index.html</p>\n<pre><code>&lt;!-- Libreria para trabajar con React --&gt;\n&lt;script src=&quot;https://unpkg.com/react@latest/dist/react.js&quot;&gt;&lt;/script&gt;\n&lt;!-- Libreria de react para trabajar con el Dom--&gt;\n&lt;script src=&quot;https://unpkg.com/react-dom@latest/dist/react-dom.js&quot;&gt;&lt;/script&gt;\n&lt;!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no funcione en todos --&gt;\n&lt;script src=&quot;https://unpkg.com/babel-standalone@6.15.0/babel.min.js&quot;&gt;&lt;/script&gt;\n</code></pre>\n<p>Bien con esto ya tenemos lo básico para trabajar con React. Como extra yo me descargado un plugin para <strong>Visual Studio Code</strong> para que reconozca el trabajo con babel en su momento. No es en absoluto necesario.</p>\n<p>Pues bien antes de continuar hagamos una prueba para comprobar que todo funciona bien, si alguno ha trabajado o conoce un poco Angular vera como ciertos conceptos con parecidos.</p>\n<p>Vamos a añadir una cabecera a nuestro fichero HTML usando React, para ello incluimos lo siguiente:</p>\n<pre><code>&lt;script type=&quot;text/babel&quot;&gt;\n        ReactDOM.render(\n          &lt;h2&gt;Hello with React&lt;/h2&gt;,\n          document.getElementById('root');\n        );\n&lt;/script&gt;\n</code></pre>\n<p>Como vemos usamos en lugar de nuestro <strong>text/javascript</strong> típico, hemos puesto <strong>babel</strong> para que reconozca que tiene que usar babel. Y a continuación le indicamos que renderice en nuestro DOM el HTML que le pasamos, pero......¿donde? bien aquí es donde viene un concepto similar a angular. En Angular 1.5 por ejemplo teníamos nuestro ng-app:</p>\n<pre><code>&lt;body ng-app=&quot;appName&quot;&gt;\n</code></pre>\n<p>Donde le indicabamos donde empezaba a funcionar nuestra WebAPP, pues con React el concepto es parecido, si veis en el código superior hemos puesto que busque un elemento con el ID <strong>root</strong>(que podria ser cualquier otro nombre), que sera donde renderice el código, por lo que en algún sitio de nuestro código html tenemos que añadirlo jejejejje</p>\n<pre><code>&lt;div id=&quot;root&quot;&gt;&lt;/div&gt;\n</code></pre>\n<p>Bien y si todo ha ido bien tendríamos que tener algo similar a esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-14.23.56.png\" alt=\"React Hello\"><br>\nPerfecto, como prueba de concepto esta bien, pero realmente así no se trabaja con React, es un lenguaje basado en componentes por lo que vamos a empezar por crear nuestro primer componente.</p>\n<h2 id=\"primercomponente\">Primer Componente</h2>\n<p>Nuestro primer componente solo para ver de una forma rápida y facil como se harían, lo crearemos en el mismo index.html, dentro de nuestra etiqueta <strong>script</strong></p>\n<pre><code>&lt;script type=&quot;text/babel&quot;&gt;\nclass Supercomponente extends React.Component{\n      render(){\n          return &lt;h2&gt;Hello with React&lt;/h2&gt;;\n      }\n}\n</code></pre>\n<p>Como veis hemos creado una clase <strong>Principal (Ojo el nombre tiene que empezar en mayúsculas mas abajo veremos porque, y normalmente usamos inglés para los nombres, solo he puesto ese superNombre para que quede claro)</strong>, la cual extiende de <strong>React.Component</strong>. Luego simplemente creamos un método <strong>render</strong> que devuelve el mismo código que teníamos antes, pero... y como lo llamamos, bien aqui viene el porque de las <strong>mayúsculas</strong> al crear el componente.<br>\nLos componentes pasan a ser etiquetas al estilo HTML y las ponemos en mayúsculas para diferenciarlas de las etiquetas normales, quedando la llamada al componente de esta manera:</p>\n<pre><code>ReactDOM.render(\n   &lt;SuperComponente/&gt;,\n   document.getElementById('root')\n);\n</code></pre>\n<p>Ponemos la etiqueta (importante cerrándola al final), y con esto debería funcionarnos igual que antes, y ya habríamos creado y usado nuestro primer componente.</p>\n<p>Fácil verdad?  Bien como importante recordar que un componente siempre tiene que tener un método <strong>render</strong> y que en las llamadas del ReactDOM, solo repito <strong>solo</strong> podemos pasarle un componente. Y ahora viene cuando nos deberíamos preguntar, ¿Y como hago para usar varios componentes unos con otros?¿No me digas que tenemos que hacer para todos un <strong>ReactDOM.render</strong>?......Pues no, no es necesario, realmente podemos integrar unos componentes con otros, pero a nivel de componentes, es decir, un componente puede tener y devolver otros componentes, vamos a crear otro componente y hagamos la prueba</p>\n<pre><code>class MiSegundoComponente extends React.Component{\n       render(){\n            return &lt;h2&gt;REACT is in the HOUSE...YEAH!!!!&lt;/h2&gt;\n       }\n}\n</code></pre>\n<p>Ya tenemos otro componente y para llamarlo, lo hacemos desde el primero como si de otra etiqueta HTML normal se tratara, algo así no?:</p>\n<pre><code>class SuperComponente extends React.Component{\nrender(){\n     return (\n            &lt;h2&gt;Hello with React&lt;/h2&gt;\n            &lt;MiSegundoComponente/&gt;\n        );\n     }\n}\n</code></pre>\n<p>Fijaros que en el return he metido el contenido entre <strong>()</strong>, pero hagamos la prueba.....upssss no carga nada y si abrimos la consola del navegador vemos lo siguiente:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.08.39.png\" alt=\"Error component\"><br>\nBien he puesto este error a propósito para que lo tengamos en cuenta como importante, <strong>TODOS LOS COMPONENTES ES NECESARIO QUE ESTEN DENTRO DE UNA ETIQUETA PADRE</strong>, es decir tienen que ser elementos HTML por si solos. En este caso seria simplemente meterlo todo dentro de un <strong>div</strong>:</p>\n<pre><code>class SuperComponente extends React.Component{\n  render(){\n         return (\n           &lt;div&gt;\n             &lt;h2&gt;Hello with React&lt;/h2&gt;\n             &lt;MiSegundoComponente/&gt;\n           &lt;/div&gt;\n        );\n   }\n }\n</code></pre>\n<p>Y ahora ya si nos funcionaria:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.13.47.png\" alt=\"Two Components\"></p>\n<p>Como véis el uso de React es bastante fácil solo tenemos que tener unas pequeñas cosas en cuenta, como por ejemplo que los componentes tengan que estar encapsulados dentro de una etiqueta principal para que funcionen.</p>\n<p>Y hasta aquí este post introductorio de React, os animo a seguir los siguientes si queréis aprender al mismo tiempo que yo a usar React, nos vemos en el siguiente.</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/react-superhero-introduccion/","canonical_url":null,"uuid":"82052b61-c7f7-43d3-9925-93d88de7f937","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"39","reading_time":5,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Empiezo nueva sección en el blog (tenía muchísimas ganas de empezar con React).</p>\n<p>Os cuento un poco que es esto:</p>\n<ul>\n<li>Esta desarrollado por Facebook que aunque no lo parezca nos da algo de confianza en cuanto a su durabilidad a la larga y su estabilidad.</li>\n<li>Se centra mucho en la parte de UI, es decir seria la V del MVC.</li>\n<li>Es muy útil para construir grandes aplicaciones que cambian con el tiempo.</li>\n<li>Gracias a su <strong>Virtual DOM</strong> el rendimiento no se ve severamente afectado cuando la información necesita actualizarse.</li>\n<li>Se basa en componentes, haciéndolos reutilizables fácilmente.</li>\n<li>Lo podemos integrar a cualquier API.</li>\n<li>Y es JavaScript :)</li>\n<li>Se puede integrar con Node, Ruby o cualquier otro lenguaje de backend.</li>\n<li>Tiene framework para mobile (<strong>React Native</strong>, que lo venden como 'nativo'), que será lo siguiente que veremos cuando terminemos con el básico ;)</li>\n<li>Usa <strong>JSX</strong> que es una especie de lenguaje tipo XML para crear nuestros componentes. Básicamente nos permite usar código HTML en variables de JS. Tenéis mas información sobre esto en la pagina oficial de <a href=\"https://facebook.github.io/react/docs/introducing-jsx.html\">React</a>.</li>\n</ul>\n<p>Suena bien no?? A mi me encanta:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/1839631-catom_cv1-1.jpg\" alt=\"Captian Atom\"></p>\n<p>Para trabajar con React necesitamos agregar mínimo 3 librerías a nuestro proyecto, es decir a nuestro index.html</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;!-- Libreria para trabajar con React -->\n&#x3C;script src=\"https://unpkg.com/react@latest/dist/react.js\">&#x3C;/script>\n&#x3C;!-- Libreria de react para trabajar con el Dom-->\n&#x3C;script src=\"https://unpkg.com/react-dom@latest/dist/react-dom.js\">&#x3C;/script>\n&#x3C;!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no funcione en todos -->\n&#x3C;script src=\"https://unpkg.com/babel-standalone@6.15.0/babel.min.js\">&#x3C;/script>\n</code></pre></div>\n<p>Bien con esto ya tenemos lo básico para trabajar con React. Como extra yo me descargado un plugin para <strong>Visual Studio Code</strong> para que reconozca el trabajo con babel en su momento. No es en absoluto necesario.</p>\n<p>Pues bien antes de continuar hagamos una prueba para comprobar que todo funciona bien, si alguno ha trabajado o conoce un poco Angular vera como ciertos conceptos con parecidos.</p>\n<p>Vamos a añadir una cabecera a nuestro fichero HTML usando React, para ello incluimos lo siguiente:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;script type=\"text/babel\">\n        ReactDOM.render(\n          &#x3C;h2>Hello with React&#x3C;/h2>,\n          document.getElementById('root');\n        );\n&#x3C;/script>\n</code></pre></div>\n<p>Como vemos usamos en lugar de nuestro <strong>text/javascript</strong> típico, hemos puesto <strong>babel</strong> para que reconozca que tiene que usar babel. Y a continuación le indicamos que renderice en nuestro DOM el HTML que le pasamos, pero......¿donde? bien aquí es donde viene un concepto similar a angular. En Angular 1.5 por ejemplo teníamos nuestro ng-app:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;body ng-app=\"appName\">\n</code></pre></div>\n<p>Donde le indicabamos donde empezaba a funcionar nuestra WebAPP, pues con React el concepto es parecido, si veis en el código superior hemos puesto que busque un elemento con el ID <strong>root</strong>(que podria ser cualquier otro nombre), que sera donde renderice el código, por lo que en algún sitio de nuestro código html tenemos que añadirlo jejejejje</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;div id=\"root\">&#x3C;/div>\n</code></pre></div>\n<p>Bien y si todo ha ido bien tendríamos que tener algo similar a esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-14.23.56.png\" alt=\"React Hello\"><br>\nPerfecto, como prueba de concepto esta bien, pero realmente así no se trabaja con React, es un lenguaje basado en componentes por lo que vamos a empezar por crear nuestro primer componente.</p>\n<h2 id=\"primercomponente\">Primer Componente</h2>\n<p>Nuestro primer componente solo para ver de una forma rápida y facil como se harían, lo crearemos en el mismo index.html, dentro de nuestra etiqueta <strong>script</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;script type=\"text/babel\">\nclass Supercomponente extends React.Component{\n      render(){\n          return &#x3C;h2>Hello with React&#x3C;/h2>;\n      }\n}\n</code></pre></div>\n<p>Como veis hemos creado una clase <strong>Principal (Ojo el nombre tiene que empezar en mayúsculas mas abajo veremos porque, y normalmente usamos inglés para los nombres, solo he puesto ese superNombre para que quede claro)</strong>, la cual extiende de <strong>React.Component</strong>. Luego simplemente creamos un método <strong>render</strong> que devuelve el mismo código que teníamos antes, pero... y como lo llamamos, bien aqui viene el porque de las <strong>mayúsculas</strong> al crear el componente.<br>\nLos componentes pasan a ser etiquetas al estilo HTML y las ponemos en mayúsculas para diferenciarlas de las etiquetas normales, quedando la llamada al componente de esta manera:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">ReactDOM.render(\n   &#x3C;SuperComponente/>,\n   document.getElementById('root')\n);\n</code></pre></div>\n<p>Ponemos la etiqueta (importante cerrándola al final), y con esto debería funcionarnos igual que antes, y ya habríamos creado y usado nuestro primer componente.</p>\n<p>Fácil verdad?  Bien como importante recordar que un componente siempre tiene que tener un método <strong>render</strong> y que en las llamadas del ReactDOM, solo repito <strong>solo</strong> podemos pasarle un componente. Y ahora viene cuando nos deberíamos preguntar, ¿Y como hago para usar varios componentes unos con otros?¿No me digas que tenemos que hacer para todos un <strong>ReactDOM.render</strong>?......Pues no, no es necesario, realmente podemos integrar unos componentes con otros, pero a nivel de componentes, es decir, un componente puede tener y devolver otros componentes, vamos a crear otro componente y hagamos la prueba</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class MiSegundoComponente extends React.Component{\n       render(){\n            return &#x3C;h2>REACT is in the HOUSE...YEAH!!!!&#x3C;/h2>\n       }\n}\n</code></pre></div>\n<p>Ya tenemos otro componente y para llamarlo, lo hacemos desde el primero como si de otra etiqueta HTML normal se tratara, algo así no?:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class SuperComponente extends React.Component{\nrender(){\n     return (\n            &#x3C;h2>Hello with React&#x3C;/h2>\n            &#x3C;MiSegundoComponente/>\n        );\n     }\n}\n</code></pre></div>\n<p>Fijaros que en el return he metido el contenido entre <strong>()</strong>, pero hagamos la prueba.....upssss no carga nada y si abrimos la consola del navegador vemos lo siguiente:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.08.39.png\" alt=\"Error component\"><br>\nBien he puesto este error a propósito para que lo tengamos en cuenta como importante, <strong>TODOS LOS COMPONENTES ES NECESARIO QUE ESTEN DENTRO DE UNA ETIQUETA PADRE</strong>, es decir tienen que ser elementos HTML por si solos. En este caso seria simplemente meterlo todo dentro de un <strong>div</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class SuperComponente extends React.Component{\n  render(){\n         return (\n           &#x3C;div>\n             &#x3C;h2>Hello with React&#x3C;/h2>\n             &#x3C;MiSegundoComponente/>\n           &#x3C;/div>\n        );\n   }\n }\n</code></pre></div>\n<p>Y ahora ya si nos funcionaria:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.13.47.png\" alt=\"Two Components\"></p>\n<p>Como véis el uso de React es bastante fácil solo tenemos que tener unas pequeñas cosas en cuenta, como por ejemplo que los componentes tengan que estar encapsulados dentro de una etiqueta principal para que funcionen.</p>\n<p>Y hasta aquí este post introductorio de React, os animo a seguir los siguientes si queréis aprender al mismo tiempo que yo a usar React, nos vemos en el siguiente.</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Empiezo nueva sección en el blog (tenía muchísimas ganas de empezar con React)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Os cuento un poco que es esto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Esta desarrollado por Facebook que aunque no lo parezca nos da algo de confianza en cuanto a su durabilidad a la larga y su estabilidad."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Se centra mucho en la parte de UI, es decir seria la V del MVC."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Es muy útil para construir grandes aplicaciones que cambian con el tiempo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Gracias a su "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Virtual DOM"}]},{"type":"text","value":" el rendimiento no se ve severamente afectado cuando la información necesita actualizarse."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Se basa en componentes, haciéndolos reutilizables fácilmente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Lo podemos integrar a cualquier API."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Y es JavaScript :)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Se puede integrar con Node, Ruby o cualquier otro lenguaje de backend."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Tiene framework para mobile ("},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"React Native"}]},{"type":"text","value":", que lo venden como 'nativo'), que será lo siguiente que veremos cuando terminemos con el básico ;)"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"text","value":"Usa "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"JSX"}]},{"type":"text","value":" que es una especie de lenguaje tipo XML para crear nuestros componentes. Básicamente nos permite usar código HTML en variables de JS. Tenéis mas información sobre esto en la pagina oficial de "},{"type":"element","tagName":"a","properties":{"href":"https://facebook.github.io/react/docs/introducing-jsx.html"},"children":[{"type":"text","value":"React"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Suena bien no?? A mi me encanta:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/1839631-catom_cv1-1.jpg","alt":"Captian Atom"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para trabajar con React necesitamos agregar mínimo 3 librerías a nuestro proyecto, es decir a nuestro index.html"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<!-- Libreria para trabajar con React -->\n<script src=\"https://unpkg.com/react@latest/dist/react.js\"></script>\n<!-- Libreria de react para trabajar con el Dom-->\n<script src=\"https://unpkg.com/react-dom@latest/dist/react-dom.js\"></script>\n<!--Preprocesador para traducir lo que escribimos a todos los navegadores ya que react funciona con ECS6 y puede que no funcione en todos -->\n<script src=\"https://unpkg.com/babel-standalone@6.15.0/babel.min.js\"></script>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien con esto ya tenemos lo básico para trabajar con React. Como extra yo me descargado un plugin para "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Visual Studio Code"}]},{"type":"text","value":" para que reconozca el trabajo con babel en su momento. No es en absoluto necesario."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Pues bien antes de continuar hagamos una prueba para comprobar que todo funciona bien, si alguno ha trabajado o conoce un poco Angular vera como ciertos conceptos con parecidos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vamos a añadir una cabecera a nuestro fichero HTML usando React, para ello incluimos lo siguiente:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<script type=\"text/babel\">\n        ReactDOM.render(\n          <h2>Hello with React</h2>,\n          document.getElementById('root');\n        );\n</script>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos usamos en lugar de nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"text/javascript"}]},{"type":"text","value":" típico, hemos puesto "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"babel"}]},{"type":"text","value":" para que reconozca que tiene que usar babel. Y a continuación le indicamos que renderice en nuestro DOM el HTML que le pasamos, pero......¿donde? bien aquí es donde viene un concepto similar a angular. En Angular 1.5 por ejemplo teníamos nuestro ng-app:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<body ng-app=\"appName\">\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Donde le indicabamos donde empezaba a funcionar nuestra WebAPP, pues con React el concepto es parecido, si veis en el código superior hemos puesto que busque un elemento con el ID "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"root"}]},{"type":"text","value":"(que podria ser cualquier otro nombre), que sera donde renderice el código, por lo que en algún sitio de nuestro código html tenemos que añadirlo jejejejje"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<div id=\"root\"></div>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien y si todo ha ido bien tendríamos que tener algo similar a esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-14.23.56.png","alt":"React Hello"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPerfecto, como prueba de concepto esta bien, pero realmente así no se trabaja con React, es un lenguaje basado en componentes por lo que vamos a empezar por crear nuestro primer componente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"primercomponente"},"children":[{"type":"text","value":"Primer Componente"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nuestro primer componente solo para ver de una forma rápida y facil como se harían, lo crearemos en el mismo index.html, dentro de nuestra etiqueta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"script"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<script type=\"text/babel\">\nclass Supercomponente extends React.Component{\n      render(){\n          return <h2>Hello with React</h2>;\n      }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como veis hemos creado una clase "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Principal (Ojo el nombre tiene que empezar en mayúsculas mas abajo veremos porque, y normalmente usamos inglés para los nombres, solo he puesto ese superNombre para que quede claro)"}]},{"type":"text","value":", la cual extiende de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"React.Component"}]},{"type":"text","value":". Luego simplemente creamos un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"render"}]},{"type":"text","value":" que devuelve el mismo código que teníamos antes, pero... y como lo llamamos, bien aqui viene el porque de las "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mayúsculas"}]},{"type":"text","value":" al crear el componente."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLos componentes pasan a ser etiquetas al estilo HTML y las ponemos en mayúsculas para diferenciarlas de las etiquetas normales, quedando la llamada al componente de esta manera:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"ReactDOM.render(\n   <SuperComponente/>,\n   document.getElementById('root')\n);\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ponemos la etiqueta (importante cerrándola al final), y con esto debería funcionarnos igual que antes, y ya habríamos creado y usado nuestro primer componente."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fácil verdad?  Bien como importante recordar que un componente siempre tiene que tener un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"render"}]},{"type":"text","value":" y que en las llamadas del ReactDOM, solo repito "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"solo"}]},{"type":"text","value":" podemos pasarle un componente. Y ahora viene cuando nos deberíamos preguntar, ¿Y como hago para usar varios componentes unos con otros?¿No me digas que tenemos que hacer para todos un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ReactDOM.render"}]},{"type":"text","value":"?......Pues no, no es necesario, realmente podemos integrar unos componentes con otros, pero a nivel de componentes, es decir, un componente puede tener y devolver otros componentes, vamos a crear otro componente y hagamos la prueba"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class MiSegundoComponente extends React.Component{\n       render(){\n            return <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n       }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya tenemos otro componente y para llamarlo, lo hacemos desde el primero como si de otra etiqueta HTML normal se tratara, algo así no?:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class SuperComponente extends React.Component{\nrender(){\n     return (\n            <h2>Hello with React</h2>\n            <MiSegundoComponente/>\n        );\n     }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Fijaros que en el return he metido el contenido entre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"()"}]},{"type":"text","value":", pero hagamos la prueba.....upssss no carga nada y si abrimos la consola del navegador vemos lo siguiente:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.08.39.png","alt":"Error component"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien he puesto este error a propósito para que lo tengamos en cuenta como importante, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"TODOS LOS COMPONENTES ES NECESARIO QUE ESTEN DENTRO DE UNA ETIQUETA PADRE"}]},{"type":"text","value":", es decir tienen que ser elementos HTML por si solos. En este caso seria simplemente meterlo todo dentro de un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"div"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class SuperComponente extends React.Component{\n  render(){\n         return (\n           <div>\n             <h2>Hello with React</h2>\n             <MiSegundoComponente/>\n           </div>\n        );\n   }\n }\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y ahora ya si nos funcionaria:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/07/Screen-Shot-2017-07-29-at-19.13.47.png","alt":"Two Components"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis el uso de React es bastante fácil solo tenemos que tener unas pequeñas cosas en cuenta, como por ejemplo que los componentes tengan que estar encapsulados dentro de una etiqueta principal para que funcionen."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y hasta aquí este post introductorio de React, os animo a seguir los siguientes si queréis aprender al mismo tiempo que yo a usar React, nos vemos en el siguiente."}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"primercomponente","heading":"Primer Componente"}]},"featureImageSharp":{"base":"Captain-Atom.jpg","publicURL":"/static/ea41313c22f611d45d277d453c4273d1/Captain-Atom.jpg","imageMeta":{"width":864,"height":648},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBv/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/aAAwDAQACEAMQAAABojay1bnBz//EABkQAQACAwAAAAAAAAAAAAAAAAECAwARE//aAAgBAQABBQKoAmdchqqPFMlZGuC7f//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEiH/2gAIAQMBAT8BONov/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERE0H/2gAIAQIBAT8BbK50/8QAHhAAAwAABwEAAAAAAAAAAAAAAAERAhIiMTJRUmH/2gAIAQEABj8C0x9lWxlq+j9ImHkVn//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExQf/aAAgBAQABPyHlOmjsuNqMAiJQe2TspkuwMcZ4otX5GdLXWf/aAAwDAQACAAMAAAAQy/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBB/9oACAEDAQE/ECLJZf/EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAgEBPxBJcpVz/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBUWHR/9oACAEBAAE/ECGZHOFc9RXVMNQfYPyzYFbcsWTgugFwsFDeqNnrnxyXBPYm2f/Z","aspectRatio":1.3358778625954197,"src":"/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom.jpg","srcSet":"/static/ea41313c22f611d45d277d453c4273d1/477ba/Captain-Atom.jpg 175w,\n/static/ea41313c22f611d45d277d453c4273d1/06776/Captain-Atom.jpg 350w,\n/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom.jpg 700w,\n/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom.jpg 864w","srcWebp":"/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom.webp","srcSetWebp":"/static/ea41313c22f611d45d277d453c4273d1/9fca7/Captain-Atom.webp 175w,\n/static/ea41313c22f611d45d277d453c4273d1/37a4e/Captain-Atom.webp 350w,\n/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom.webp 700w,\n/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom.webp 864w","sizes":"(max-width: 700px) 100vw, 700px"}}}},"allGhostPost":{"edges":[{"node":{"id":"Ghost__Post__5a338158333e0f134c248f2a","title":"React Superhero (V): Mobx","slug":"react-superhero-v-mobx","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Captain-Atom-1.jpg","excerpt":"En este post hablaremos de una librería muy útil llamada Mobx que entre otras\ncosas nos facilita un poco el desarrollo en cuanto a la comunicación entre\ncomponentes se refiere, es decir, ya hemos visto un poco como comunicarnos de un\ncomponente a otro para realizar alguna modificación en alguna propiedad, pues\nbien Mobx nos facilita este planteamiento (entre otras cosas claro ;) ). Si\nqueréis algo más de información aqui tenéis la página oficial de Mobx\n[https://mobx.js.org/]\n\nInstalación\nPara i","custom_excerpt":null,"visibility":"public","created_at_pretty":"6 Sep 2017","published_at_pretty":"12 Sep 2017","updated_at_pretty":"22 Jan 2018","created_at":"2017-09-06T21:51:25.000+02:00","published_at":"2017-09-12T10:09:00.000+02:00","updated_at":"2018-01-22T09:48:46.000+01:00","meta_title":null,"meta_description":"Veremos una librería muy útil que se usa mucho en React. Esta librería nos facilita la comunicación entre componentes.","og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null},"tags":[{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null}],"plaintext":"En este post hablaremos de una librería muy útil llamada Mobx que entre otras\ncosas nos facilita un poco el desarrollo en cuanto a la comunicación entre\ncomponentes se refiere, es decir, ya hemos visto un poco como comunicarnos de un\ncomponente a otro para realizar alguna modificación en alguna propiedad, pues\nbien Mobx nos facilita este planteamiento (entre otras cosas claro ;) ). Si\nqueréis algo más de información aqui tenéis la página oficial de Mobx\n[https://mobx.js.org/]\n\nInstalación\nPara instalar mobx usaremos nuestro magnífico npm:\n\nnpm install mobx mobx-react --save\n\n\nEsto nos instalará en el proyecto los módulos de NodeJS necesarios para poder\ntrabajar con Mobx\n\nUsando Mobx\nBien vamos a empezar a partir de la estructura de proyecto que teniamos en el\npost anterior (tras ejecutar nuestro create-app....).\nVamos a trabajar sobre el fichero App.js que es el componente que se esta\nrendeando por defecto, pero vamos a cambiarlo un poco y asi vemos que realmente\nestamos en este punto, vamos a cambiar la frase que aparece debajo de Welcome to\nReact para indicar que trabajaremos despues de esa linea:\n\nimport React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n         We started working below this line\n        </p>\n      </div>\n    );\n  }\n}\n\nexport default App;\n\n\nTras guardar, automáticamente tendriamos algo similar a\n\nBien ya sabemos donde estamos, ahora haremos un ejemplo simple para ver que es\nlo que conseguimos con Mobx, vamos a mostrar un número y este aumentará cuando\npulsemos un botón.\nPrimero mostremos nuestro número, en un principio es algo sencillo que ya hemos\nvisto no?, creamos un componente nuevo y lo indicamos en el componente que se\nesta renderizando como principal no??...... si esa es una opción pero al final\nestaríamos haciendo lo mismo que ya hemos visto y entonces para que queremos \nmobx no??. Pues bien la teoría del componente es válida a medias, vamos a crear\nuna clase y en esta tenemos que importar extendObservable de la librería de mobx\n. Yo le he puesto el nombre FirstMobxClass.js y esto es lo que ponemos\n\nimport {extendObservable} from 'mobx'\n\nclass FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        })\n    }\n}\n\n//Creamos una nueva instancia de nuestra clase,la almacenamos\n// y la exportamos para que se tenga acceso desde fuera\n//de esta clase\nvar numberMobxClass = new FirstMobxClass();\n\nexport default numberMobxClass;\n\n\nCon esto tendríamos una variable con una propiedad number que deberíamos poder\nusar. Para ello volvamos a nuestra clase App.js y ponemos lo siguiente:\n\nimport React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n         We started working below this line\n        </p>\n        <h2>{ numberMobxClass.number }</h2>\n      </div>\n    );\n  }\n}\n\nexport default App;\n\n\nPara diferenciar los imports que ya teniamos de los nuevos he indicado el\ncomentario our imports. Como véis lo que importamos es nuestra variable del\nfichero con nombre FirstMobxClass y para usarlo nos valemos de las magias del\nlenguaje JSX y con poner\n\n<h2>{ numberMobxClass.number }</h2>\n\n\nYa tendríamos nuestra linea con el número que hemos puesto\n\n\nLo siguiente será crear nuestro botón, en este caso seguimos la teoría inicial\nde los componentes que ya sabíamos, me refiero a que lo creamos como un\ncomponente normal. Creamos el fichero IncreaseNumber.js\n\nimport React, { Component } from 'react';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        <button>Increase Number</button>\n        )\n    }\n}\n\nexport default IncreaseNumber;\n\n\nDe momento nada nuevo, para verlo lo importamos en App.js y lo ponemos a\ncontinuación, es decir ahora en App.js debajo de Our imports añadimos un import\nmás debajo del numberMobxClass\n\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\n\n\nY luego debajo de nuestro número le ponemos el botón\n\n<h2>{ numberMobxClass.number }</h2>\n<IncreaseNumber/>\n\n\nY al guardar ya veríamos nuestro botón\n\nPero aunque pulsemos de momento no hace nada no??....continuemos ahora para\nañadirle funcionalidad. Al igual que haciamos antes necesitamos un método que\nhaga que aumente nuestro número, y al igual que haciamos antes lo mejor es que\nlo creemos en el mismo punto que donde tenemos nuestra propiedad. Esto es tan\nsimple como sumarle 1 al número, es decir añadimos a nuestra clase \nFirstMobxClass el método increase\n\nclass FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        });\n    }\n    increase(){\n        this.number = this.number + 1;\n    }\n}\n\n\nYa tenemos nuestro método ahora indiquemosle a nuestro botón que tiene que\nusarlo, probemos a ponerlo directamente con un onClick en el componente \nIncreaseNumber\n\nimport React, { Component } from 'react';\nimport numberMobxClass from './FirstMobxClass';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        <button onClick={numberMobxClass.increase} >Increase Number</button>\n        )\n    }\n}\n\nexport default IncreaseNumber;\n\n\nSi os fijáis hemos importado nuestra clase numberMobxClass y hemos usado nuestro\nmétodo increase directamente en el onClick, bien si guardamos vemos que la\npágina renderiza bien pero que pasa si pulsamos.......UPSSS!!!\n\nVemos que nos sale este error, y eso es como os podéis imaginar que this no\ntiene nada, diréis \"pues entonces podemos ponerle un bind igual que haciamos\nantes y ya esta\", bueno pues vamos a probarlo a ver que pasa y de paso le\nponemos al método increase un log para ver que tiene this.\nEl método increase ahora quedaria así\n\nincrease(){\n    console.log(this);\n    this.number = this.number + 1;\n}\n\n\nY nuestro onClick\n\n<button onClick={numberMobxClass.increase.bind(this)} >Increase Number</button>\n\n\nVeamos que pasa cuando pulsamos\n\nNo nos da error pero si nos fijamos en lo que nos devuelve nuestro log, la\npropiedad number es NaN y eso ¿por qué? Pues porque realmente estamos pasando\ncon bind el this de nuestro componente IncreaseNumber el cual no tiene esa\npropiedad, hagamos un pequeño ejemplo para verlo, creemos una propiedad en el\ncomponente IncreaseNumber como hemos visto en anteriores post y veamos el log\nahora.\nEl componente IncreaseNumber quedaria asi\n\nclass IncreaseNumber extends Component {\n    constructor(){\n        super();\n        this.test = 2;\n        \n    }\n    render(){\n        return(\n        <button onClick={numberMobxClass.increase.bind(this)} >Increase Number</button>\n        )\n    }\n}\n\n\nY al pulsar tenemos este log\n\nSi os fijáis number sigue siendo NaN pero sin embargo tenemos nuestra propiedad \ntest con el valor que hemos puesto, entonces quiere decir que estamos pasando el \ncontexto del componente IncreaseNumber.... y entonces como lo hacemos??...Es más\nfácil de lo que parece, onClick espera una función no?, pues simplemente usemos\nuna función que cada vez que se use esta \"llame\" a nuestro método increase (al\nestilo típico de la programación habitual)\nCon esta teoría nuestro onClick quedaría así\n\n<button onClick={() => numberMobxClass.increase()} >Increase Number</button>\n\n\nVeamos lo que tiene this ahora\n\nAnda!! Ahora nuestro number si aumenta pero..... en nuestra página no se\nve.....y eso?? bueno la explicación es sencilla no estamos \"observando\" la\npropiedad para que responda los cambios y como hacemos eso?...Fácil, importamos \nobserver de la libreria mobx-react y le indicamos que observe donde estamos\nrenderizando, es decir en App.js, por lo que el componente quedaría asi\n\nimport React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\nimport { observer } from 'mobx-react';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n         We started working below this line\n        </p>\n        <h2>{ numberMobxClass.number }</h2>\n        <IncreaseNumber/>\n      </div>\n    );\n  }\n}\n\nexport default observer(App);\n\n\nY voilá ya tenemos nuestro numero aumentando en nuestra página\n\n\nEspero que quede más o menos claro como estamos usando la característica \nobservable que nos proporciona Mobx, que realmente nos facilita un poco estar\npendiente de los estados o cambios de nuestras propiedades.\n\nEn el siguiente post seguiremos viendo que más cosas podemos hacer con Mobx, nos\nvemos, un abrazooorrrrrr","html":"<!--kg-card-begin: markdown--><p>En este post hablaremos de una librería muy útil llamada <strong>Mobx</strong> que entre otras cosas nos facilita un poco el desarrollo en cuanto a la comunicación entre componentes se refiere, es decir, ya hemos visto un poco como comunicarnos de un componente a otro para realizar alguna modificación en alguna propiedad, pues bien <strong>Mobx</strong> nos facilita este planteamiento (entre otras cosas claro ;) ). Si queréis algo más de información aqui tenéis la página oficial de <a href=\"https://mobx.js.org/\">Mobx</a></p>\n<h3 id=\"instalacin\">Instalación</h3>\n<p>Para instalar <strong>mobx</strong> usaremos nuestro magnífico <strong>npm</strong>:</p>\n<pre><code>npm install mobx mobx-react --save\n</code></pre>\n<p>Esto nos instalará en el proyecto los módulos de NodeJS necesarios para poder trabajar con <strong>Mobx</strong></p>\n<h3 id=\"usandomobx\">Usando Mobx</h3>\n<p>Bien vamos a empezar a partir de la estructura de proyecto que teniamos en el post anterior (tras ejecutar nuestro create-app....).<br>\nVamos a trabajar sobre el fichero <strong>App.js</strong> que es el componente que se esta rendeando por defecto, pero vamos a cambiarlo un poco y asi vemos que realmente estamos en este punto, vamos a cambiar la frase que aparece debajo de <strong>Welcome to React</strong> para indicar que trabajaremos despues de esa linea:</p>\n<pre><code>import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      &lt;div className=&quot;App&quot;&gt;\n        &lt;div className=&quot;App-header&quot;&gt;\n          &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;\n          &lt;h2&gt;Welcome to React&lt;/h2&gt;\n        &lt;/div&gt;\n        &lt;p className=&quot;App-intro&quot;&gt;\n         We started working below this line\n        &lt;/p&gt;\n      &lt;/div&gt;\n    );\n  }\n}\n\nexport default App;\n</code></pre>\n<p>Tras guardar, automáticamente tendriamos algo similar a<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-13.37.40.png\" alt=\"Started working\"><br>\nBien ya sabemos donde estamos, ahora haremos un ejemplo simple para ver que es lo que conseguimos con <strong>Mobx</strong>, vamos a mostrar un número y este aumentará cuando pulsemos un botón.<br>\nPrimero mostremos nuestro número, en un principio es algo sencillo que ya hemos visto no?, creamos un componente nuevo y lo indicamos en el componente que se esta renderizando como principal no??...... si esa es una opción pero al final estaríamos haciendo lo mismo que ya hemos visto y entonces para que queremos <strong>mobx</strong> no??. Pues bien la teoría del componente es válida a medias, vamos a crear una clase y en esta tenemos que importar <strong>extendObservable</strong> de la librería de <strong>mobx</strong>. Yo le he puesto el nombre <strong>FirstMobxClass.js</strong> y esto es lo que ponemos</p>\n<pre><code>import {extendObservable} from 'mobx'\n\nclass FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        })\n    }\n}\n\n//Creamos una nueva instancia de nuestra clase,la almacenamos\n// y la exportamos para que se tenga acceso desde fuera\n//de esta clase\nvar numberMobxClass = new FirstMobxClass();\n\nexport default numberMobxClass;\n</code></pre>\n<p>Con esto tendríamos una variable con una propiedad number que deberíamos poder usar. Para ello volvamos a nuestra clase App.js y ponemos lo siguiente:</p>\n<pre><code>import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\n\nclass App extends Component {\n  render() {\n    return (\n      &lt;div className=&quot;App&quot;&gt;\n        &lt;div className=&quot;App-header&quot;&gt;\n          &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;\n          &lt;h2&gt;Welcome to React&lt;/h2&gt;\n        &lt;/div&gt;\n        &lt;p className=&quot;App-intro&quot;&gt;\n         We started working below this line\n        &lt;/p&gt;\n        &lt;h2&gt;{ numberMobxClass.number }&lt;/h2&gt;\n      &lt;/div&gt;\n    );\n  }\n}\n\nexport default App;\n</code></pre>\n<p>Para diferenciar los imports que ya teniamos de los nuevos he indicado el comentario <strong>our imports</strong>. Como véis lo que importamos es nuestra variable del fichero con nombre <strong>FirstMobxClass</strong> y para usarlo nos valemos de las magias del lenguaje <strong>JSX</strong> y con poner</p>\n<pre><code>&lt;h2&gt;{ numberMobxClass.number }&lt;/h2&gt;\n</code></pre>\n<p>Ya tendríamos nuestra linea con el número que hemos puesto<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.01.56.png\" alt=\"FirstMobx\"></p>\n<p>Lo siguiente será crear nuestro botón, en este caso seguimos la teoría inicial de los componentes que ya sabíamos, me refiero a que lo creamos como un componente normal. Creamos el fichero <strong>IncreaseNumber.js</strong></p>\n<pre><code>import React, { Component } from 'react';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        &lt;button&gt;Increase Number&lt;/button&gt;\n        )\n    }\n}\n\nexport default IncreaseNumber;\n</code></pre>\n<p>De momento nada nuevo, para verlo lo importamos en <strong>App.js</strong> y lo ponemos a continuación, es decir ahora en App.js debajo de <strong>Our imports</strong> añadimos un import más debajo del <strong>numberMobxClass</strong></p>\n<pre><code>//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\n</code></pre>\n<p>Y luego debajo de nuestro número le ponemos el botón</p>\n<pre><code>&lt;h2&gt;{ numberMobxClass.number }&lt;/h2&gt;\n&lt;IncreaseNumber/&gt;\n</code></pre>\n<p>Y al guardar ya veríamos nuestro botón<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.12.23.png\" alt=\"NewButton\"><br>\nPero aunque pulsemos de momento no hace nada no??....continuemos ahora para añadirle funcionalidad. Al igual que haciamos antes necesitamos un método que haga que aumente nuestro número, y al igual que haciamos antes lo mejor es que lo creemos en el mismo punto que donde tenemos nuestra propiedad. Esto es tan simple como sumarle 1 al número, es decir añadimos a nuestra clase <strong>FirstMobxClass</strong> el método <strong>increase</strong></p>\n<pre><code>class FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        });\n    }\n    increase(){\n        this.number = this.number + 1;\n    }\n}\n</code></pre>\n<p>Ya tenemos nuestro método ahora indiquemosle a nuestro botón que tiene que usarlo, probemos a ponerlo directamente con un <strong>onClick</strong> en el componente <strong>IncreaseNumber</strong></p>\n<pre><code>import React, { Component } from 'react';\nimport numberMobxClass from './FirstMobxClass';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        &lt;button onClick={numberMobxClass.increase} &gt;Increase Number&lt;/button&gt;\n        )\n    }\n}\n\nexport default IncreaseNumber;\n</code></pre>\n<p>Si os fijáis hemos importado nuestra clase <strong>numberMobxClass</strong> y hemos usado nuestro método <strong>increase</strong> directamente en el <strong>onClick</strong>, bien si guardamos vemos que la página renderiza bien pero que pasa si pulsamos.......UPSSS!!!<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.33.03.png\" alt=\"Error this==null\"><br>\nVemos que nos sale este error, y eso es  como os podéis imaginar que <strong>this</strong> no tiene nada, diréis &quot;pues entonces podemos ponerle un <strong>bind</strong> igual que haciamos antes y ya esta&quot;, bueno pues vamos a probarlo a ver que pasa y de paso le ponemos al método <strong>increase</strong> un log para ver que tiene <strong>this</strong>.<br>\nEl método <strong>increase</strong> ahora quedaria así</p>\n<pre><code>increase(){\n    console.log(this);\n    this.number = this.number + 1;\n}\n</code></pre>\n<p>Y nuestro <strong>onClick</strong></p>\n<pre><code>&lt;button onClick={numberMobxClass.increase.bind(this)} &gt;Increase Number&lt;/button&gt;\n</code></pre>\n<p>Veamos que pasa cuando pulsamos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.37.48.png\" alt=\"Log with this\"><br>\nNo nos da error pero si nos fijamos en lo que nos devuelve nuestro log, la propiedad <strong>number</strong> es <strong>NaN</strong> y eso ¿por qué? Pues porque realmente estamos pasando con <strong>bind</strong> el <strong>this</strong> de nuestro componente <strong>IncreaseNumber</strong> el cual no tiene esa propiedad, hagamos un pequeño ejemplo para verlo, creemos una propiedad en el componente <strong>IncreaseNumber</strong> como hemos visto en anteriores post y veamos el log ahora.<br>\nEl componente <strong>IncreaseNumber</strong> quedaria asi</p>\n<pre><code>class IncreaseNumber extends Component {\n    constructor(){\n        super();\n        this.test = 2;\n        \n    }\n    render(){\n        return(\n        &lt;button onClick={numberMobxClass.increase.bind(this)} &gt;Increase Number&lt;/button&gt;\n        )\n    }\n}\n</code></pre>\n<p>Y al pulsar tenemos este log<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.47.11.png\" alt=\"Testing this context\"><br>\nSi os fijáis <strong>number</strong> sigue siendo <strong>NaN</strong> pero sin embargo tenemos nuestra propiedad <strong>test</strong> con el valor que hemos puesto, entonces quiere decir que estamos pasando el <strong>contexto</strong> del componente <strong>IncreaseNumber</strong>.... y entonces como lo hacemos??...Es más fácil de lo que parece, <strong>onClick</strong> espera una función no?, pues simplemente usemos una función que cada vez que se use esta &quot;llame&quot; a nuestro método <strong>increase</strong> (al estilo típico de la programación habitual)<br>\nCon esta teoría nuestro <strong>onClick</strong> quedaría así</p>\n<pre><code>&lt;button onClick={() =&gt; numberMobxClass.increase()} &gt;Increase Number&lt;/button&gt;\n</code></pre>\n<p>Veamos lo que tiene <strong>this</strong> ahora<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.52.52.png\" alt=\"Log with number increase\"><br>\nAnda!! Ahora nuestro <strong>number</strong> si aumenta pero..... en nuestra página no se ve.....y eso?? bueno la explicación es sencilla no estamos <strong>&quot;observando&quot;</strong> la propiedad para que responda los cambios y como hacemos eso?...Fácil, importamos <strong>observer</strong> de la libreria <strong>mobx-react</strong> y le indicamos que observe donde estamos renderizando, es decir en <strong>App.js</strong>, por lo que el componente quedaría asi</p>\n<pre><code>import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\nimport { observer } from 'mobx-react';\n\nclass App extends Component {\n  render() {\n    return (\n      &lt;div className=&quot;App&quot;&gt;\n        &lt;div className=&quot;App-header&quot;&gt;\n          &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;\n          &lt;h2&gt;Welcome to React&lt;/h2&gt;\n        &lt;/div&gt;\n        &lt;p className=&quot;App-intro&quot;&gt;\n         We started working below this line\n        &lt;/p&gt;\n        &lt;h2&gt;{ numberMobxClass.number }&lt;/h2&gt;\n        &lt;IncreaseNumber/&gt;\n      &lt;/div&gt;\n    );\n  }\n}\n\nexport default observer(App);\n</code></pre>\n<p>Y voilá ya tenemos nuestro numero aumentando en nuestra página<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-15.00.31.png\" alt=\"The meaning of life\"></p>\n<p>Espero que quede más o menos claro como estamos usando la característica <strong>observable</strong> que nos proporciona <strong>Mobx</strong>, que realmente nos facilita un poco estar pendiente de los estados o cambios de nuestras propiedades.</p>\n<p>En el siguiente post seguiremos viendo que más cosas podemos hacer con <strong>Mobx</strong>, nos vemos, un abrazooorrrrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/react-superhero-v-mobx/","canonical_url":null,"uuid":"93502e4c-0ee1-43cb-a96d-cb6751f8ee84","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59b051bd6c31a60001f69f0d","reading_time":7,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>En este post hablaremos de una librería muy útil llamada <strong>Mobx</strong> que entre otras cosas nos facilita un poco el desarrollo en cuanto a la comunicación entre componentes se refiere, es decir, ya hemos visto un poco como comunicarnos de un componente a otro para realizar alguna modificación en alguna propiedad, pues bien <strong>Mobx</strong> nos facilita este planteamiento (entre otras cosas claro ;) ). Si queréis algo más de información aqui tenéis la página oficial de <a href=\"https://mobx.js.org/\">Mobx</a></p>\n<h3 id=\"instalacin\">Instalación</h3>\n<p>Para instalar <strong>mobx</strong> usaremos nuestro magnífico <strong>npm</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm install mobx mobx-react --save\n</code></pre></div>\n<p>Esto nos instalará en el proyecto los módulos de NodeJS necesarios para poder trabajar con <strong>Mobx</strong></p>\n<h3 id=\"usandomobx\">Usando Mobx</h3>\n<p>Bien vamos a empezar a partir de la estructura de proyecto que teniamos en el post anterior (tras ejecutar nuestro create-app....).<br>\nVamos a trabajar sobre el fichero <strong>App.js</strong> que es el componente que se esta rendeando por defecto, pero vamos a cambiarlo un poco y asi vemos que realmente estamos en este punto, vamos a cambiar la frase que aparece debajo de <strong>Welcome to React</strong> para indicar que trabajaremos despues de esa linea:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      &#x3C;div className=\"App\">\n        &#x3C;div className=\"App-header\">\n          &#x3C;img src={logo} className=\"App-logo\" alt=\"logo\" />\n          &#x3C;h2>Welcome to React&#x3C;/h2>\n        &#x3C;/div>\n        &#x3C;p className=\"App-intro\">\n         We started working below this line\n        &#x3C;/p>\n      &#x3C;/div>\n    );\n  }\n}\n\nexport default App;\n</code></pre></div>\n<p>Tras guardar, automáticamente tendriamos algo similar a<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-13.37.40.png\" alt=\"Started working\"><br>\nBien ya sabemos donde estamos, ahora haremos un ejemplo simple para ver que es lo que conseguimos con <strong>Mobx</strong>, vamos a mostrar un número y este aumentará cuando pulsemos un botón.<br>\nPrimero mostremos nuestro número, en un principio es algo sencillo que ya hemos visto no?, creamos un componente nuevo y lo indicamos en el componente que se esta renderizando como principal no??...... si esa es una opción pero al final estaríamos haciendo lo mismo que ya hemos visto y entonces para que queremos <strong>mobx</strong> no??. Pues bien la teoría del componente es válida a medias, vamos a crear una clase y en esta tenemos que importar <strong>extendObservable</strong> de la librería de <strong>mobx</strong>. Yo le he puesto el nombre <strong>FirstMobxClass.js</strong> y esto es lo que ponemos</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import {extendObservable} from 'mobx'\n\nclass FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        })\n    }\n}\n\n//Creamos una nueva instancia de nuestra clase,la almacenamos\n// y la exportamos para que se tenga acceso desde fuera\n//de esta clase\nvar numberMobxClass = new FirstMobxClass();\n\nexport default numberMobxClass;\n</code></pre></div>\n<p>Con esto tendríamos una variable con una propiedad number que deberíamos poder usar. Para ello volvamos a nuestra clase App.js y ponemos lo siguiente:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\n\nclass App extends Component {\n  render() {\n    return (\n      &#x3C;div className=\"App\">\n        &#x3C;div className=\"App-header\">\n          &#x3C;img src={logo} className=\"App-logo\" alt=\"logo\" />\n          &#x3C;h2>Welcome to React&#x3C;/h2>\n        &#x3C;/div>\n        &#x3C;p className=\"App-intro\">\n         We started working below this line\n        &#x3C;/p>\n        &#x3C;h2>{ numberMobxClass.number }&#x3C;/h2>\n      &#x3C;/div>\n    );\n  }\n}\n\nexport default App;\n</code></pre></div>\n<p>Para diferenciar los imports que ya teniamos de los nuevos he indicado el comentario <strong>our imports</strong>. Como véis lo que importamos es nuestra variable del fichero con nombre <strong>FirstMobxClass</strong> y para usarlo nos valemos de las magias del lenguaje <strong>JSX</strong> y con poner</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;h2>{ numberMobxClass.number }&#x3C;/h2>\n</code></pre></div>\n<p>Ya tendríamos nuestra linea con el número que hemos puesto<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.01.56.png\" alt=\"FirstMobx\"></p>\n<p>Lo siguiente será crear nuestro botón, en este caso seguimos la teoría inicial de los componentes que ya sabíamos, me refiero a que lo creamos como un componente normal. Creamos el fichero <strong>IncreaseNumber.js</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React, { Component } from 'react';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        &#x3C;button>Increase Number&#x3C;/button>\n        )\n    }\n}\n\nexport default IncreaseNumber;\n</code></pre></div>\n<p>De momento nada nuevo, para verlo lo importamos en <strong>App.js</strong> y lo ponemos a continuación, es decir ahora en App.js debajo de <strong>Our imports</strong> añadimos un import más debajo del <strong>numberMobxClass</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\n</code></pre></div>\n<p>Y luego debajo de nuestro número le ponemos el botón</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;h2>{ numberMobxClass.number }&#x3C;/h2>\n&#x3C;IncreaseNumber/>\n</code></pre></div>\n<p>Y al guardar ya veríamos nuestro botón<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.12.23.png\" alt=\"NewButton\"><br>\nPero aunque pulsemos de momento no hace nada no??....continuemos ahora para añadirle funcionalidad. Al igual que haciamos antes necesitamos un método que haga que aumente nuestro número, y al igual que haciamos antes lo mejor es que lo creemos en el mismo punto que donde tenemos nuestra propiedad. Esto es tan simple como sumarle 1 al número, es decir añadimos a nuestra clase <strong>FirstMobxClass</strong> el método <strong>increase</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        });\n    }\n    increase(){\n        this.number = this.number + 1;\n    }\n}\n</code></pre></div>\n<p>Ya tenemos nuestro método ahora indiquemosle a nuestro botón que tiene que usarlo, probemos a ponerlo directamente con un <strong>onClick</strong> en el componente <strong>IncreaseNumber</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React, { Component } from 'react';\nimport numberMobxClass from './FirstMobxClass';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        &#x3C;button onClick={numberMobxClass.increase} >Increase Number&#x3C;/button>\n        )\n    }\n}\n\nexport default IncreaseNumber;\n</code></pre></div>\n<p>Si os fijáis hemos importado nuestra clase <strong>numberMobxClass</strong> y hemos usado nuestro método <strong>increase</strong> directamente en el <strong>onClick</strong>, bien si guardamos vemos que la página renderiza bien pero que pasa si pulsamos.......UPSSS!!!<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.33.03.png\" alt=\"Error this==null\"><br>\nVemos que nos sale este error, y eso es  como os podéis imaginar que <strong>this</strong> no tiene nada, diréis \"pues entonces podemos ponerle un <strong>bind</strong> igual que haciamos antes y ya esta\", bueno pues vamos a probarlo a ver que pasa y de paso le ponemos al método <strong>increase</strong> un log para ver que tiene <strong>this</strong>.<br>\nEl método <strong>increase</strong> ahora quedaria así</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">increase(){\n    console.log(this);\n    this.number = this.number + 1;\n}\n</code></pre></div>\n<p>Y nuestro <strong>onClick</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;button onClick={numberMobxClass.increase.bind(this)} >Increase Number&#x3C;/button>\n</code></pre></div>\n<p>Veamos que pasa cuando pulsamos<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.37.48.png\" alt=\"Log with this\"><br>\nNo nos da error pero si nos fijamos en lo que nos devuelve nuestro log, la propiedad <strong>number</strong> es <strong>NaN</strong> y eso ¿por qué? Pues porque realmente estamos pasando con <strong>bind</strong> el <strong>this</strong> de nuestro componente <strong>IncreaseNumber</strong> el cual no tiene esa propiedad, hagamos un pequeño ejemplo para verlo, creemos una propiedad en el componente <strong>IncreaseNumber</strong> como hemos visto en anteriores post y veamos el log ahora.<br>\nEl componente <strong>IncreaseNumber</strong> quedaria asi</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class IncreaseNumber extends Component {\n    constructor(){\n        super();\n        this.test = 2;\n        \n    }\n    render(){\n        return(\n        &#x3C;button onClick={numberMobxClass.increase.bind(this)} >Increase Number&#x3C;/button>\n        )\n    }\n}\n</code></pre></div>\n<p>Y al pulsar tenemos este log<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.47.11.png\" alt=\"Testing this context\"><br>\nSi os fijáis <strong>number</strong> sigue siendo <strong>NaN</strong> pero sin embargo tenemos nuestra propiedad <strong>test</strong> con el valor que hemos puesto, entonces quiere decir que estamos pasando el <strong>contexto</strong> del componente <strong>IncreaseNumber</strong>.... y entonces como lo hacemos??...Es más fácil de lo que parece, <strong>onClick</strong> espera una función no?, pues simplemente usemos una función que cada vez que se use esta \"llame\" a nuestro método <strong>increase</strong> (al estilo típico de la programación habitual)<br>\nCon esta teoría nuestro <strong>onClick</strong> quedaría así</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;button onClick={() => numberMobxClass.increase()} >Increase Number&#x3C;/button>\n</code></pre></div>\n<p>Veamos lo que tiene <strong>this</strong> ahora<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.52.52.png\" alt=\"Log with number increase\"><br>\nAnda!! Ahora nuestro <strong>number</strong> si aumenta pero..... en nuestra página no se ve.....y eso?? bueno la explicación es sencilla no estamos <strong>\"observando\"</strong> la propiedad para que responda los cambios y como hacemos eso?...Fácil, importamos <strong>observer</strong> de la libreria <strong>mobx-react</strong> y le indicamos que observe donde estamos renderizando, es decir en <strong>App.js</strong>, por lo que el componente quedaría asi</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\nimport { observer } from 'mobx-react';\n\nclass App extends Component {\n  render() {\n    return (\n      &#x3C;div className=\"App\">\n        &#x3C;div className=\"App-header\">\n          &#x3C;img src={logo} className=\"App-logo\" alt=\"logo\" />\n          &#x3C;h2>Welcome to React&#x3C;/h2>\n        &#x3C;/div>\n        &#x3C;p className=\"App-intro\">\n         We started working below this line\n        &#x3C;/p>\n        &#x3C;h2>{ numberMobxClass.number }&#x3C;/h2>\n        &#x3C;IncreaseNumber/>\n      &#x3C;/div>\n    );\n  }\n}\n\nexport default observer(App);\n</code></pre></div>\n<p>Y voilá ya tenemos nuestro numero aumentando en nuestra página<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-15.00.31.png\" alt=\"The meaning of life\"></p>\n<p>Espero que quede más o menos claro como estamos usando la característica <strong>observable</strong> que nos proporciona <strong>Mobx</strong>, que realmente nos facilita un poco estar pendiente de los estados o cambios de nuestras propiedades.</p>\n<p>En el siguiente post seguiremos viendo que más cosas podemos hacer con <strong>Mobx</strong>, nos vemos, un abrazooorrrrrr</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este post hablaremos de una librería muy útil llamada "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mobx"}]},{"type":"text","value":" que entre otras cosas nos facilita un poco el desarrollo en cuanto a la comunicación entre componentes se refiere, es decir, ya hemos visto un poco como comunicarnos de un componente a otro para realizar alguna modificación en alguna propiedad, pues bien "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mobx"}]},{"type":"text","value":" nos facilita este planteamiento (entre otras cosas claro ;) ). Si queréis algo más de información aqui tenéis la página oficial de "},{"type":"element","tagName":"a","properties":{"href":"https://mobx.js.org/"},"children":[{"type":"text","value":"Mobx"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"instalacin"},"children":[{"type":"text","value":"Instalación"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para instalar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mobx"}]},{"type":"text","value":" usaremos nuestro magnífico "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"npm"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"npm install mobx mobx-react --save\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esto nos instalará en el proyecto los módulos de NodeJS necesarios para poder trabajar con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mobx"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"usandomobx"},"children":[{"type":"text","value":"Usando Mobx"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien vamos a empezar a partir de la estructura de proyecto que teniamos en el post anterior (tras ejecutar nuestro create-app....)."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVamos a trabajar sobre el fichero "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App.js"}]},{"type":"text","value":" que es el componente que se esta rendeando por defecto, pero vamos a cambiarlo un poco y asi vemos que realmente estamos en este punto, vamos a cambiar la frase que aparece debajo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Welcome to React"}]},{"type":"text","value":" para indicar que trabajaremos despues de esa linea:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n         We started working below this line\n        </p>\n      </div>\n    );\n  }\n}\n\nexport default App;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tras guardar, automáticamente tendriamos algo similar a"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-13.37.40.png","alt":"Started working"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien ya sabemos donde estamos, ahora haremos un ejemplo simple para ver que es lo que conseguimos con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mobx"}]},{"type":"text","value":", vamos a mostrar un número y este aumentará cuando pulsemos un botón."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPrimero mostremos nuestro número, en un principio es algo sencillo que ya hemos visto no?, creamos un componente nuevo y lo indicamos en el componente que se esta renderizando como principal no??...... si esa es una opción pero al final estaríamos haciendo lo mismo que ya hemos visto y entonces para que queremos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mobx"}]},{"type":"text","value":" no??. Pues bien la teoría del componente es válida a medias, vamos a crear una clase y en esta tenemos que importar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"extendObservable"}]},{"type":"text","value":" de la librería de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mobx"}]},{"type":"text","value":". Yo le he puesto el nombre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"FirstMobxClass.js"}]},{"type":"text","value":" y esto es lo que ponemos"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import {extendObservable} from 'mobx'\n\nclass FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        })\n    }\n}\n\n//Creamos una nueva instancia de nuestra clase,la almacenamos\n// y la exportamos para que se tenga acceso desde fuera\n//de esta clase\nvar numberMobxClass = new FirstMobxClass();\n\nexport default numberMobxClass;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con esto tendríamos una variable con una propiedad number que deberíamos poder usar. Para ello volvamos a nuestra clase App.js y ponemos lo siguiente:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n         We started working below this line\n        </p>\n        <h2>{ numberMobxClass.number }</h2>\n      </div>\n    );\n  }\n}\n\nexport default App;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para diferenciar los imports que ya teniamos de los nuevos he indicado el comentario "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"our imports"}]},{"type":"text","value":". Como véis lo que importamos es nuestra variable del fichero con nombre "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"FirstMobxClass"}]},{"type":"text","value":" y para usarlo nos valemos de las magias del lenguaje "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"JSX"}]},{"type":"text","value":" y con poner"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<h2>{ numberMobxClass.number }</h2>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya tendríamos nuestra linea con el número que hemos puesto"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.01.56.png","alt":"FirstMobx"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo siguiente será crear nuestro botón, en este caso seguimos la teoría inicial de los componentes que ya sabíamos, me refiero a que lo creamos como un componente normal. Creamos el fichero "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IncreaseNumber.js"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React, { Component } from 'react';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        <button>Increase Number</button>\n        )\n    }\n}\n\nexport default IncreaseNumber;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"De momento nada nuevo, para verlo lo importamos en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App.js"}]},{"type":"text","value":" y lo ponemos a continuación, es decir ahora en App.js debajo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Our imports"}]},{"type":"text","value":" añadimos un import más debajo del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"numberMobxClass"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y luego debajo de nuestro número le ponemos el botón"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<h2>{ numberMobxClass.number }</h2>\n<IncreaseNumber/>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y al guardar ya veríamos nuestro botón"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.12.23.png","alt":"NewButton"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPero aunque pulsemos de momento no hace nada no??....continuemos ahora para añadirle funcionalidad. Al igual que haciamos antes necesitamos un método que haga que aumente nuestro número, y al igual que haciamos antes lo mejor es que lo creemos en el mismo punto que donde tenemos nuestra propiedad. Esto es tan simple como sumarle 1 al número, es decir añadimos a nuestra clase "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"FirstMobxClass"}]},{"type":"text","value":" el método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"increase"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class FirstMobxClass {\n    constructor(){\n        //Recibe el objeto a observar y las propiedades\n        extendObservable(this,{\n            number: 1\n        });\n    }\n    increase(){\n        this.number = this.number + 1;\n    }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya tenemos nuestro método ahora indiquemosle a nuestro botón que tiene que usarlo, probemos a ponerlo directamente con un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]},{"type":"text","value":" en el componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IncreaseNumber"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React, { Component } from 'react';\nimport numberMobxClass from './FirstMobxClass';\n\nclass IncreaseNumber extends Component {\n    render(){\n        return(\n        <button onClick={numberMobxClass.increase} >Increase Number</button>\n        )\n    }\n}\n\nexport default IncreaseNumber;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si os fijáis hemos importado nuestra clase "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"numberMobxClass"}]},{"type":"text","value":" y hemos usado nuestro método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"increase"}]},{"type":"text","value":" directamente en el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]},{"type":"text","value":", bien si guardamos vemos que la página renderiza bien pero que pasa si pulsamos.......UPSSS!!!"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.33.03.png","alt":"Error this==null"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVemos que nos sale este error, y eso es  como os podéis imaginar que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":" no tiene nada, diréis \"pues entonces podemos ponerle un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bind"}]},{"type":"text","value":" igual que haciamos antes y ya esta\", bueno pues vamos a probarlo a ver que pasa y de paso le ponemos al método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"increase"}]},{"type":"text","value":" un log para ver que tiene "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":"."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEl método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"increase"}]},{"type":"text","value":" ahora quedaria así"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"increase(){\n    console.log(this);\n    this.number = this.number + 1;\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<button onClick={numberMobxClass.increase.bind(this)} >Increase Number</button>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos que pasa cuando pulsamos"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.37.48.png","alt":"Log with this"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nNo nos da error pero si nos fijamos en lo que nos devuelve nuestro log, la propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"number"}]},{"type":"text","value":" es "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NaN"}]},{"type":"text","value":" y eso ¿por qué? Pues porque realmente estamos pasando con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"bind"}]},{"type":"text","value":" el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":" de nuestro componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IncreaseNumber"}]},{"type":"text","value":" el cual no tiene esa propiedad, hagamos un pequeño ejemplo para verlo, creemos una propiedad en el componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IncreaseNumber"}]},{"type":"text","value":" como hemos visto en anteriores post y veamos el log ahora."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEl componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IncreaseNumber"}]},{"type":"text","value":" quedaria asi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"class IncreaseNumber extends Component {\n    constructor(){\n        super();\n        this.test = 2;\n        \n    }\n    render(){\n        return(\n        <button onClick={numberMobxClass.increase.bind(this)} >Increase Number</button>\n        )\n    }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y al pulsar tenemos este log"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.47.11.png","alt":"Testing this context"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nSi os fijáis "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"number"}]},{"type":"text","value":" sigue siendo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NaN"}]},{"type":"text","value":" pero sin embargo tenemos nuestra propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"test"}]},{"type":"text","value":" con el valor que hemos puesto, entonces quiere decir que estamos pasando el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"contexto"}]},{"type":"text","value":" del componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"IncreaseNumber"}]},{"type":"text","value":".... y entonces como lo hacemos??...Es más fácil de lo que parece, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]},{"type":"text","value":" espera una función no?, pues simplemente usemos una función que cada vez que se use esta \"llame\" a nuestro método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"increase"}]},{"type":"text","value":" (al estilo típico de la programación habitual)"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCon esta teoría nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]},{"type":"text","value":" quedaría así"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<button onClick={() => numberMobxClass.increase()} >Increase Number</button>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos lo que tiene "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":" ahora"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-14.52.52.png","alt":"Log with number increase"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nAnda!! Ahora nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"number"}]},{"type":"text","value":" si aumenta pero..... en nuestra página no se ve.....y eso?? bueno la explicación es sencilla no estamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"observando\""}]},{"type":"text","value":" la propiedad para que responda los cambios y como hacemos eso?...Fácil, importamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"observer"}]},{"type":"text","value":" de la libreria "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"mobx-react"}]},{"type":"text","value":" y le indicamos que observe donde estamos renderizando, es decir en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App.js"}]},{"type":"text","value":", por lo que el componente quedaría asi"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n//Our imports\nimport numberMobxClass from './FirstMobxClass';\nimport IncreaseNumber from './IncreaseNumber';\nimport { observer } from 'mobx-react';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n         We started working below this line\n        </p>\n        <h2>{ numberMobxClass.number }</h2>\n        <IncreaseNumber/>\n      </div>\n    );\n  }\n}\n\nexport default observer(App);\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y voilá ya tenemos nuestro numero aumentando en nuestra página"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-09-at-15.00.31.png","alt":"The meaning of life"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Espero que quede más o menos claro como estamos usando la característica "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"observable"}]},{"type":"text","value":" que nos proporciona "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mobx"}]},{"type":"text","value":", que realmente nos facilita un poco estar pendiente de los estados o cambios de nuestras propiedades."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el siguiente post seguiremos viendo que más cosas podemos hacer con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mobx"}]},{"type":"text","value":", nos vemos, un abrazooorrrrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"instalacin","heading":"Instalación"},{"id":"usandomobx","heading":"Usando Mobx"}]},"featureImageSharp":{"base":"Captain-Atom-1.jpg","publicURL":"/static/ea41313c22f611d45d277d453c4273d1/Captain-Atom-1.jpg","imageMeta":{"width":864,"height":648},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBv/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/aAAwDAQACEAMQAAABojay1bnBz//EABkQAQACAwAAAAAAAAAAAAAAAAECAwARE//aAAgBAQABBQKoAmdchqqPFMlZGuC7f//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEiH/2gAIAQMBAT8BONov/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERE0H/2gAIAQIBAT8BbK50/8QAHhAAAwAABwEAAAAAAAAAAAAAAAERAhIiMTJRUmH/2gAIAQEABj8C0x9lWxlq+j9ImHkVn//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExQf/aAAgBAQABPyHlOmjsuNqMAiJQe2TspkuwMcZ4otX5GdLXWf/aAAwDAQACAAMAAAAQy/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBB/9oACAEDAQE/ECLJZf/EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAgEBPxBJcpVz/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBUWHR/9oACAEBAAE/ECGZHOFc9RXVMNQfYPyzYFbcsWTgugFwsFDeqNnrnxyXBPYm2f/Z","aspectRatio":1.3358778625954197,"src":"/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom-1.jpg","srcSet":"/static/ea41313c22f611d45d277d453c4273d1/477ba/Captain-Atom-1.jpg 175w,\n/static/ea41313c22f611d45d277d453c4273d1/06776/Captain-Atom-1.jpg 350w,\n/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom-1.jpg 700w,\n/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom-1.jpg 864w","srcWebp":"/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom-1.webp","srcSetWebp":"/static/ea41313c22f611d45d277d453c4273d1/9fca7/Captain-Atom-1.webp 175w,\n/static/ea41313c22f611d45d277d453c4273d1/37a4e/Captain-Atom-1.webp 350w,\n/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom-1.webp 700w,\n/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom-1.webp 864w","sizes":"(max-width: 700px) 100vw, 700px"}}}}},{"node":{"id":"Ghost__Post__5a338158333e0f134c248f29","title":"React Superhero (IV): Estructura de proyecto base","slug":"react-superhero-iv","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Captain-Atom.jpg","excerpt":"En el post anterior creamos un proyecto de React usando el CLI que nos\nproporcionan los creadores del mismo. Esta herramienta de linea de comandos nos\ncrea un proyecto base desde el que partir y como vimos cuando usamos npm start \npara arrancar nuestro servidor de desarrollo, la herramienta nos muestra una\npágina similar a esta:\n\n\n\nVeamos un poco la estructura del proyecto y desde donde podemos empezar a\ntrabajar.\nLo primero veamos lo que tenemos:\n\n\nEn lo primero que nos tenemos que fijar es en ","custom_excerpt":null,"visibility":"public","created_at_pretty":"4 Sep 2017","published_at_pretty":"7 Sep 2017","updated_at_pretty":"22 Jan 2018","created_at":"2017-09-04T09:21:09.000+02:00","published_at":"2017-09-07T10:26:00.000+02:00","updated_at":"2018-01-22T09:54:03.000+01:00","meta_title":null,"meta_description":"Veamos la estructura básica de proyecto que se nos crea cuando utilizamos el CLI para crear proyectos de ReactJS","og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null},"tags":[{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null}],"plaintext":"En el post anterior creamos un proyecto de React usando el CLI que nos\nproporcionan los creadores del mismo. Esta herramienta de linea de comandos nos\ncrea un proyecto base desde el que partir y como vimos cuando usamos npm start \npara arrancar nuestro servidor de desarrollo, la herramienta nos muestra una\npágina similar a esta:\n\n\n\nVeamos un poco la estructura del proyecto y desde donde podemos empezar a\ntrabajar.\nLo primero veamos lo que tenemos:\n\n\nEn lo primero que nos tenemos que fijar es en los index tanto el js, como el \nhtml, ya que son desde donde se empieza a llamar al resto. Si miramos el \nindex.html tenemos una pagina html con varios tags pero lo que nos importa\nrealmente es algo que ya hemos visto:\n\n <div id=\"root\"></div>\n\n\nRecordemos que es en ese punto donde se empieza a componer nuestra aplicación.\n\nLo siguiente miremos dentro de la carpeta src y veamos el index.js que aqui\ntenemos varias cosas interesantes:\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\n\n\nReactDOM.render(<App />, document.getElementById('root'));\nregisterServiceWorker();\n\n\nTenemos varios imports, luego el típico ReactDOM.render y por último una llamada\na un método registerServiceWorker(). Comencemos con los imports, los dos\nprimeros ya los hemos visto antes, son los específicos para que React funcione,\nveamos los siguientes:\n\n * \"import './index.css';\": No es muy especial solo importa el css, ni más ni\n   menos.\n * \"import App from './App';\" : Este import nos instancia el componente que está\n   dentro del fichero App.js, un poco más abajo hablaremos como está creado\n   esto, es algo parecido a node con los exports ;).\n * \"import registerServiceWorker from './registerServiceWorker';\": Este import\n   realemente es el que instancia el servidor local y anda pendiente de los\n   cambios en el código, lo que hace es cargar el export por defecto. Si alguién\n   tiene dudas con el código de este fichero que lo ponga en comentarios y lo\n   vemos ;).\n\nA continuación como ya hemos comentado, tenemos nuestro típico render de react\nque lo que hace es instanciar el componente App. Si miramos el código de App.js:\n\nimport React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n          To get started, edit <code>src/App.js</code> and save to reload.\n        </p>\n      </div>\n    );\n  }\n}\n\nexport default App;\n\n\nVemos que ya hemos visto muchas cosas, comentar que los imports de logo y de \nApp.css los necesitamos para usarlos en nuestro código JSX, si os fijáis en la\nlínea:\n\n<img src={logo} className=\"App-logo\" alt=\"logo\" />\n\n\nTenemos las dos cosas, usamos el logo dentro de src y ya estamos usando tambien\nnombres de clases del fichero css.\n\nEn este punto faltaría solo comentar la última y casi la más importante del\nconjunto (en este punto jejeje):\n\nexport default App;\n\n\nEsta línea lo que indica es que por defecto cuando se haga un import de este\nfichero se importe el componente App. Un detalle importante, sin export no\nimportamos nada, si comentáramos esa línea tendríamos este resultado:\n\n\n\nCreo que más o menos se entiende todo, solo comentar que si quisieramos cambiar\nel componente App por otro solo tendríamos que crear el componente como queramos\nponerle la línea export y cambiar el dentro del ReactDOM.render como ya hemos\nvisto en algún post anterior (de todas formas iremos trabajando con esto más de\nuna vez ;) ).\n\nComo vemos prácticamente todo lo haremos dentro de la carpeta src y sigue\nmanteniendo el nivel de sencillez que hemos estado viendo.\n\nSin mucho más nos vemos en el siguiente. Un abrazoooooooo","html":"<!--kg-card-begin: markdown--><p>En el post anterior creamos un proyecto de <strong>React</strong> usando el <strong>CLI</strong> que nos proporcionan los creadores del mismo. Esta herramienta de linea de comandos nos crea un proyecto base desde el que partir y como vimos cuando usamos <strong>npm start</strong> para arrancar nuestro servidor de desarrollo, la herramienta nos muestra una página similar a esta:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-09.26.57.png\" alt=\"React base page\"></p>\n<p>Veamos un poco la estructura del proyecto y desde donde podemos empezar a trabajar.<br>\nLo primero veamos lo que tenemos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-09.29.33.png\" alt=\"Folders Base Project\"></p>\n<p>En lo primero que nos tenemos que fijar es en los <strong>index</strong> tanto el <strong>js</strong>, como el <strong>html</strong>, ya que son desde donde se empieza a llamar al resto. Si miramos el <strong>index.html</strong> tenemos una pagina html con varios tags pero lo que nos importa realmente es algo que ya hemos visto:</p>\n<pre><code> &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;\n</code></pre>\n<p>Recordemos que es en ese punto donde se empieza a componer nuestra aplicación.</p>\n<p>Lo siguiente miremos dentro de la carpeta <strong>src</strong> y veamos el <strong>index.js</strong> que aqui tenemos varias cosas interesantes:</p>\n<pre><code>import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\n\n\nReactDOM.render(&lt;App /&gt;, document.getElementById('root'));\nregisterServiceWorker();\n</code></pre>\n<p>Tenemos varios imports, luego el típico <strong>ReactDOM.render</strong> y por último una llamada a un método <strong>registerServiceWorker()</strong>. Comencemos con los <strong>imports</strong>, los dos primeros ya los hemos visto antes, son los específicos para que React funcione, veamos los siguientes:</p>\n<ul>\n<li><strong>&quot;import './index.css';&quot;</strong>: No es muy especial solo importa el css, ni más ni menos.</li>\n<li><strong>&quot;import App from './App';&quot;</strong> : Este import nos instancia el componente que está dentro del fichero <strong>App.js</strong>, un poco más abajo hablaremos como está creado esto, es algo parecido a node con los exports ;).</li>\n<li><strong>&quot;import registerServiceWorker from './registerServiceWorker';&quot;</strong>: Este import realemente es el que instancia el servidor local y anda pendiente de los cambios en el código, lo que hace es cargar el export por defecto. Si alguién tiene dudas con el código de este fichero que lo ponga en comentarios y lo vemos ;).</li>\n</ul>\n<p>A continuación como ya hemos comentado, tenemos nuestro típico render de react que lo que hace es instanciar el componente <strong>App</strong>. Si miramos el código de <strong>App.js</strong>:</p>\n<pre><code>import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      &lt;div className=&quot;App&quot;&gt;\n        &lt;div className=&quot;App-header&quot;&gt;\n          &lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;\n          &lt;h2&gt;Welcome to React&lt;/h2&gt;\n        &lt;/div&gt;\n        &lt;p className=&quot;App-intro&quot;&gt;\n          To get started, edit &lt;code&gt;src/App.js&lt;/code&gt; and save to reload.\n        &lt;/p&gt;\n      &lt;/div&gt;\n    );\n  }\n}\n\nexport default App;\n</code></pre>\n<p>Vemos que ya hemos visto muchas cosas, comentar que los imports de <strong>logo</strong> y de <strong>App.css</strong> los necesitamos para usarlos en nuestro código JSX, si os fijáis en la línea:</p>\n<pre><code>&lt;img src={logo} className=&quot;App-logo&quot; alt=&quot;logo&quot; /&gt;\n</code></pre>\n<p>Tenemos las dos cosas, usamos el <strong>logo</strong> dentro de src y ya estamos usando tambien nombres de clases del fichero css.</p>\n<p>En este punto faltaría solo comentar la última y casi la más importante del conjunto (en este punto jejeje):</p>\n<pre><code>export default App;\n</code></pre>\n<p>Esta línea lo que indica es que por defecto cuando se haga un import de este fichero se importe el componente <strong>App</strong>. Un detalle importante, <strong>sin export no importamos nada</strong>, si comentáramos esa línea tendríamos este resultado:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-21.42.51.png\" alt=\"Screen-Shot-2017-09-04-at-21.42.51\"></p>\n<p>Creo que más o menos se entiende todo, solo comentar que si quisieramos cambiar el componente <strong>App</strong> por otro solo tendríamos que crear el componente como queramos ponerle la línea <strong>export</strong> y cambiar el <strong><App /></strong> dentro del <strong>ReactDOM.render</strong> como ya hemos visto en algún post anterior (de todas formas iremos trabajando con esto más de una vez ;) ).</p>\n<p>Como vemos prácticamente todo lo haremos dentro de la carpeta <strong>src</strong> y sigue manteniendo el nivel de sencillez que hemos estado viendo.</p>\n<p>Sin mucho más nos vemos en el siguiente. Un abrazoooooooo</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/react-superhero-iv/","canonical_url":null,"uuid":"a12fcedc-92c4-4094-a631-9144bc91e900","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59acfee5c5286700019db1d5","reading_time":3,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>En el post anterior creamos un proyecto de <strong>React</strong> usando el <strong>CLI</strong> que nos proporcionan los creadores del mismo. Esta herramienta de linea de comandos nos crea un proyecto base desde el que partir y como vimos cuando usamos <strong>npm start</strong> para arrancar nuestro servidor de desarrollo, la herramienta nos muestra una página similar a esta:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-09.26.57.png\" alt=\"React base page\"></p>\n<p>Veamos un poco la estructura del proyecto y desde donde podemos empezar a trabajar.<br>\nLo primero veamos lo que tenemos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-09.29.33.png\" alt=\"Folders Base Project\"></p>\n<p>En lo primero que nos tenemos que fijar es en los <strong>index</strong> tanto el <strong>js</strong>, como el <strong>html</strong>, ya que son desde donde se empieza a llamar al resto. Si miramos el <strong>index.html</strong> tenemos una pagina html con varios tags pero lo que nos importa realmente es algo que ya hemos visto:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> &#x3C;div id=\"root\">&#x3C;/div>\n</code></pre></div>\n<p>Recordemos que es en ese punto donde se empieza a componer nuestra aplicación.</p>\n<p>Lo siguiente miremos dentro de la carpeta <strong>src</strong> y veamos el <strong>index.js</strong> que aqui tenemos varias cosas interesantes:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\n\n\nReactDOM.render(&#x3C;App />, document.getElementById('root'));\nregisterServiceWorker();\n</code></pre></div>\n<p>Tenemos varios imports, luego el típico <strong>ReactDOM.render</strong> y por último una llamada a un método <strong>registerServiceWorker()</strong>. Comencemos con los <strong>imports</strong>, los dos primeros ya los hemos visto antes, son los específicos para que React funcione, veamos los siguientes:</p>\n<ul>\n<li><strong>\"import './index.css';\"</strong>: No es muy especial solo importa el css, ni más ni menos.</li>\n<li><strong>\"import App from './App';\"</strong> : Este import nos instancia el componente que está dentro del fichero <strong>App.js</strong>, un poco más abajo hablaremos como está creado esto, es algo parecido a node con los exports ;).</li>\n<li><strong>\"import registerServiceWorker from './registerServiceWorker';\"</strong>: Este import realemente es el que instancia el servidor local y anda pendiente de los cambios en el código, lo que hace es cargar el export por defecto. Si alguién tiene dudas con el código de este fichero que lo ponga en comentarios y lo vemos ;).</li>\n</ul>\n<p>A continuación como ya hemos comentado, tenemos nuestro típico render de react que lo que hace es instanciar el componente <strong>App</strong>. Si miramos el código de <strong>App.js</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      &#x3C;div className=\"App\">\n        &#x3C;div className=\"App-header\">\n          &#x3C;img src={logo} className=\"App-logo\" alt=\"logo\" />\n          &#x3C;h2>Welcome to React&#x3C;/h2>\n        &#x3C;/div>\n        &#x3C;p className=\"App-intro\">\n          To get started, edit &#x3C;code>src/App.js&#x3C;/code> and save to reload.\n        &#x3C;/p>\n      &#x3C;/div>\n    );\n  }\n}\n\nexport default App;\n</code></pre></div>\n<p>Vemos que ya hemos visto muchas cosas, comentar que los imports de <strong>logo</strong> y de <strong>App.css</strong> los necesitamos para usarlos en nuestro código JSX, si os fijáis en la línea:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;img src={logo} className=\"App-logo\" alt=\"logo\" />\n</code></pre></div>\n<p>Tenemos las dos cosas, usamos el <strong>logo</strong> dentro de src y ya estamos usando tambien nombres de clases del fichero css.</p>\n<p>En este punto faltaría solo comentar la última y casi la más importante del conjunto (en este punto jejeje):</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">export default App;\n</code></pre></div>\n<p>Esta línea lo que indica es que por defecto cuando se haga un import de este fichero se importe el componente <strong>App</strong>. Un detalle importante, <strong>sin export no importamos nada</strong>, si comentáramos esa línea tendríamos este resultado:</p>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-21.42.51.png\" alt=\"Screen-Shot-2017-09-04-at-21.42.51\"></p>\n<p>Creo que más o menos se entiende todo, solo comentar que si quisieramos cambiar el componente <strong>App</strong> por otro solo tendríamos que crear el componente como queramos ponerle la línea <strong>export</strong> y cambiar el <strong><app></app></strong> dentro del <strong>ReactDOM.render</strong> como ya hemos visto en algún post anterior (de todas formas iremos trabajando con esto más de una vez ;) ).</p>\n<p>Como vemos prácticamente todo lo haremos dentro de la carpeta <strong>src</strong> y sigue manteniendo el nivel de sencillez que hemos estado viendo.</p>\n<p>Sin mucho más nos vemos en el siguiente. Un abrazoooooooo</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En el post anterior creamos un proyecto de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"React"}]},{"type":"text","value":" usando el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"CLI"}]},{"type":"text","value":" que nos proporcionan los creadores del mismo. Esta herramienta de linea de comandos nos crea un proyecto base desde el que partir y como vimos cuando usamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"npm start"}]},{"type":"text","value":" para arrancar nuestro servidor de desarrollo, la herramienta nos muestra una página similar a esta:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-09.26.57.png","alt":"React base page"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos un poco la estructura del proyecto y desde donde podemos empezar a trabajar."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLo primero veamos lo que tenemos:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-09.29.33.png","alt":"Folders Base Project"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En lo primero que nos tenemos que fijar es en los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"index"}]},{"type":"text","value":" tanto el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"js"}]},{"type":"text","value":", como el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"html"}]},{"type":"text","value":", ya que son desde donde se empieza a llamar al resto. Si miramos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"index.html"}]},{"type":"text","value":" tenemos una pagina html con varios tags pero lo que nos importa realmente es algo que ya hemos visto:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":" <div id=\"root\"></div>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Recordemos que es en ese punto donde se empieza a componer nuestra aplicación."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo siguiente miremos dentro de la carpeta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" y veamos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"index.js"}]},{"type":"text","value":" que aqui tenemos varias cosas interesantes:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport registerServiceWorker from './registerServiceWorker';\n\n\nReactDOM.render(<App />, document.getElementById('root'));\nregisterServiceWorker();\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos varios imports, luego el típico "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ReactDOM.render"}]},{"type":"text","value":" y por último una llamada a un método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"registerServiceWorker()"}]},{"type":"text","value":". Comencemos con los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"imports"}]},{"type":"text","value":", los dos primeros ya los hemos visto antes, son los específicos para que React funcione, veamos los siguientes:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"ul","properties":{},"children":[{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"import './index.css';\""}]},{"type":"text","value":": No es muy especial solo importa el css, ni más ni menos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"import App from './App';\""}]},{"type":"text","value":" : Este import nos instancia el componente que está dentro del fichero "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App.js"}]},{"type":"text","value":", un poco más abajo hablaremos como está creado esto, es algo parecido a node con los exports ;)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"li","properties":{},"children":[{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"import registerServiceWorker from './registerServiceWorker';\""}]},{"type":"text","value":": Este import realemente es el que instancia el servidor local y anda pendiente de los cambios en el código, lo que hace es cargar el export por defecto. Si alguién tiene dudas con el código de este fichero que lo ponga en comentarios y lo vemos ;)."}]},{"type":"text","value":"\n"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"A continuación como ya hemos comentado, tenemos nuestro típico render de react que lo que hace es instanciar el componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App"}]},{"type":"text","value":". Si miramos el código de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App.js"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"import React, { Component } from 'react';\nimport logo from './logo.svg';\nimport './App.css';\n\nclass App extends Component {\n  render() {\n    return (\n      <div className=\"App\">\n        <div className=\"App-header\">\n          <img src={logo} className=\"App-logo\" alt=\"logo\" />\n          <h2>Welcome to React</h2>\n        </div>\n        <p className=\"App-intro\">\n          To get started, edit <code>src/App.js</code> and save to reload.\n        </p>\n      </div>\n    );\n  }\n}\n\nexport default App;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Vemos que ya hemos visto muchas cosas, comentar que los imports de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"logo"}]},{"type":"text","value":" y de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App.css"}]},{"type":"text","value":" los necesitamos para usarlos en nuestro código JSX, si os fijáis en la línea:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"<img src={logo} className=\"App-logo\" alt=\"logo\" />\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Tenemos las dos cosas, usamos el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"logo"}]},{"type":"text","value":" dentro de src y ya estamos usando tambien nombres de clases del fichero css."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En este punto faltaría solo comentar la última y casi la más importante del conjunto (en este punto jejeje):"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"export default App;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Esta línea lo que indica es que por defecto cuando se haga un import de este fichero se importe el componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App"}]},{"type":"text","value":". Un detalle importante, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"sin export no importamos nada"}]},{"type":"text","value":", si comentáramos esa línea tendríamos este resultado:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-04-at-21.42.51.png","alt":"Screen-Shot-2017-09-04-at-21.42.51"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que más o menos se entiende todo, solo comentar que si quisieramos cambiar el componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"App"}]},{"type":"text","value":" por otro solo tendríamos que crear el componente como queramos ponerle la línea "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"export"}]},{"type":"text","value":" y cambiar el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"element","tagName":"app","properties":{},"children":[]}]},{"type":"text","value":" dentro del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ReactDOM.render"}]},{"type":"text","value":" como ya hemos visto en algún post anterior (de todas formas iremos trabajando con esto más de una vez ;) )."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como vemos prácticamente todo lo haremos dentro de la carpeta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"src"}]},{"type":"text","value":" y sigue manteniendo el nivel de sencillez que hemos estado viendo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Sin mucho más nos vemos en el siguiente. Un abrazoooooooo"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[]},"featureImageSharp":{"base":"Captain-Atom.jpg","publicURL":"/static/ea41313c22f611d45d277d453c4273d1/Captain-Atom.jpg","imageMeta":{"width":864,"height":648},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBv/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/aAAwDAQACEAMQAAABojay1bnBz//EABkQAQACAwAAAAAAAAAAAAAAAAECAwARE//aAAgBAQABBQKoAmdchqqPFMlZGuC7f//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEiH/2gAIAQMBAT8BONov/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERE0H/2gAIAQIBAT8BbK50/8QAHhAAAwAABwEAAAAAAAAAAAAAAAERAhIiMTJRUmH/2gAIAQEABj8C0x9lWxlq+j9ImHkVn//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExQf/aAAgBAQABPyHlOmjsuNqMAiJQe2TspkuwMcZ4otX5GdLXWf/aAAwDAQACAAMAAAAQy/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBB/9oACAEDAQE/ECLJZf/EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAgEBPxBJcpVz/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBUWHR/9oACAEBAAE/ECGZHOFc9RXVMNQfYPyzYFbcsWTgugFwsFDeqNnrnxyXBPYm2f/Z","aspectRatio":1.3358778625954197,"src":"/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom.jpg","srcSet":"/static/ea41313c22f611d45d277d453c4273d1/477ba/Captain-Atom.jpg 175w,\n/static/ea41313c22f611d45d277d453c4273d1/06776/Captain-Atom.jpg 350w,\n/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom.jpg 700w,\n/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom.jpg 864w","srcWebp":"/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom.webp","srcSetWebp":"/static/ea41313c22f611d45d277d453c4273d1/9fca7/Captain-Atom.webp 175w,\n/static/ea41313c22f611d45d277d453c4273d1/37a4e/Captain-Atom.webp 350w,\n/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom.webp 700w,\n/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom.webp 864w","sizes":"(max-width: 700px) 100vw, 700px"}}}}},{"node":{"id":"Ghost__Post__5a338158333e0f134c248f1d","title":"React Superhero (III): Entorno de desarrollo","slug":"react-js-iii-entorno-de-desarrollo","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Captain-Atom.jpg","excerpt":"Bien antes de ponernos serios desarrollando algo más complejo con React,\nnecesitamos configurar nuestro entorno ya que una app de React necesita de\nvarias dependencias para funcionar correctamente en producción(además que nos\nfacilitan un poco el ir desarrollando).\n\nHasta hace poco, con React debíamos hacer toda la configuración y preparación\ndel entorno a mano, pero nuestros amigos de Facebook, se han creado una especie\nde atajo al estilo AngularCLI(más info Create React APP\n[https://github.com","custom_excerpt":null,"visibility":"public","created_at_pretty":"4 Aug 2017","published_at_pretty":"28 Aug 2017","updated_at_pretty":"22 Jan 2018","created_at":"2017-08-04T08:46:04.000+02:00","published_at":"2017-08-28T10:03:00.000+02:00","updated_at":"2018-01-22T09:56:23.000+01:00","meta_title":null,"meta_description":"Preparando nuestro entorno de desarrollo de ReactJS","og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":null}],"primary_author":{"slug":"jlgarcia","url":"https://jlgarcia.fulldev.ninja/author/jlgarcia/","name":"Juan Luis Garcia Aparicio","bio":null,"cover_image":null,"profile_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/12/Perfil.jpg","location":null,"website":null,"twitter":null,"facebook":null,"meta_title":null,"meta_description":null,"coverImageSharp":null,"profileImageSharp":{"base":"Perfil.jpg","publicURL":"/static/b0de6281fb28a266510b3b09b9243e5a/Perfil.jpg","imageMeta":{"width":307,"height":307},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAUDBAb/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAGzw6zC6zHn+cLYP//EAB0QAAICAQUAAAAAAAAAAAAAAAEDAAIEEyEiIzL/2gAIAQEAAQUCifca8KgcKWVfUpkHsG5pxX//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAdEAACAgEFAAAAAAAAAAAAAAAAARARcQISIUFR/9oACAEBAAY/AhU88xkb7N06a8P/xAAcEAEAAwEAAwEAAAAAAAAAAAABABEhMUFRYXH/2gAIAQEAAT8hR2pq40aqb+xIAeXibhW9JXr8joF4TBcSNe0//9oADAMBAAIAAwAAABDzDwD/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhUTFhcfD/2gAIAQEAAT8QyItrELaTlatLwU63MvEW6vUNdy4LZQDn7iVApV9VLtANdWwKkuYq4Er1VZ//2Q==","aspectRatio":1,"src":"/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg","srcSet":"/static/b0de6281fb28a266510b3b09b9243e5a/f340b/Perfil.jpg 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/22d64/Perfil.jpg 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/31709/Perfil.jpg 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/aa249/Perfil.jpg 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/0dc33/Perfil.jpg 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/60667/Perfil.jpg 307w","srcWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp","srcSetWebp":"/static/b0de6281fb28a266510b3b09b9243e5a/59cda/Perfil.webp 28w,\n/static/b0de6281fb28a266510b3b09b9243e5a/7da75/Perfil.webp 55w,\n/static/b0de6281fb28a266510b3b09b9243e5a/8678c/Perfil.webp 110w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f282e/Perfil.webp 165w,\n/static/b0de6281fb28a266510b3b09b9243e5a/a7b21/Perfil.webp 220w,\n/static/b0de6281fb28a266510b3b09b9243e5a/f59af/Perfil.webp 307w","sizes":"(max-width: 110px) 100vw, 110px"}}}},"primary_tag":{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null},"tags":[{"slug":"reactjs","url":"https://jlgarcia.fulldev.ninja/tag/reactjs/","name":"reactjs","visibility":"public","feature_image":null,"description":null,"meta_title":"ReactJS Ninjas","meta_description":"Aprenderemos a usar esta estupenda librería que nos permite desarrollar con un estilo basado en componentes y centrándonse en tener los datos sincronizados","featureImageSharp":null}],"plaintext":"Bien antes de ponernos serios desarrollando algo más complejo con React,\nnecesitamos configurar nuestro entorno ya que una app de React necesita de\nvarias dependencias para funcionar correctamente en producción(además que nos\nfacilitan un poco el ir desarrollando).\n\nHasta hace poco, con React debíamos hacer toda la configuración y preparación\ndel entorno a mano, pero nuestros amigos de Facebook, se han creado una especie\nde atajo al estilo AngularCLI(más info Create React APP\n[https://github.com/facebookincubator/create-react-app]), para usarlo lo primero\nes instalar NodeJS [https://nodejs.org/es/], es suficiente con instalar la\nversión LTS desde la página principal, para el que no lo sepa NodeJS es la\nopción servidor de JS, es orientado a eventos lo que le permite manejar un gran\nnúmero de peticiones, por el momento no voy a entrar mucho en esto, tengo\nintención de crear una linea de post solo de Node por lo que si os interesa\nestar atentos ;).\n\nUna vez instalado podemos comprobar que se ha instalado correctamente con las\nsiguientes instrucciones en nuestra consola de comandos preferida:\n\n#Para ver la versión de NodeJS\nnode -v\n#La versión de Node Package Manager\nnpm -v \n\n\n\nYo simplemente he encadenado los comandos pero os debería salir algo similar a\neso.\n\nBien lo primero de todo es hacer que NPM instale los paquetes que necesitamos:\n\nnpm -g install create-react-app\n\n\nEs tan sencillo como indicarlo con el nombre, y el -g es para que nos lo instale\nglobalmente y podamos usarlo en cualquier sitio, si no lo pusieramos solo nos lo\ninstalaría en el directorio donde estuviéramos trabajando en la linea de\ncomandos. Una vez ejecutado se descargará y configurará algunas cosas el solito,\nveréis unas cuantas líneas como estas:\n\nBien una vez instalado ya podemos crear nuestro entorno para la app que vamos a\ndesarrollar, para ello solo necesitamos llamar a nuestro nuevo comando he\nindicarle al nombre de la app que deseamos crear:\n\ncreate-react-app nuclear_superhero_app\n\n\nUna vez terminado el proceso nos saldrá algo similar a esto\n\nPor último para empezar a ver la utilidad de esto tenemos que hacer lo que nos\nsugieren al final, entrar en el directorio y ejecutar start:\n\ncd nuclear_superhero_app\nnpm start\n\n\nSi todo ha ido bien se os habrá abierto otra pestaña en el navegador con esto:\n\n\nBásicamente nos ha levantado un \"servidor\" en local en el puerto 3000 donde\npodremos ir viendo los cambios en nuestra aplicación casi en tiempo real. Si\nqueremos para el servidor es suficiente con irnos a la consola desde donde lo\nhemos lanzado y detener el proceso con ctrl+c o como soláis hacerlo.\n\nCon esto ya tendríamos lo que necesitamos para empezar a trabajar realmente con\nReact, que es lo que haremos desde el próximo post, si alguien ha tenido\nproblemas o quiere saber algo de Node que lo ponga en comentarios y lo vamos\nviendo.Nos vemoooossssss.","html":"<!--kg-card-begin: markdown--><p>Bien antes de ponernos serios desarrollando algo más complejo con React, necesitamos configurar nuestro entorno ya que una app de React necesita de varias dependencias para funcionar correctamente en producción(además que nos facilitan un poco el ir desarrollando).</p>\n<p>Hasta hace poco, con React debíamos hacer toda la configuración y preparación del entorno a mano, pero nuestros amigos de Facebook, se han creado una especie de atajo al estilo <strong>AngularCLI</strong>(más info <a href=\"https://github.com/facebookincubator/create-react-app\">Create React APP</a>), para usarlo lo primero es instalar <a href=\"https://nodejs.org/es/\">NodeJS</a>, es suficiente con instalar la versión <strong>LTS</strong> desde la página principal, para el que no lo sepa NodeJS es la opción servidor de JS, es orientado a eventos lo que le permite manejar un gran número de peticiones, por el momento no voy a entrar mucho en esto, tengo intención de crear una linea de post solo de Node por lo que si os interesa estar atentos ;).</p>\n<p>Una vez instalado podemos comprobar que se ha instalado correctamente con las siguientes instrucciones en nuestra consola de comandos preferida:</p>\n<pre><code>#Para ver la versión de NodeJS\nnode -v\n#La versión de Node Package Manager\nnpm -v \n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-08.54.25.png\" alt=\"Node Check Install\"><br>\nYo simplemente he encadenado los comandos pero os debería salir algo similar a eso.</p>\n<p>Bien lo primero de todo es hacer que <strong>NPM</strong> instale los paquetes que necesitamos:</p>\n<pre><code>npm -g install create-react-app\n</code></pre>\n<p>Es tan sencillo como indicarlo con el nombre, y el <strong>-g</strong> es para que nos lo instale globalmente y podamos usarlo en cualquier sitio, si no lo pusieramos solo nos lo instalaría en el directorio donde estuviéramos trabajando en la linea de comandos. Una vez ejecutado se descargará y configurará algunas cosas el solito, veréis unas cuantas líneas como estas:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.03.41.png\" alt=\"Npm list install React\"><br>\nBien una vez instalado ya podemos crear nuestro entorno para la app que vamos a desarrollar, para ello solo necesitamos llamar a nuestro nuevo comando he indicarle al nombre de la app que deseamos crear:</p>\n<pre><code>create-react-app nuclear_superhero_app\n</code></pre>\n<p>Una vez terminado el proceso nos saldrá algo similar a esto<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.08.17.png\" alt=\"Create-react-app command\"><br>\nPor último para empezar a ver la utilidad de esto tenemos que hacer lo que nos sugieren al final, entrar en el directorio y ejecutar <strong>start</strong>:</p>\n<pre><code>cd nuclear_superhero_app\nnpm start\n</code></pre>\n<p>Si todo ha ido bien se os habrá abierto otra pestaña en el navegador con esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.11.31.png\" alt=\"React Start\"></p>\n<p>Básicamente nos ha levantado un &quot;servidor&quot; en local en el puerto 3000 donde podremos ir viendo los cambios en nuestra aplicación casi en tiempo real. Si queremos para el servidor es suficiente con irnos a la consola desde donde lo hemos lanzado y detener el proceso con <strong>ctrl+c</strong> o como soláis hacerlo.</p>\n<p>Con esto ya tendríamos lo que necesitamos para empezar a trabajar realmente con React, que es lo que haremos desde el próximo post, si alguien ha tenido problemas o quiere saber algo de Node que lo ponga en comentarios y lo vamos viendo.Nos vemoooossssss.</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/react-js-iii-entorno-de-desarrollo/","canonical_url":null,"uuid":"84b25ae1-1dbe-4e10-b5de-e9c0dec2d671","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"42","reading_time":3,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Bien antes de ponernos serios desarrollando algo más complejo con React, necesitamos configurar nuestro entorno ya que una app de React necesita de varias dependencias para funcionar correctamente en producción(además que nos facilitan un poco el ir desarrollando).</p>\n<p>Hasta hace poco, con React debíamos hacer toda la configuración y preparación del entorno a mano, pero nuestros amigos de Facebook, se han creado una especie de atajo al estilo <strong>AngularCLI</strong>(más info <a href=\"https://github.com/facebookincubator/create-react-app\">Create React APP</a>), para usarlo lo primero es instalar <a href=\"https://nodejs.org/es/\">NodeJS</a>, es suficiente con instalar la versión <strong>LTS</strong> desde la página principal, para el que no lo sepa NodeJS es la opción servidor de JS, es orientado a eventos lo que le permite manejar un gran número de peticiones, por el momento no voy a entrar mucho en esto, tengo intención de crear una linea de post solo de Node por lo que si os interesa estar atentos ;).</p>\n<p>Una vez instalado podemos comprobar que se ha instalado correctamente con las siguientes instrucciones en nuestra consola de comandos preferida:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">#Para ver la versión de NodeJS\nnode -v\n#La versión de Node Package Manager\nnpm -v \n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-08.54.25.png\" alt=\"Node Check Install\"><br>\nYo simplemente he encadenado los comandos pero os debería salir algo similar a eso.</p>\n<p>Bien lo primero de todo es hacer que <strong>NPM</strong> instale los paquetes que necesitamos:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">npm -g install create-react-app\n</code></pre></div>\n<p>Es tan sencillo como indicarlo con el nombre, y el <strong>-g</strong> es para que nos lo instale globalmente y podamos usarlo en cualquier sitio, si no lo pusieramos solo nos lo instalaría en el directorio donde estuviéramos trabajando en la linea de comandos. Una vez ejecutado se descargará y configurará algunas cosas el solito, veréis unas cuantas líneas como estas:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.03.41.png\" alt=\"Npm list install React\"><br>\nBien una vez instalado ya podemos crear nuestro entorno para la app que vamos a desarrollar, para ello solo necesitamos llamar a nuestro nuevo comando he indicarle al nombre de la app que deseamos crear:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">create-react-app nuclear_superhero_app\n</code></pre></div>\n<p>Una vez terminado el proceso nos saldrá algo similar a esto<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.08.17.png\" alt=\"Create-react-app command\"><br>\nPor último para empezar a ver la utilidad de esto tenemos que hacer lo que nos sugieren al final, entrar en el directorio y ejecutar <strong>start</strong>:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">cd nuclear_superhero_app\nnpm start\n</code></pre></div>\n<p>Si todo ha ido bien se os habrá abierto otra pestaña en el navegador con esto:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.11.31.png\" alt=\"React Start\"></p>\n<p>Básicamente nos ha levantado un \"servidor\" en local en el puerto 3000 donde podremos ir viendo los cambios en nuestra aplicación casi en tiempo real. Si queremos para el servidor es suficiente con irnos a la consola desde donde lo hemos lanzado y detener el proceso con <strong>ctrl+c</strong> o como soláis hacerlo.</p>\n<p>Con esto ya tendríamos lo que necesitamos para empezar a trabajar realmente con React, que es lo que haremos desde el próximo post, si alguien ha tenido problemas o quiere saber algo de Node que lo ponga en comentarios y lo vamos viendo.Nos vemoooossssss.</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien antes de ponernos serios desarrollando algo más complejo con React, necesitamos configurar nuestro entorno ya que una app de React necesita de varias dependencias para funcionar correctamente en producción(además que nos facilitan un poco el ir desarrollando)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Hasta hace poco, con React debíamos hacer toda la configuración y preparación del entorno a mano, pero nuestros amigos de Facebook, se han creado una especie de atajo al estilo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"AngularCLI"}]},{"type":"text","value":"(más info "},{"type":"element","tagName":"a","properties":{"href":"https://github.com/facebookincubator/create-react-app"},"children":[{"type":"text","value":"Create React APP"}]},{"type":"text","value":"), para usarlo lo primero es instalar "},{"type":"element","tagName":"a","properties":{"href":"https://nodejs.org/es/"},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":", es suficiente con instalar la versión "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"LTS"}]},{"type":"text","value":" desde la página principal, para el que no lo sepa NodeJS es la opción servidor de JS, es orientado a eventos lo que le permite manejar un gran número de peticiones, por el momento no voy a entrar mucho en esto, tengo intención de crear una linea de post solo de Node por lo que si os interesa estar atentos ;)."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una vez instalado podemos comprobar que se ha instalado correctamente con las siguientes instrucciones en nuestra consola de comandos preferida:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"#Para ver la versión de NodeJS\nnode -v\n#La versión de Node Package Manager\nnpm -v \n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-08.54.25.png","alt":"Node Check Install"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nYo simplemente he encadenado los comandos pero os debería salir algo similar a eso."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien lo primero de todo es hacer que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NPM"}]},{"type":"text","value":" instale los paquetes que necesitamos:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"npm -g install create-react-app\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Es tan sencillo como indicarlo con el nombre, y el "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"-g"}]},{"type":"text","value":" es para que nos lo instale globalmente y podamos usarlo en cualquier sitio, si no lo pusieramos solo nos lo instalaría en el directorio donde estuviéramos trabajando en la linea de comandos. Una vez ejecutado se descargará y configurará algunas cosas el solito, veréis unas cuantas líneas como estas:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.03.41.png","alt":"Npm list install React"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBien una vez instalado ya podemos crear nuestro entorno para la app que vamos a desarrollar, para ello solo necesitamos llamar a nuestro nuevo comando he indicarle al nombre de la app que deseamos crear:"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"create-react-app nuclear_superhero_app\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Una vez terminado el proceso nos saldrá algo similar a esto"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.08.17.png","alt":"Create-react-app command"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPor último para empezar a ver la utilidad de esto tenemos que hacer lo que nos sugieren al final, entrar en el directorio y ejecutar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"start"}]},{"type":"text","value":":"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"div","properties":{"className":["kg-card","kg-code-card","gatsby-highlight"],"dataLanguage":"text"},"children":[{"type":"element","tagName":"pre","properties":{"className":["language-text"]},"children":[{"type":"element","tagName":"code","properties":{"className":["language-text"]},"children":[{"type":"text","value":"cd nuclear_superhero_app\nnpm start\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si todo ha ido bien se os habrá abierto otra pestaña en el navegador con esto:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\n"},{"type":"element","tagName":"img","properties":{"src":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-04-at-09.11.31.png","alt":"React Start"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Básicamente nos ha levantado un \"servidor\" en local en el puerto 3000 donde podremos ir viendo los cambios en nuestra aplicación casi en tiempo real. Si queremos para el servidor es suficiente con irnos a la consola desde donde lo hemos lanzado y detener el proceso con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"ctrl+c"}]},{"type":"text","value":" o como soláis hacerlo."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con esto ya tendríamos lo que necesitamos para empezar a trabajar realmente con React, que es lo que haremos desde el próximo post, si alguien ha tenido problemas o quiere saber algo de Node que lo ponga en comentarios y lo vamos viendo.Nos vemoooossssss."}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[]},"featureImageSharp":{"base":"Captain-Atom.jpg","publicURL":"/static/ea41313c22f611d45d277d453c4273d1/Captain-Atom.jpg","imageMeta":{"width":864,"height":648},"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCBv/EABYBAQEBAAAAAAAAAAAAAAAAAAMBAv/aAAwDAQACEAMQAAABojay1bnBz//EABkQAQACAwAAAAAAAAAAAAAAAAECAwARE//aAAgBAQABBQKoAmdchqqPFMlZGuC7f//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEiH/2gAIAQMBAT8BONov/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERE0H/2gAIAQIBAT8BbK50/8QAHhAAAwAABwEAAAAAAAAAAAAAAAERAhIiMTJRUmH/2gAIAQEABj8C0x9lWxlq+j9ImHkVn//EABkQAQADAQEAAAAAAAAAAAAAAAEAESExQf/aAAgBAQABPyHlOmjsuNqMAiJQe2TspkuwMcZ4otX5GdLXWf/aAAwDAQACAAMAAAAQy/8A/8QAFhEBAQEAAAAAAAAAAAAAAAAAAQBB/9oACAEDAQE/ECLJZf/EABYRAQEBAAAAAAAAAAAAAAAAAAERAP/aAAgBAgEBPxBJcpVz/8QAHBABAAIDAAMAAAAAAAAAAAAAAQARITFBUWHR/9oACAEBAAE/ECGZHOFc9RXVMNQfYPyzYFbcsWTgugFwsFDeqNnrnxyXBPYm2f/Z","aspectRatio":1.3358778625954197,"src":"/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom.jpg","srcSet":"/static/ea41313c22f611d45d277d453c4273d1/477ba/Captain-Atom.jpg 175w,\n/static/ea41313c22f611d45d277d453c4273d1/06776/Captain-Atom.jpg 350w,\n/static/ea41313c22f611d45d277d453c4273d1/ea4ab/Captain-Atom.jpg 700w,\n/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom.jpg 864w","srcWebp":"/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom.webp","srcSetWebp":"/static/ea41313c22f611d45d277d453c4273d1/9fca7/Captain-Atom.webp 175w,\n/static/ea41313c22f611d45d277d453c4273d1/37a4e/Captain-Atom.webp 350w,\n/static/ea41313c22f611d45d277d453c4273d1/89afa/Captain-Atom.webp 700w,\n/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom.webp 864w","sizes":"(max-width: 700px) 100vw, 700px"}}}}}]}},"pageContext":{"slug":"react-js-i-cambios-en-un-mismo-componente","prev":"dont-stop-the-party-node-js-i","next":"react-superhero-introduccion","tag":"reactjs","limit":3,"skip":0,"primaryTagCount":6,"collectionPaths":{}}},
    "staticQueryHashes": ["1272700106","1676991999","2138873178","2546165603","2681841279","2938721187","293880488","3052966952","4156497161"]}