{
    "componentChunkName": "component---node-modules-gatsby-theme-try-ghost-src-templates-post-js",
    "path": "/react-superhero-v-mobx/",
    "result": {"data":{"ghostPost":{"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.3333333333333333,"src":"/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom-1.jpg","srcSet":"/static/ea41313c22f611d45d277d453c4273d1/65d8c/Captain-Atom-1.jpg 260w,\n/static/ea41313c22f611d45d277d453c4273d1/c5f21/Captain-Atom-1.jpg 520w,\n/static/ea41313c22f611d45d277d453c4273d1/fc1a6/Captain-Atom-1.jpg 864w","srcWebp":"/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom-1.webp","srcSetWebp":"/static/ea41313c22f611d45d277d453c4273d1/dc8f3/Captain-Atom-1.webp 260w,\n/static/ea41313c22f611d45d277d453c4273d1/2db4b/Captain-Atom-1.webp 520w,\n/static/ea41313c22f611d45d277d453c4273d1/65e54/Captain-Atom-1.webp 864w","sizes":"(max-width: 864px) 100vw, 864px"}}}},"prev":{"id":"Ghost__Post__5a338158333e0f134c248f2e","title":"Don't stop the party: Node JS(V) Basics","slug":"dont-stop-the-party-node-js-v","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/nodebaner-1.jpg","excerpt":"Tras nuestro repaso de algunas características que nos serían útiles de\nJavaScript, vamos a ver algunas propiedades, métodos o lógicas de NodeJS que nos\nayudarán con el desarrollo de servicios en este lenguaje.\n\nEvent Loop\nNode usa un solo hilo, o más bien como concepto de ciclo de vida para nosotros\nes así, es posible que internamente se ejecute de otra forma pero insisto no\npara nosotros.\nEste hilo funciona como un bucle, es decir, lo que hace en cada vuelta es\nejecutar el código que le toca e","custom_excerpt":null,"visibility":"public","created_at_pretty":"13 Sep 2017","published_at_pretty":"18 Sep 2017","updated_at_pretty":"22 Jan 2018","created_at":"2017-09-13T09:13:32.000+02:00","published_at":"2017-09-18T10:35:00.000+02:00","updated_at":"2018-01-22T09:47:10.000+01:00","meta_title":null,"meta_description":"Después de ver algunas cosas que necesitaremos de JavaScript, empezaremos con algunas cosas básicas que tenemos que entender de NodeJS","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":"Tras nuestro repaso de algunas características que nos serían útiles de\nJavaScript, vamos a ver algunas propiedades, métodos o lógicas de NodeJS que nos\nayudarán con el desarrollo de servicios en este lenguaje.\n\nEvent Loop\nNode usa un solo hilo, o más bien como concepto de ciclo de vida para nosotros\nes así, es posible que internamente se ejecute de otra forma pero insisto no\npara nosotros.\nEste hilo funciona como un bucle, es decir, lo que hace en cada vuelta es\nejecutar el código que le toca en ese momento(todo síncrono), y si se encuentra\nalgún callback lo ejecuta pero, repito pero los va dejando pendientes y\ncomprueba si han terminado en vueltas posteriores y si han terminado entonces\nejecúta sus el código pertinente a ese callback.\nPor este motivo todo el nuestro código en NodeJS tenemos que procurar que sea no\nbloqueante, si puede bloquear de algúna forma el hilo eso significa que tenemos\nque hacerlo asíncrono para que el event loop(nuestro único hilo) no se detenga.\nTodas las llamadas a funciones de entrada/salida lectura/escritura del disco,\nred, base de datos deberia ser asíncrono.\n\nProcess\nProcess es un objeto global que está disponible en nuestras aplicaciones, el\ncual nos va a permitir por ejemplo:\nsaber en que sistema operativo está funcionando,\n\nprocess.platform;\n\n\nparar la ejecución con un código de salida,\n\nprocess.exit(int); //0 para salida correcta\n\n\nresponder a eventos como este de 'exit' con un callback para hacer algo antes de\nparar la ejecución\n\nprocess.on('exit',callback);\n\n\no hacer algo en la siguiente vuelta del event loop\n\nprocess.nextTick(function(){\n    console.log('Siguiente vueltaaaaaaaaaa')\n}\n\n\nEjemplo de información de sistema\n\n'use strict';\n\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n\n\nCon este código vereis varios ejemplos de información que podemos sacar gracias\na process.\n\nVeamos ahora un ejemplo de exit, para ello vamos poner antes de todos los logs\nlo siguiente\n\nprocess.exit(2);\n\n\nSi ahora ejecutais vereis como se finaliza el programa antes de mostrar nada y\npodéis comprobar el código de salida con\nEn linux/Mac:\n\necho $?\n\n\nEn Windows:\n\necho %errorlevel%\n\n\n\n\nPor último vamos a probar a realizar algo justo antes de salir para ello, vamos\na dejar nuestro código asi:\n\n'use strict';\n\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nprocess.on('exit', () => { console.log('Antes de salir digo BYEEEEEe')})\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\n\nprocess.exit(0);\n\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n\n\n\nSi ahora ejecutamos esto veréis algo similar a esto\n\nComo veis nos muestra los tres primeros logs y en cuanto llega al exit se\ndespide y ya no nos muestra más, sencillo verdad?\n\nEventEmitter\nEste método puede ser una herramienta muy útil para según que cosa, lo que nos\npermite es asignar una o varias funciones a un evento, es decir, cada vez que\nllamemos a ese evento se ejecutará su función asignada.\nVeamoslo con un ejemplo, antes de nada vamos a importar lo que necesitamos para\nusarlo:\n\n'use strict';\n\nvar events = require('events');\nvar eventEmitter = new events.EventEmitter();\n\n\nYa estamos listos, ahora pensemos en cualquier juego de Mario Bros.. Cada vez\nque nuestro Mario hacia algún tipo de evento distinto a moverse izquierda o\nderecha emitía un sonido, ya fuera saltar, coger alguna moneda o saltar sobre\nalguna inocente tortuga, es decir, a nivel de código tiene que tener un método\nsimilar a playSound no? Pues vamos a crearlo\n\nfunction playSound(){\n    console.log(\"Mario hace algo\");\n}\n\n\nYa tenemos nuestro método, ahora como hemos comentado esto tiene que responder a\nalgún evento, por lo que vamos a asignarle un nombre de evento a ese método\n\neventEmitter.on('play music',playSound);\n\n\nPara llamar a ese evento que hemos creado es tan simple como emitirlo\n\neventEmitter.emit('play music');\n\n\nAsi de simple jejejejeje pero esto realmente si lo pensamos es poco eficiente,\ncon este tendriamos que crear realmente un evento por cada tipo desonido,\nno?......Pues no realmente, también nos permite pasarle parámetros, vamos a\ncambiar nuestro método para que reciba un parámetro donde indicariamos el tipo\nde sonido\n\nfunction playSound(action){\n    console.log(\"Mario \",action);\n}\n\n\nY hagamos que nuestro emit le pase algún parámetro\n\neventEmitter.emit('play music','coge moneda');\n\n\nY voilá si ejecutámos veremos que Mario ha cogido una moneda\n\nComentar que podemos suscribir varias funciones al mismo evento, simplemente\ntendriamos que hacer otro eventEmitter.on con el mismo nombre de evento y otro\nnombre de función, esto lo que haría seria ejecutar ambos.\nY es en este punto donde por ejemplo podemos ver mejor su utilidad, si seguimos\nusando nuestro ejemplo de Mario, supongamos el momento en el que Mario salta\nsobre una tortuga, esto tendría que gestionar entre otras cosas el sonido al\npisar la tortuga, el efecto visual de la tortuga y si esto nos da puntos\ntendríamos que efectuar la gestión de estos. Son bastantes cosas no?....pero si\ntenemos todas estas necesidades subscritas al mismo evento, por ejemplo \nturtleDeath solo tendriamos que hacer\n\neventEmitter.emit('turtleDeath') \n\n\nY listo se ejecutarian todos los eventos y el código quedaría bastante limpio.\n\nCreo que más o menos queda todo claro, en el próximo post hablaremos de los \nmódulos de Node y de como crearlos.\n\nUn abrazooorrrrr","html":"<!--kg-card-begin: markdown--><p>Tras nuestro repaso de algunas características que nos serían útiles de JavaScript, vamos a ver algunas propiedades, métodos o lógicas de <strong>NodeJS</strong> que nos ayudarán con el desarrollo de servicios en este lenguaje.</p>\n<h3 id=\"eventloop\">Event Loop</h3>\n<p>Node usa un solo hilo, o más bien como concepto de ciclo de vida para nosotros es así, es posible que internamente se ejecute de otra forma pero insisto no para nosotros.<br>\nEste hilo funciona como un bucle, es decir, lo que hace en cada vuelta es ejecutar el código que le toca en ese momento(todo síncrono), y si se encuentra algún callback lo ejecuta <strong>pero</strong>, repito <strong>pero</strong> los va dejando pendientes y comprueba si han terminado en vueltas posteriores y si han terminado entonces ejecúta sus el código pertinente a ese callback.<br>\nPor este motivo todo el nuestro código en <strong>NodeJS</strong> tenemos que procurar que sea no bloqueante, si puede bloquear de algúna forma el hilo eso significa que tenemos que hacerlo asíncrono para que el event loop(nuestro único hilo) no se detenga. Todas las llamadas a funciones de entrada/salida lectura/escritura del disco, red, base de datos deberia ser asíncrono.</p>\n<h3 id=\"process\">Process</h3>\n<p>Process es un objeto global que está disponible en nuestras aplicaciones, el cual nos va a permitir por ejemplo:<br>\nsaber en que sistema operativo está funcionando,</p>\n<pre><code>process.platform;\n</code></pre>\n<p>parar la ejecución con un código de salida,</p>\n<pre><code>process.exit(int); //0 para salida correcta\n</code></pre>\n<p>responder a eventos como este de <strong>'exit'</strong> con un callback para hacer algo antes de parar la ejecución</p>\n<pre><code>process.on('exit',callback);\n</code></pre>\n<p>o hacer algo en la siguiente vuelta del <strong>event loop</strong></p>\n<pre><code>process.nextTick(function(){\n    console.log('Siguiente vueltaaaaaaaaaa')\n}\n</code></pre>\n<p>Ejemplo de información de sistema</p>\n<pre><code>'use strict';\n\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n</code></pre>\n<p>Con este código vereis varios ejemplos de información que podemos sacar gracias a process.</p>\n<p>Veamos ahora un ejemplo de <strong>exit</strong>, para ello vamos poner antes de todos los logs lo siguiente</p>\n<pre><code>process.exit(2);\n</code></pre>\n<p>Si ahora ejecutais vereis como se finaliza el programa antes de mostrar nada y podéis comprobar el código de salida con<br>\nEn linux/Mac:</p>\n<pre><code>echo $?\n</code></pre>\n<p>En Windows:</p>\n<pre><code>echo %errorlevel%\n</code></pre>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-09.46.31.png\" alt=\"Error Code\"></p>\n<p>Por último vamos a probar a realizar algo justo antes de salir para ello, vamos a dejar nuestro código asi:</p>\n<pre><code>'use strict';\n\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nprocess.on('exit', () =&gt; { console.log('Antes de salir digo BYEEEEEe')})\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\n\nprocess.exit(0);\n\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n\n</code></pre>\n<p>Si ahora ejecutamos esto veréis algo similar a esto<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-09.51.57.png\" alt=\"Log exit event\"><br>\nComo veis nos muestra los tres primeros logs y en cuanto llega al exit se despide y ya no nos muestra más, sencillo verdad?</p>\n<h3 id=\"eventemitter\">EventEmitter</h3>\n<p>Este método puede ser una herramienta muy útil para según que cosa, lo que nos permite es asignar una o varias funciones a un evento, es decir, cada vez que llamemos a ese evento se ejecutará su función asignada.<br>\nVeamoslo con un ejemplo, antes de nada vamos a importar lo que necesitamos para usarlo:</p>\n<pre><code>'use strict';\n\nvar events = require('events');\nvar eventEmitter = new events.EventEmitter();\n</code></pre>\n<p>Ya estamos listos, ahora pensemos en cualquier juego de <strong>Mario Bros.</strong>. Cada vez que nuestro Mario hacia algún tipo de evento distinto a moverse izquierda o derecha emitía un sonido, ya fuera saltar, coger alguna moneda o saltar sobre alguna inocente tortuga, es decir, a nivel de código tiene que tener un método similar a <strong>playSound</strong> no? Pues vamos a crearlo</p>\n<pre><code>function playSound(){\n    console.log(&quot;Mario hace algo&quot;);\n}\n</code></pre>\n<p>Ya tenemos nuestro método, ahora como hemos comentado esto tiene que responder a algún evento, por lo que vamos a asignarle un nombre de evento a ese método</p>\n<pre><code>eventEmitter.on('play music',playSound);\n</code></pre>\n<p>Para llamar a ese evento que hemos creado es tan simple como <strong>emitirlo</strong></p>\n<pre><code>eventEmitter.emit('play music');\n</code></pre>\n<p>Asi de simple jejejejeje pero esto realmente si lo pensamos es poco eficiente, con este tendriamos que crear realmente un evento por cada tipo desonido, no?......Pues no realmente, también nos permite pasarle parámetros, vamos a cambiar nuestro método para que reciba un parámetro donde indicariamos el tipo de sonido</p>\n<pre><code>function playSound(action){\n    console.log(&quot;Mario &quot;,action);\n}\n</code></pre>\n<p>Y hagamos que nuestro <strong>emit</strong> le pase algún parámetro</p>\n<pre><code>eventEmitter.emit('play music','coge moneda');\n</code></pre>\n<p>Y voilá si ejecutámos veremos que <strong>Mario ha cogido una moneda</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-15-at-09.04.01.png\" alt=\"EventEmitter example\"><br>\nComentar que podemos suscribir varias funciones al mismo evento, simplemente tendriamos que hacer otro <strong>eventEmitter.on</strong> con el mismo nombre de evento y otro nombre de función, esto lo que haría seria ejecutar ambos.<br>\nY es en este punto donde por ejemplo podemos ver mejor su utilidad, si seguimos usando nuestro ejemplo de Mario, supongamos el momento en el que Mario salta sobre una tortuga, esto tendría que gestionar entre otras cosas el sonido al pisar la tortuga, el efecto visual de la tortuga y si esto nos da puntos tendríamos que efectuar la gestión de estos. Son bastantes cosas no?....pero si tenemos todas estas necesidades subscritas al mismo evento, por ejemplo <strong>turtleDeath</strong> solo tendriamos que hacer</p>\n<pre><code>eventEmitter.emit('turtleDeath') \n</code></pre>\n<p>Y listo se ejecutarian todos los eventos y el código quedaría bastante limpio.</p>\n<p>Creo que más o menos queda todo claro, en el próximo post hablaremos de los <strong>módulos</strong> de Node y de como crearlos.</p>\n<p>Un abrazooorrrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/dont-stop-the-party-node-js-v/","canonical_url":null,"uuid":"1fe4938b-6348-4f8e-b92a-029ec8a1d8ae","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59b8da9c6c31a60001f69f26","reading_time":4,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>Tras nuestro repaso de algunas características que nos serían útiles de JavaScript, vamos a ver algunas propiedades, métodos o lógicas de <strong>NodeJS</strong> que nos ayudarán con el desarrollo de servicios en este lenguaje.</p>\n<h3 id=\"eventloop\">Event Loop</h3>\n<p>Node usa un solo hilo, o más bien como concepto de ciclo de vida para nosotros es así, es posible que internamente se ejecute de otra forma pero insisto no para nosotros.<br>\nEste hilo funciona como un bucle, es decir, lo que hace en cada vuelta es ejecutar el código que le toca en ese momento(todo síncrono), y si se encuentra algún callback lo ejecuta <strong>pero</strong>, repito <strong>pero</strong> los va dejando pendientes y comprueba si han terminado en vueltas posteriores y si han terminado entonces ejecúta sus el código pertinente a ese callback.<br>\nPor este motivo todo el nuestro código en <strong>NodeJS</strong> tenemos que procurar que sea no bloqueante, si puede bloquear de algúna forma el hilo eso significa que tenemos que hacerlo asíncrono para que el event loop(nuestro único hilo) no se detenga. Todas las llamadas a funciones de entrada/salida lectura/escritura del disco, red, base de datos deberia ser asíncrono.</p>\n<h3 id=\"process\">Process</h3>\n<p>Process es un objeto global que está disponible en nuestras aplicaciones, el cual nos va a permitir por ejemplo:<br>\nsaber en que sistema operativo está funcionando,</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">process.platform;\n</code></pre></div>\n<p>parar la ejecución con un código de salida,</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">process.exit(int); //0 para salida correcta\n</code></pre></div>\n<p>responder a eventos como este de <strong>'exit'</strong> con un callback para hacer algo antes de parar la ejecución</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">process.on('exit',callback);\n</code></pre></div>\n<p>o hacer algo en la siguiente vuelta del <strong>event loop</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">process.nextTick(function(){\n    console.log('Siguiente vueltaaaaaaaaaa')\n}\n</code></pre></div>\n<p>Ejemplo de información de sistema</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\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n</code></pre></div>\n<p>Con este código vereis varios ejemplos de información que podemos sacar gracias a process.</p>\n<p>Veamos ahora un ejemplo de <strong>exit</strong>, para ello vamos poner antes de todos los logs lo siguiente</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">process.exit(2);\n</code></pre></div>\n<p>Si ahora ejecutais vereis como se finaliza el programa antes de mostrar nada y podéis comprobar el código de salida con<br>\nEn linux/Mac:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">echo $?\n</code></pre></div>\n<p>En Windows:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">echo %errorlevel%\n</code></pre></div>\n<p><img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-09.46.31.png\" alt=\"Error Code\"></p>\n<p>Por último vamos a probar a realizar algo justo antes de salir para ello, vamos a dejar nuestro código asi:</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\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nprocess.on('exit', () => { console.log('Antes de salir digo BYEEEEEe')})\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\n\nprocess.exit(0);\n\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n\n</code></pre></div>\n<p>Si ahora ejecutamos esto veréis algo similar a esto<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-09.51.57.png\" alt=\"Log exit event\"><br>\nComo veis nos muestra los tres primeros logs y en cuanto llega al exit se despide y ya no nos muestra más, sencillo verdad?</p>\n<h3 id=\"eventemitter\">EventEmitter</h3>\n<p>Este método puede ser una herramienta muy útil para según que cosa, lo que nos permite es asignar una o varias funciones a un evento, es decir, cada vez que llamemos a ese evento se ejecutará su función asignada.<br>\nVeamoslo con un ejemplo, antes de nada vamos a importar lo que necesitamos para usarlo:</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\nvar events = require('events');\nvar eventEmitter = new events.EventEmitter();\n</code></pre></div>\n<p>Ya estamos listos, ahora pensemos en cualquier juego de <strong>Mario Bros.</strong>. Cada vez que nuestro Mario hacia algún tipo de evento distinto a moverse izquierda o derecha emitía un sonido, ya fuera saltar, coger alguna moneda o saltar sobre alguna inocente tortuga, es decir, a nivel de código tiene que tener un método similar a <strong>playSound</strong> no? Pues vamos a crearlo</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">function playSound(){\n    console.log(\"Mario hace algo\");\n}\n</code></pre></div>\n<p>Ya tenemos nuestro método, ahora como hemos comentado esto tiene que responder a algún evento, por lo que vamos a asignarle un nombre de evento a ese método</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">eventEmitter.on('play music',playSound);\n</code></pre></div>\n<p>Para llamar a ese evento que hemos creado es tan simple como <strong>emitirlo</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">eventEmitter.emit('play music');\n</code></pre></div>\n<p>Asi de simple jejejejeje pero esto realmente si lo pensamos es poco eficiente, con este tendriamos que crear realmente un evento por cada tipo desonido, no?......Pues no realmente, también nos permite pasarle parámetros, vamos a cambiar nuestro método para que reciba un parámetro donde indicariamos el tipo de sonido</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">function playSound(action){\n    console.log(\"Mario \",action);\n}\n</code></pre></div>\n<p>Y hagamos que nuestro <strong>emit</strong> le pase algún parámetro</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">eventEmitter.emit('play music','coge moneda');\n</code></pre></div>\n<p>Y voilá si ejecutámos veremos que <strong>Mario ha cogido una moneda</strong><br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-15-at-09.04.01.png\" alt=\"EventEmitter example\"><br>\nComentar que podemos suscribir varias funciones al mismo evento, simplemente tendriamos que hacer otro <strong>eventEmitter.on</strong> con el mismo nombre de evento y otro nombre de función, esto lo que haría seria ejecutar ambos.<br>\nY es en este punto donde por ejemplo podemos ver mejor su utilidad, si seguimos usando nuestro ejemplo de Mario, supongamos el momento en el que Mario salta sobre una tortuga, esto tendría que gestionar entre otras cosas el sonido al pisar la tortuga, el efecto visual de la tortuga y si esto nos da puntos tendríamos que efectuar la gestión de estos. Son bastantes cosas no?....pero si tenemos todas estas necesidades subscritas al mismo evento, por ejemplo <strong>turtleDeath</strong> solo tendriamos que hacer</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">eventEmitter.emit('turtleDeath') \n</code></pre></div>\n<p>Y listo se ejecutarian todos los eventos y el código quedaría bastante limpio.</p>\n<p>Creo que más o menos queda todo claro, en el próximo post hablaremos de los <strong>módulos</strong> de Node y de como crearlos.</p>\n<p>Un abrazooorrrrr</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":"Tras nuestro repaso de algunas características que nos serían útiles de JavaScript, vamos a ver algunas propiedades, métodos o lógicas de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":" que nos ayudarán con el desarrollo de servicios en este lenguaje."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"eventloop"},"children":[{"type":"text","value":"Event Loop"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Node usa un solo hilo, o más bien como concepto de ciclo de vida para nosotros es así, es posible que internamente se ejecute de otra forma pero insisto no para nosotros."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEste hilo funciona como un bucle, es decir, lo que hace en cada vuelta es ejecutar el código que le toca en ese momento(todo síncrono), y si se encuentra algún callback lo ejecuta "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pero"}]},{"type":"text","value":", repito "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"pero"}]},{"type":"text","value":" los va dejando pendientes y comprueba si han terminado en vueltas posteriores y si han terminado entonces ejecúta sus el código pertinente a ese callback."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPor este motivo todo el nuestro código en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":" tenemos que procurar que sea no bloqueante, si puede bloquear de algúna forma el hilo eso significa que tenemos que hacerlo asíncrono para que el event loop(nuestro único hilo) no se detenga. Todas las llamadas a funciones de entrada/salida lectura/escritura del disco, red, base de datos deberia ser asíncrono."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"process"},"children":[{"type":"text","value":"Process"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Process es un objeto global que está disponible en nuestras aplicaciones, el cual nos va a permitir por ejemplo:"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nsaber en que sistema operativo está funcionando,"}]},{"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":"process.platform;\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"parar la ejecución con un código de salida,"}]},{"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":"process.exit(int); //0 para salida correcta\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"responder a eventos como este de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"'exit'"}]},{"type":"text","value":" con un callback para hacer algo antes de parar la ejecució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":"process.on('exit',callback);\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"o hacer algo en la siguiente vuelta del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"event loop"}]}]},{"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":"process.nextTick(function(){\n    console.log('Siguiente vueltaaaaaaaaaa')\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ejemplo de información de sistema"}]},{"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\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con este código vereis varios ejemplos de información que podemos sacar gracias a process."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Veamos ahora un ejemplo de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"exit"}]},{"type":"text","value":", para ello vamos poner antes de todos los logs 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":"process.exit(2);\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora ejecutais vereis como se finaliza el programa antes de mostrar nada y podéis comprobar el código de salida con"},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nEn linux/Mac:"}]},{"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":"echo $?\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En Windows:"}]},{"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":"echo %errorlevel%\n"}]}]}]},{"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-13-at-09.46.31.png","alt":"Error Code"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Por último vamos a probar a realizar algo justo antes de salir para ello, vamos a dejar nuestro código 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":"'use strict';\n\nvar systemInfo = {\n    pid: process.pid,\n    version: process.version,\n    platform: process.platform,\n    title: process.title,\n    arg: process.argv,\n    execPath: process.execPath,\n    folder: process.cwd()\n};\n\nprocess.on('exit', () => { console.log('Antes de salir digo BYEEEEEe')})\n\nconsole.log('Id de proceso ' + systemInfo.pid)\nconsole.log('Versión de Node' + systemInfo.version)\nconsole.log('Plataforma ' + systemInfo.platform)\n\nprocess.exit(0);\n\nconsole.log('Nombre de proceso ' + systemInfo.title)\nconsole.log('Argumentos que recibe ' + systemInfo.arg)\nconsole.log('Path de ejecución de proceso '+ systemInfo.execPath)\nconsole.log('Path de ejecución de aplicación de node '+ systemInfo.folder)\n\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ahora ejecutamos esto veréis 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/09/Screen-Shot-2017-09-13-at-09.51.57.png","alt":"Log exit event"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComo veis nos muestra los tres primeros logs y en cuanto llega al exit se despide y ya no nos muestra más, sencillo verdad?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h3","properties":{"id":"eventemitter"},"children":[{"type":"text","value":"EventEmitter"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este método puede ser una herramienta muy útil para según que cosa, lo que nos permite es asignar una o varias funciones a un evento, es decir, cada vez que llamemos a ese evento se ejecutará su función asignada."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nVeamoslo con un ejemplo, antes de nada vamos a importar lo que necesitamos para usarlo:"}]},{"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\nvar events = require('events');\nvar eventEmitter = new events.EventEmitter();\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya estamos listos, ahora pensemos en cualquier juego de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mario Bros."}]},{"type":"text","value":". Cada vez que nuestro Mario hacia algún tipo de evento distinto a moverse izquierda o derecha emitía un sonido, ya fuera saltar, coger alguna moneda o saltar sobre alguna inocente tortuga, es decir, a nivel de código tiene que tener un método similar a "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"playSound"}]},{"type":"text","value":" no? Pues vamos a crearlo"}]},{"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":"function playSound(){\n    console.log(\"Mario hace algo\");\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ya tenemos nuestro método, ahora como hemos comentado esto tiene que responder a algún evento, por lo que vamos a asignarle un nombre de evento a ese método"}]},{"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":"eventEmitter.on('play music',playSound);\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Para llamar a ese evento que hemos creado es tan simple como "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"emitirlo"}]}]},{"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":"eventEmitter.emit('play music');\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Asi de simple jejejejeje pero esto realmente si lo pensamos es poco eficiente, con este tendriamos que crear realmente un evento por cada tipo desonido, no?......Pues no realmente, también nos permite pasarle parámetros, vamos a cambiar nuestro método para que reciba un parámetro donde indicariamos el tipo de sonido"}]},{"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":"function playSound(action){\n    console.log(\"Mario \",action);\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y hagamos que nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"emit"}]},{"type":"text","value":" le pase algún parámetro"}]},{"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":"eventEmitter.emit('play music','coge moneda');\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y voilá si ejecutámos veremos que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Mario ha cogido una moneda"}]},{"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-15-at-09.04.01.png","alt":"EventEmitter example"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nComentar que podemos suscribir varias funciones al mismo evento, simplemente tendriamos que hacer otro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"eventEmitter.on"}]},{"type":"text","value":" con el mismo nombre de evento y otro nombre de función, esto lo que haría seria ejecutar ambos."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nY es en este punto donde por ejemplo podemos ver mejor su utilidad, si seguimos usando nuestro ejemplo de Mario, supongamos el momento en el que Mario salta sobre una tortuga, esto tendría que gestionar entre otras cosas el sonido al pisar la tortuga, el efecto visual de la tortuga y si esto nos da puntos tendríamos que efectuar la gestión de estos. Son bastantes cosas no?....pero si tenemos todas estas necesidades subscritas al mismo evento, por ejemplo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"turtleDeath"}]},{"type":"text","value":" solo tendriamos que hacer"}]},{"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":"eventEmitter.emit('turtleDeath') \n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y listo se ejecutarian todos los eventos y el código quedaría bastante limpio."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Creo que más o menos queda todo claro, en el próximo post hablaremos de los "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"módulos"}]},{"type":"text","value":" de Node y de como crearlos."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Un abrazooorrrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"eventloop","heading":"Event Loop"},{"id":"process","heading":"Process"},{"id":"eventemitter","heading":"EventEmitter"}]},"featureImageSharp":{"base":"nodebaner-1.jpg","publicURL":"/static/ebae59fce798d71ce68bf2a304f1491f/nodebaner-1.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-1.jpg","srcSet":"/static/ebae59fce798d71ce68bf2a304f1491f/477ba/nodebaner-1.jpg 175w,\n/static/ebae59fce798d71ce68bf2a304f1491f/06776/nodebaner-1.jpg 350w,\n/static/ebae59fce798d71ce68bf2a304f1491f/ea4ab/nodebaner-1.jpg 700w,\n/static/ebae59fce798d71ce68bf2a304f1491f/3055e/nodebaner-1.jpg 1050w,\n/static/ebae59fce798d71ce68bf2a304f1491f/eff08/nodebaner-1.jpg 1400w,\n/static/ebae59fce798d71ce68bf2a304f1491f/34c3a/nodebaner-1.jpg 1680w","srcWebp":"/static/ebae59fce798d71ce68bf2a304f1491f/89afa/nodebaner-1.webp","srcSetWebp":"/static/ebae59fce798d71ce68bf2a304f1491f/9fca7/nodebaner-1.webp 175w,\n/static/ebae59fce798d71ce68bf2a304f1491f/37a4e/nodebaner-1.webp 350w,\n/static/ebae59fce798d71ce68bf2a304f1491f/89afa/nodebaner-1.webp 700w,\n/static/ebae59fce798d71ce68bf2a304f1491f/78e7a/nodebaner-1.webp 1050w,\n/static/ebae59fce798d71ce68bf2a304f1491f/03d34/nodebaner-1.webp 1400w,\n/static/ebae59fce798d71ce68bf2a304f1491f/41aa5/nodebaner-1.webp 1680w","sizes":"(max-width: 700px) 100vw, 700px"}}}},"next":{"id":"Ghost__Post__5a338158333e0f134c248f2d","title":"Don't stop the party: Node JS(IV) Hablemos un poco de JS (III)","slug":"dont-stop-the-party-node-js-iv-hablemos-un-poco-de-js-iii","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/09/nodebaner.jpg","excerpt":"Herencia\nEn JavaScript también existe este concepto, con la ayuda de lo que hemos visto\nen el post anterior, los prototypes, para resumir un poco lo que hacemos es\nllamar al \"padre\" del cual queramos heredar(como si llamaramos a super en otros\nlenguajes) y le decimos que cambie su this(su contexto o instancia) por el\nnuestro junto con los parámetros que necesitemos.\nCreo que en este caso es mejor verlo con un ejemplo, para ello vamos a crearnos\nun constructor y luego extenderemos de él.\n\nfunctio","custom_excerpt":null,"visibility":"public","created_at_pretty":"12 Sep 2017","published_at_pretty":"12 Sep 2017","updated_at_pretty":"22 Jan 2018","created_at":"2017-09-12T21:09:36.000+02:00","published_at":"2017-09-12T09:06:00.000+02:00","updated_at":"2018-01-22T09:51:52.000+01:00","meta_title":null,"meta_description":"Continuemos con nuestro repaso a algunos conceptos de JavaScript para poder entender y usar correctamente NodeJS","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":"Herencia\nEn JavaScript también existe este concepto, con la ayuda de lo que hemos visto\nen el post anterior, los prototypes, para resumir un poco lo que hacemos es\nllamar al \"padre\" del cual queramos heredar(como si llamaramos a super en otros\nlenguajes) y le decimos que cambie su this(su contexto o instancia) por el\nnuestro junto con los parámetros que necesitemos.\nCreo que en este caso es mejor verlo con un ejemplo, para ello vamos a crearnos\nun constructor y luego extenderemos de él.\n\nfunction Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n     }\n  }\n\n\nEste sería nuestro constructor, vamos a crear un elemento para ver que funciona\n\nvar mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n\n\nSi ejecutamos esto(recordar con node nombreFicheroJS), veríamos que funciona\n\n\nAhora vamos a crear otra función que herede de la primera, para ello nos valemos\ndel método que tienen todas las funciones call\n\nfunction Hero(alias){\n      Superhero.call(this, alias);\n  }\n\n\nComo véis le pasamos el this de nuestro método y le pasamos el parámetro de la\nfunción superhero.\nPor último añadimos a los prototipos de la función Hero, un nuevo Superhero para\nque realmente lo herede, y tras esto ya podriamos usar Hero con las propiedades\nde Superhero\n\nHero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n\n\nNuestro rorschach puede usar los mismos métodos que Superhero, y para\ncomprobarlo he vuesto unos cuantos logs que nos mostrarían cuales son los\nprototypes que tiene, y si es una instancia de cada uno de nuestros\nconstructores\n\n\nHerencia Múltiple\nPodemos simular herencia múltiple aprovechando lo que acabamos de hacer y usando\nel método assign, este método lo que hace es copiar las propiedades de un objeto\nen otro, con lo que el objeto destino puede usarlas como si fueran suyas.\nVeámoslo con un ejemplo continuando con lo anterior.\n\nLo primero vamos a crear otro constructor, en este caso SuperPowers()\n\nfunction SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n\n\nY a continuación lo que haremos será \"asignarle\" estas propiedades a nuestro \nrorschach\n\nObject.assign(rorschach, new SuperPowers());\n\n\nSimplemente tenemos que usar el método assign de Object y como parámetros le\npasamos la instancia del objeto destino y una instancia del objeto origen, en\neste caso con new SuperPowers()\n\nAhora simplemente podemos comprobar que realmente nuestro rorschach tiene las\npropiedades de SuperPowers\n\nrorschach.superStrength();\nrorschach.superSpeed();\n\n\nAdemás le añadiremos lo mismo que antes para comprobar si es una instancia de \nSuperPowers, quedando así todo el código\n\n//Herencia\n\nfunction Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n    }\n}\n  \nvar mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n  \n  //Herencia de superhero\nfunction Hero(alias){\n    Superhero.call(this, alias);\n}\n  \nHero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n\n//Herencia Múltiple\nfunction SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n\nObject.assign(rorschach, new SuperPowers());\n\n\nrorschach.superStrength();\nrorschach.superSpeed();\n\nconsole.log('Es una instancia de SuperPowers? ' + (rorschach instanceof SuperPowers));\n\n\nLo que nos daría este resultado\n\n\nAnda!!! Hay algo distinto verdad?? Nos dice que no es una instancia de \nSuperPowers...pero ¿por qué?.. Bueno en este caso es bastante simple, realmente\nlo que hacemos es una copia de propiedades de un elemento a otro, es decir,\nsería como si el constructor de nuestro rorschach hubiera tenido las mismas\npropiedades que SuperPowers.\n\nY hasta aquí el repaso de algunos elementos de JavasScript, a partir del próximo\npost ya empezaremos a ver NodeJS (Por fiiiiiin!!!! ;) )\n\nNos vemoooossssss, un abrazooooooorrrr","html":"<!--kg-card-begin: markdown--><h2 id=\"herencia\">Herencia</h2>\n<p>En JavaScript también existe este concepto, con la ayuda de lo que hemos visto en el post anterior, <strong>los prototypes</strong>, para resumir un poco lo que hacemos es llamar al <strong>&quot;padre&quot;</strong> del cual queramos heredar(como si llamaramos a super en otros lenguajes) y le decimos que cambie su <strong>this</strong>(su contexto o instancia) por el nuestro junto con los parámetros que necesitemos.<br>\nCreo que en este caso es mejor verlo con un ejemplo, para ello vamos a crearnos un constructor y luego extenderemos de él.</p>\n<pre><code>function Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n     }\n  }\n</code></pre>\n<p>Este sería nuestro constructor, vamos a crear un elemento para ver que funciona</p>\n<pre><code>var mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n</code></pre>\n<p>Si ejecutamos esto(recordar con <strong>node nombreFicheroJS</strong>), veríamos que funciona<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-12-at-21.43.50.png\" alt=\"Constructor example\"></p>\n<p>Ahora vamos a crear otra función que herede de la primera, para ello nos valemos del método que tienen todas las funciones <strong>call</strong></p>\n<pre><code>function Hero(alias){\n      Superhero.call(this, alias);\n  }\n</code></pre>\n<p>Como véis le pasamos el this de nuestro método y le pasamos el parámetro de la función superhero.<br>\nPor último añadimos a los prototipos de la función Hero, un nuevo <strong>Superhero</strong> para que realmente lo herede, y tras esto ya podriamos usar <strong>Hero</strong> con las propiedades de <strong>Superhero</strong></p>\n<pre><code>Hero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n</code></pre>\n<p>Nuestro <strong>rorschach</strong> puede usar los mismos métodos que <strong>Superhero</strong>, y para comprobarlo he vuesto unos cuantos logs que nos mostrarían cuales son los prototypes que tiene, y si es una instancia de cada uno de nuestros constructores<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-08.42.43.png\" alt=\"Herence check logs\"></p>\n<h2 id=\"herenciamltiple\">Herencia Múltiple</h2>\n<p>Podemos simular herencia múltiple aprovechando lo que acabamos de hacer y usando el método <strong>assign</strong>, este método lo que hace es copiar las propiedades de un objeto en otro, con lo que el objeto destino puede usarlas como si fueran suyas. Veámoslo con un ejemplo continuando con lo anterior.</p>\n<p>Lo primero vamos a crear otro constructor, en este caso <strong>SuperPowers()</strong></p>\n<pre><code>function SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n</code></pre>\n<p>Y a continuación lo que haremos será <strong>&quot;asignarle&quot;</strong> estas propiedades a nuestro <strong>rorschach</strong></p>\n<pre><code>Object.assign(rorschach, new SuperPowers());\n</code></pre>\n<p>Simplemente tenemos que usar el método <strong>assign</strong> de <strong>Object</strong> y como parámetros le pasamos la instancia del objeto destino y una instancia del objeto origen, en este caso con <strong>new SuperPowers()</strong></p>\n<p>Ahora simplemente podemos comprobar que realmente nuestro <strong>rorschach</strong> tiene las propiedades de <strong>SuperPowers</strong></p>\n<pre><code>rorschach.superStrength();\nrorschach.superSpeed();\n</code></pre>\n<p>Además le añadiremos lo mismo que antes para comprobar si es una instancia de <strong>SuperPowers</strong>, quedando así todo el código</p>\n<pre><code>//Herencia\n\nfunction Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n    }\n}\n  \nvar mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n  \n  //Herencia de superhero\nfunction Hero(alias){\n    Superhero.call(this, alias);\n}\n  \nHero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n\n//Herencia Múltiple\nfunction SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n\nObject.assign(rorschach, new SuperPowers());\n\n\nrorschach.superStrength();\nrorschach.superSpeed();\n\nconsole.log('Es una instancia de SuperPowers? ' + (rorschach instanceof SuperPowers));\n</code></pre>\n<p>Lo que nos daría este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-09.00.25.png\" alt=\"Multiple Herence\"></p>\n<p>Anda!!! Hay algo distinto verdad?? Nos dice que no es una instancia de <strong>SuperPowers</strong>...pero ¿por qué?.. Bueno en este caso es bastante simple, realmente lo que hacemos es una copia de propiedades de un elemento a otro, es decir, sería como si el constructor de nuestro <strong>rorschach</strong> hubiera tenido las mismas propiedades que <strong>SuperPowers</strong>.</p>\n<p>Y hasta aquí el repaso de algunos elementos de JavasScript, a partir del próximo post ya empezaremos a ver <strong>NodeJS</strong> (Por fiiiiiin!!!! ;) )</p>\n<p>Nos vemoooossssss, un abrazooooooorrrr</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/dont-stop-the-party-node-js-iv-hablemos-un-poco-de-js-iii/","canonical_url":null,"uuid":"2605201f-0e02-4e51-bcd4-4a798ba06ba2","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"59b830f06c31a60001f69f23","reading_time":3,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><h2 id=\"herencia\">Herencia</h2>\n<p>En JavaScript también existe este concepto, con la ayuda de lo que hemos visto en el post anterior, <strong>los prototypes</strong>, para resumir un poco lo que hacemos es llamar al <strong>\"padre\"</strong> del cual queramos heredar(como si llamaramos a super en otros lenguajes) y le decimos que cambie su <strong>this</strong>(su contexto o instancia) por el nuestro junto con los parámetros que necesitemos.<br>\nCreo que en este caso es mejor verlo con un ejemplo, para ello vamos a crearnos un constructor y luego extenderemos de él.</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">function Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n     }\n  }\n</code></pre></div>\n<p>Este sería nuestro constructor, vamos a crear un elemento para ver que funciona</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">var mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n</code></pre></div>\n<p>Si ejecutamos esto(recordar con <strong>node nombreFicheroJS</strong>), veríamos que funciona<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-12-at-21.43.50.png\" alt=\"Constructor example\"></p>\n<p>Ahora vamos a crear otra función que herede de la primera, para ello nos valemos del método que tienen todas las funciones <strong>call</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">function Hero(alias){\n      Superhero.call(this, alias);\n  }\n</code></pre></div>\n<p>Como véis le pasamos el this de nuestro método y le pasamos el parámetro de la función superhero.<br>\nPor último añadimos a los prototipos de la función Hero, un nuevo <strong>Superhero</strong> para que realmente lo herede, y tras esto ya podriamos usar <strong>Hero</strong> con las propiedades de <strong>Superhero</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Hero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n</code></pre></div>\n<p>Nuestro <strong>rorschach</strong> puede usar los mismos métodos que <strong>Superhero</strong>, y para comprobarlo he vuesto unos cuantos logs que nos mostrarían cuales son los prototypes que tiene, y si es una instancia de cada uno de nuestros constructores<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-08.42.43.png\" alt=\"Herence check logs\"></p>\n<h2 id=\"herenciamltiple\">Herencia Múltiple</h2>\n<p>Podemos simular herencia múltiple aprovechando lo que acabamos de hacer y usando el método <strong>assign</strong>, este método lo que hace es copiar las propiedades de un objeto en otro, con lo que el objeto destino puede usarlas como si fueran suyas. Veámoslo con un ejemplo continuando con lo anterior.</p>\n<p>Lo primero vamos a crear otro constructor, en este caso <strong>SuperPowers()</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">function SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n</code></pre></div>\n<p>Y a continuación lo que haremos será <strong>\"asignarle\"</strong> estas propiedades a nuestro <strong>rorschach</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">Object.assign(rorschach, new SuperPowers());\n</code></pre></div>\n<p>Simplemente tenemos que usar el método <strong>assign</strong> de <strong>Object</strong> y como parámetros le pasamos la instancia del objeto destino y una instancia del objeto origen, en este caso con <strong>new SuperPowers()</strong></p>\n<p>Ahora simplemente podemos comprobar que realmente nuestro <strong>rorschach</strong> tiene las propiedades de <strong>SuperPowers</strong></p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">rorschach.superStrength();\nrorschach.superSpeed();\n</code></pre></div>\n<p>Además le añadiremos lo mismo que antes para comprobar si es una instancia de <strong>SuperPowers</strong>, quedando así todo el código</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">//Herencia\n\nfunction Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n    }\n}\n  \nvar mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n  \n  //Herencia de superhero\nfunction Hero(alias){\n    Superhero.call(this, alias);\n}\n  \nHero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n\n//Herencia Múltiple\nfunction SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n\nObject.assign(rorschach, new SuperPowers());\n\n\nrorschach.superStrength();\nrorschach.superSpeed();\n\nconsole.log('Es una instancia de SuperPowers? ' + (rorschach instanceof SuperPowers));\n</code></pre></div>\n<p>Lo que nos daría este resultado<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/09/Screen-Shot-2017-09-13-at-09.00.25.png\" alt=\"Multiple Herence\"></p>\n<p>Anda!!! Hay algo distinto verdad?? Nos dice que no es una instancia de <strong>SuperPowers</strong>...pero ¿por qué?.. Bueno en este caso es bastante simple, realmente lo que hacemos es una copia de propiedades de un elemento a otro, es decir, sería como si el constructor de nuestro <strong>rorschach</strong> hubiera tenido las mismas propiedades que <strong>SuperPowers</strong>.</p>\n<p>Y hasta aquí el repaso de algunos elementos de JavasScript, a partir del próximo post ya empezaremos a ver <strong>NodeJS</strong> (Por fiiiiiin!!!! ;) )</p>\n<p>Nos vemoooossssss, un abrazooooooorrrr</p>\n<!--kg-card-end: markdown-->","htmlAst":{"type":"root","children":[{"type":"comment","value":"kg-card-begin: markdown"},{"type":"element","tagName":"h2","properties":{"id":"herencia"},"children":[{"type":"text","value":"Herencia"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"En JavaScript también existe este concepto, con la ayuda de lo que hemos visto en el post anterior, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"los prototypes"}]},{"type":"text","value":", para resumir un poco lo que hacemos es llamar al "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"padre\""}]},{"type":"text","value":" del cual queramos heredar(como si llamaramos a super en otros lenguajes) y le decimos que cambie su "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this"}]},{"type":"text","value":"(su contexto o instancia) por el nuestro junto con los parámetros que necesitemos."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nCreo que en este caso es mejor verlo con un ejemplo, para ello vamos a crearnos un constructor y luego extenderemos de él."}]},{"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":"function Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n     }\n  }\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Este sería nuestro constructor, vamos a crear un elemento para ver que funciona"}]},{"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":"var mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Si ejecutamos esto(recordar con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"node nombreFicheroJS"}]},{"type":"text","value":"), veríamos que funciona"},{"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-12-at-21.43.50.png","alt":"Constructor example"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora vamos a crear otra función que herede de la primera, para ello nos valemos del método que tienen todas las funciones "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"call"}]}]},{"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":"function Hero(alias){\n      Superhero.call(this, alias);\n  }\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como véis le pasamos el this de nuestro método y le pasamos el parámetro de la función superhero."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPor último añadimos a los prototipos de la función Hero, un nuevo "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Superhero"}]},{"type":"text","value":" para que realmente lo herede, y tras esto ya podriamos usar "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Hero"}]},{"type":"text","value":" con las propiedades de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Superhero"}]}]},{"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":"Hero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rorschach"}]},{"type":"text","value":" puede usar los mismos métodos que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Superhero"}]},{"type":"text","value":", y para comprobarlo he vuesto unos cuantos logs que nos mostrarían cuales son los prototypes que tiene, y si es una instancia de cada uno de nuestros constructores"},{"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-13-at-08.42.43.png","alt":"Herence check logs"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"h2","properties":{"id":"herenciamltiple"},"children":[{"type":"text","value":"Herencia Múltiple"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Podemos simular herencia múltiple aprovechando lo que acabamos de hacer y usando el método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"assign"}]},{"type":"text","value":", este método lo que hace es copiar las propiedades de un objeto en otro, con lo que el objeto destino puede usarlas como si fueran suyas. Veámoslo con un ejemplo continuando con lo anterior."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo primero vamos a crear otro constructor, en este caso "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SuperPowers()"}]}]},{"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":"function SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y a continuación lo que haremos será "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"\"asignarle\""}]},{"type":"text","value":" estas propiedades a nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rorschach"}]}]},{"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":"Object.assign(rorschach, new SuperPowers());\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Simplemente tenemos que usar el método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"assign"}]},{"type":"text","value":" de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Object"}]},{"type":"text","value":" y como parámetros le pasamos la instancia del objeto destino y una instancia del objeto origen, en este caso con "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"new SuperPowers()"}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora simplemente podemos comprobar que realmente nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rorschach"}]},{"type":"text","value":" tiene las propiedades de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SuperPowers"}]}]},{"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":"rorschach.superStrength();\nrorschach.superSpeed();\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Además le añadiremos lo mismo que antes para comprobar si es una instancia de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SuperPowers"}]},{"type":"text","value":", quedando así todo el código"}]},{"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":"//Herencia\n\nfunction Superhero(alias) {\n    this.alias = alias;\n    this.getInfo = function () {\n       console.log('Nuestro héroe se llama ' + this.alias);\n    }\n}\n  \nvar mr_manhattan = new Superhero('Dr. Manhattan');\n \nmr_manhattan.getInfo();\n  \n  //Herencia de superhero\nfunction Hero(alias){\n    Superhero.call(this, alias);\n}\n  \nHero.prototype = new Superhero('Walter Joseph Kovacs');\n  \nvar rorschach = new Hero('Rorschach');\n  \nrorschach.getInfo();\n\nconsole.log(Object.getPrototypeOf(rorschach))\nconsole.log('Es una instancia de Hero? ' + (rorschach instanceof Hero))\nconsole.log('Es una instancia de SuperHero? ' + (rorschach instanceof Superhero))\n\n//Herencia Múltiple\nfunction SuperPowers(){\n    this.superStrength = function(){\n        console.log( this.alias + ' tiene super fuerza')\n    }\n    this.superSpeed = function(){\n        console.log( this.alias + ' tiene super velocidad')\n    }\n}\n\nObject.assign(rorschach, new SuperPowers());\n\n\nrorschach.superStrength();\nrorschach.superSpeed();\n\nconsole.log('Es una instancia de SuperPowers? ' + (rorschach instanceof SuperPowers));\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo que nos daría este resultado"},{"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-13-at-09.00.25.png","alt":"Multiple Herence"},"children":[]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Anda!!! Hay algo distinto verdad?? Nos dice que no es una instancia de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SuperPowers"}]},{"type":"text","value":"...pero ¿por qué?.. Bueno en este caso es bastante simple, realmente lo que hacemos es una copia de propiedades de un elemento a otro, es decir, sería como si el constructor de nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"rorschach"}]},{"type":"text","value":" hubiera tenido las mismas propiedades que "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SuperPowers"}]},{"type":"text","value":"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y hasta aquí el repaso de algunos elementos de JavasScript, a partir del próximo post ya empezaremos a ver "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"NodeJS"}]},{"type":"text","value":" (Por fiiiiiin!!!! ;) )"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Nos vemoooossssss, un abrazooooooorrrr"}]},{"type":"text","value":"\n"},{"type":"comment","value":"kg-card-end: markdown"}],"data":{"quirksMode":false}},"tableOfContents":[{"id":"herencia","heading":"Herencia"},{"id":"herenciamltiple","heading":"Herencia Múltiple"}]},"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"}}}},"allGhostPost":{"edges":[{"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"}}}}},{"node":{"id":"Ghost__Post__5a338158333e0f134c248f1c","title":"React Superhero (II): Cambios entre componentes","slug":"react-js-ii-cambios-entre-componentes","featured":false,"feature_image":"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Captain-Atom.jpg","excerpt":"En este post veremos como pasar datos o más bien como comunicarnos entre\ncomponentes. Para ello partiendo de lo que tenemos del post anterior:\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    <!--P","custom_excerpt":null,"visibility":"public","created_at_pretty":"31 Jul 2017","published_at_pretty":"21 Aug 2017","updated_at_pretty":"11 Oct 2017","created_at":"2017-07-31T09:23:35.000+02:00","published_at":"2017-08-21T10:01:00.000+02:00","updated_at":"2017-10-11T13:48:30.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":"En este post veremos como pasar datos o más bien como comunicarnos entre\ncomponentes. Para ello partiendo de lo que tenemos del post anterior:\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          constructor(){\n            super();\n          }\n\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          constructor(){\n            super();\n            this.state = {\n              nombre: \"Your Super Name\"\n            }\n          }\n          getName(input){\n            this.setState({nombre: input.target.value});\n          }\n\n\n          render(){\n            return (\n              <div>\n                <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n                <input onChange={this.getName.bind(this)}></input>\n                <h4> { this.state.nombre } </h4>\n              </div>\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\nVamos a crear otro componente que usaremos para hacer que un numero aumente, es\ndecir vamos a sumarle uno, es un ejemplo muy simple pero suficiente para ver los\nconceptos que queremos, por el momento lo primero sera crear el componente con\nun botón y un elemento para mostrar el nùmero\n\nclass PlusOneNumber extends React.Component {\n    render(){\n            return (\n              <div>\n                 <p>0</p>\n                 <button>AumentarNumero</button>\n              </div>\n              )\n          }\n}\n\n\nBien y lo ponemos en nuestro componente principal para que lo muestre, a\ncontinuación del que era MiSegundoComponente:\n\nrender(){\n     return (\n       <div>\n         <h2>Hello with React</h2>\n         <MiSegundoComponente/>\n         <PlusOneNumber/>\n       </div>\n       );\n  }\n\n\nBien ahora mismo ya se tendría que mostrar, pero esto como tal no hace nada ni\nel botón ni el 0, vamos a empezar a darle \"vida\" a nuestro componente en\nconjunto con el componente principal.\nLo primero que hacemos es crear un constructor con una propiedad en el\ncomponente principal, algo así:\n\nclass SuperComponente extends React.Component{\n    constructor(){\n         super();\n            this.state = {\n              number: 0\n            }\n          }\n\n     render(){\n       return (\n         <div>\n           <h2>Hello with React</h2>\n           <MiSegundoComponente/>\n           <PlusOneNumber/>\n         </div>\n        );\n      }\n}\n\n\nLo que tenemos dentro de this.state será lo que iremos cambiando cada vez que\npulsemos el botón, es decir la idea es que el componente PlusOneNumber tome el\nvalor de número desde el componente principal y le sume uno. ¿Pero como\nempezamos con esto?\n\nLo primero es pasar el valor desde el componente principal a nuestro componente\nque realiza la suma, para ello es tan simple como \"pasarselo como una propiedad\nal componente\":\n\n<h2>Hello with React</h2>\n<MiSegundoComponente/>\n<PlusOneNumber number={this.state.number}/>\n\n\nCon esto lo mandamos al componente, y para acceder a este número desde nuestro\ncomponente auxiliar:\n\nclass PlusOneNumber extends React.Component {\n    render(){\n      return (\n        <div>\n         <p>{this.props.number}</p>\n         <button>AumentarNumero</button>\n        </div>\n      )\n    }\n}\n\n\nComo veis es suficiente con acceder a las propiedades de this en lugar de a su\nestado. Si ahora cargáis de nuevo la página veréis que todo sigue \"igual\", o\ncasi, la diferencia es que ya está cogiendo el número desde el componente\nprincipal.\n\nSiguiente paso, Aumentar el número, para ello lanzo una pregunta, ¿creéis que\nahora que tenemos acceso podemos modificar esa propiedad en nuestro componente?\nY hablo directamente la propiedad no de hacer un +1 en conjunto del \nthis.props.number, ni tampoco de asignarla a una propiedad de este componente y\ntrabajar desde aquí, me refiero a directamente modificar esa propiedad.....Pues\nNo, y ¿por qué?, pues porque realmente el dueño o propietario de ese objeto es\nel componente principal no nuestro componente que realiza la suma. Es como si en \nPOO tuviéramos una variable de clase que para cambiarla necesitamos usar un\nmétodo setter(más o menos) y con esta pista veamos que tenemos que hacer para\ncrear nuestro \"setter\".\n\nPrimero creamos una función en nuestro componente principal que realizará la\nsuma:\n\nplusOne(){\n    this.setState({number: this.state.number + 1 })\n}\n\n\nComo hemos comentado anteriormente usamos setState para cambiar valores y\nsimplemente le sumamos uno.\nA continuación queremos que el button haga algo, por lo que tendríamos que\nindicarle un onClick en algún sitio como suele ser en asuntos relacionados con\nJS y queremos que ese onClick de alguna manera use el método plusOne(), pero\n¿como hacemos que nuestro componente auxiliar pueda usar ese método? Pues de la\nmisma manera que hemos conseguido que reciba la propiedad número, lo único que\nen lugar de pasarle una propiedad o un estado le pasamos una función:\n\n <MiSegundoComponente/>\n<PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/>\n\n\nAhora la propiedad funAumentar contiene la función o método plusOne y recordemos\nque es necesario \"enlazar\"(bind) el contexto en el que trabajamos(el this vamos)\npara que todos tengan la información que necesitan, y por ultimo solo\nnecesitamos decirle al button lo que tiene que hacer cuando lo pulsen en su\npropiedad onClick:\n\n<p>{this.props.number}</p>\n<button onClick={this.props.funAumentar}>AumentarNumero</button>\n\n\nY ya lo tenemos si ahora recargamos nuestra página tendremos lo siguiente, con\nun número que crece cada vez que lo pulsamos:\n\nY como podréis comprobar el componente del post anterior también funciona.\nPara asentar un poco y confirmar que un componente realmente se comunica con\notro, vamos a añadir lo siguiente en el componente principal:\n\n <h2>Hello with React</h2>\n <MiSegundoComponente/>\n <PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/>\n <h4>{this.state.number}</h4>\n\n\nComo veis he puesto directamente la propiedad number que tiene nuestro \nSuperCompomente, para que veaís que realmente si se esta modificando el número\nde este componente:\n\nBueno como veis es relativamente sencillo compartir información entre\ncomponentes, en los próximos post ya empezaremos a ponernos más serios.\nNos vemooosssss","html":"<!--kg-card-begin: markdown--><p>En este post veremos como pasar datos o más bien como comunicarnos entre componentes. Para ello partiendo de lo que tenemos del post anterior:</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          constructor(){\n            super();\n          }\n\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          constructor(){\n            super();\n            this.state = {\n              nombre: &quot;Your Super Name&quot;\n            }\n          }\n          getName(input){\n            this.setState({nombre: input.target.value});\n          }\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;input onChange={this.getName.bind(this)}&gt;&lt;/input&gt;\n                &lt;h4&gt; { this.state.nombre } &lt;/h4&gt;\n              &lt;/div&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>Vamos a crear otro componente que usaremos para hacer que un numero aumente, es decir vamos a sumarle uno, es un ejemplo muy simple pero suficiente para ver los conceptos que queremos, por el momento lo primero sera crear el componente con un botón y un elemento para mostrar el nùmero</p>\n<pre><code>class PlusOneNumber extends React.Component {\n    render(){\n            return (\n              &lt;div&gt;\n                 &lt;p&gt;0&lt;/p&gt;\n                 &lt;button&gt;AumentarNumero&lt;/button&gt;\n              &lt;/div&gt;\n              )\n          }\n}\n</code></pre>\n<p>Bien y lo ponemos en nuestro componente principal para que lo muestre, a continuación del que era <strong>MiSegundoComponente</strong>:</p>\n<pre><code>render(){\n     return (\n       &lt;div&gt;\n         &lt;h2&gt;Hello with React&lt;/h2&gt;\n         &lt;MiSegundoComponente/&gt;\n         &lt;PlusOneNumber/&gt;\n       &lt;/div&gt;\n       );\n  }\n</code></pre>\n<p>Bien ahora mismo ya se tendría que mostrar, pero esto como tal no hace nada ni el botón ni el 0, vamos a empezar a darle &quot;vida&quot; a nuestro componente en conjunto con el componente principal.<br>\nLo primero que hacemos es crear un constructor con una propiedad en el componente principal, algo así:</p>\n<pre><code>class SuperComponente extends React.Component{\n    constructor(){\n         super();\n            this.state = {\n              number: 0\n            }\n          }\n\n     render(){\n       return (\n         &lt;div&gt;\n           &lt;h2&gt;Hello with React&lt;/h2&gt;\n           &lt;MiSegundoComponente/&gt;\n           &lt;PlusOneNumber/&gt;\n         &lt;/div&gt;\n        );\n      }\n}\n</code></pre>\n<p>Lo que tenemos dentro de <strong>this.state</strong> será lo que iremos cambiando cada vez que pulsemos el botón, es decir la idea es que el componente <strong>PlusOneNumber</strong> tome el valor de número desde el componente principal y le sume uno. ¿Pero como empezamos con esto?</p>\n<p>Lo primero es pasar el valor desde el componente principal a nuestro componente que realiza la suma, para ello es tan simple como &quot;pasarselo como una propiedad al componente&quot;:</p>\n<pre><code>&lt;h2&gt;Hello with React&lt;/h2&gt;\n&lt;MiSegundoComponente/&gt;\n&lt;PlusOneNumber number={this.state.number}/&gt;\n</code></pre>\n<p>Con esto lo mandamos al componente, y para acceder a este número desde nuestro componente auxiliar:</p>\n<pre><code>class PlusOneNumber extends React.Component {\n    render(){\n      return (\n        &lt;div&gt;\n         &lt;p&gt;{this.props.number}&lt;/p&gt;\n         &lt;button&gt;AumentarNumero&lt;/button&gt;\n        &lt;/div&gt;\n      )\n    }\n}\n</code></pre>\n<p>Como veis es suficiente con acceder a las propiedades de this en lugar de a su estado. Si ahora cargáis de nuevo la página veréis que todo sigue &quot;igual&quot;, o casi, la diferencia es que ya está cogiendo el número desde el componente principal.</p>\n<p>Siguiente paso, <strong>Aumentar el número</strong>, para ello lanzo una pregunta, ¿creéis que ahora que tenemos acceso podemos modificar esa propiedad en nuestro componente? Y hablo directamente la propiedad no de hacer un +1 en conjunto del <strong>this.props.number</strong>, ni tampoco de asignarla a una propiedad de este componente y trabajar desde aquí, me refiero a directamente modificar esa propiedad.....<strong>Pues No</strong>, y ¿por qué?, pues porque realmente el dueño o propietario de ese objeto es el componente principal no nuestro componente que realiza la suma. Es como si en <strong>POO</strong> tuviéramos una variable de clase que para cambiarla necesitamos usar un método setter(más o menos) y con esta pista veamos que tenemos que hacer para crear nuestro &quot;setter&quot;.</p>\n<p>Primero creamos una función en nuestro componente principal que realizará la suma:</p>\n<pre><code>plusOne(){\n    this.setState({number: this.state.number + 1 })\n}\n</code></pre>\n<p>Como hemos comentado anteriormente usamos <strong>setState</strong> para cambiar valores y simplemente le sumamos uno.<br>\nA continuación queremos que el button haga algo, por lo que tendríamos que indicarle un <strong>onClick</strong> en algún sitio como suele ser en asuntos relacionados con JS y queremos que ese onClick de alguna manera use el método <strong>plusOne()</strong>, pero ¿como hacemos que nuestro componente auxiliar pueda usar ese método? Pues de la misma manera que hemos conseguido que reciba la propiedad número, lo único que en lugar de pasarle una propiedad o un estado le pasamos una función:</p>\n<pre><code> &lt;MiSegundoComponente/&gt;\n&lt;PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/&gt;\n</code></pre>\n<p>Ahora la propiedad <strong>funAumentar</strong> contiene la función o método <strong>plusOne</strong> y recordemos que es necesario &quot;enlazar&quot;(bind) el contexto en el que trabajamos(el this vamos) para que todos tengan la información que necesitan, y por ultimo solo necesitamos decirle al button lo que tiene que hacer cuando lo pulsen en su propiedad <strong>onClick</strong>:</p>\n<pre><code>&lt;p&gt;{this.props.number}&lt;/p&gt;\n&lt;button onClick={this.props.funAumentar}&gt;AumentarNumero&lt;/button&gt;\n</code></pre>\n<p>Y ya lo tenemos si ahora recargamos nuestra página tendremos lo siguiente, con un número que crece cada vez que lo pulsamos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-22.03.14.png\" alt=\"PlusOne Works!!\"><br>\nY como podréis comprobar el componente del post anterior también funciona.<br>\nPara asentar un poco y confirmar que un componente realmente se comunica con otro, vamos a añadir lo siguiente en el componente principal:</p>\n<pre><code> &lt;h2&gt;Hello with React&lt;/h2&gt;\n &lt;MiSegundoComponente/&gt;\n &lt;PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/&gt;\n &lt;h4&gt;{this.state.number}&lt;/h4&gt;\n</code></pre>\n<p>Como veis he puesto directamente la propiedad <strong>number</strong> que tiene nuestro <strong>SuperCompomente</strong>, para que veaís que realmente si se esta modificando el número de este componente:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-22.16.33.png\" alt=\"Components communication\"><br>\nBueno como veis es relativamente sencillo compartir información entre componentes, en los próximos post ya empezaremos a ponernos más serios.<br>\nNos vemooosssss</p>\n<!--kg-card-end: markdown-->","url":"https://jlgarcia.fulldev.ninja/react-js-ii-cambios-entre-componentes/","canonical_url":null,"uuid":"f58eca50-4b6f-46a1-99f8-f49fd043966e","codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"41","reading_time":5,"send_email_when_published":false,"email_subject":null,"childHtmlRehype":{"html":"<!--kg-card-begin: markdown--><p>En este post veremos como pasar datos o más bien como comunicarnos entre componentes. Para ello partiendo de lo que tenemos del post anterior:</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          constructor(){\n            super();\n          }\n\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          constructor(){\n            super();\n            this.state = {\n              nombre: \"Your Super Name\"\n            }\n          }\n          getName(input){\n            this.setState({nombre: input.target.value});\n          }\n\n\n          render(){\n            return (\n              &#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.state.nombre } &#x3C;/h4>\n              &#x3C;/div>\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>Vamos a crear otro componente que usaremos para hacer que un numero aumente, es decir vamos a sumarle uno, es un ejemplo muy simple pero suficiente para ver los conceptos que queremos, por el momento lo primero sera crear el componente con un botón y un elemento para mostrar el nùmero</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class PlusOneNumber extends React.Component {\n    render(){\n            return (\n              &#x3C;div>\n                 &#x3C;p>0&#x3C;/p>\n                 &#x3C;button>AumentarNumero&#x3C;/button>\n              &#x3C;/div>\n              )\n          }\n}\n</code></pre></div>\n<p>Bien y lo ponemos en nuestro componente principal para que lo muestre, a continuación del que era <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\">render(){\n     return (\n       &#x3C;div>\n         &#x3C;h2>Hello with React&#x3C;/h2>\n         &#x3C;MiSegundoComponente/>\n         &#x3C;PlusOneNumber/>\n       &#x3C;/div>\n       );\n  }\n</code></pre></div>\n<p>Bien ahora mismo ya se tendría que mostrar, pero esto como tal no hace nada ni el botón ni el 0, vamos a empezar a darle \"vida\" a nuestro componente en conjunto con el componente principal.<br>\nLo primero que hacemos es crear un constructor con una propiedad en el componente principal, algo así:</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    constructor(){\n         super();\n            this.state = {\n              number: 0\n            }\n          }\n\n     render(){\n       return (\n         &#x3C;div>\n           &#x3C;h2>Hello with React&#x3C;/h2>\n           &#x3C;MiSegundoComponente/>\n           &#x3C;PlusOneNumber/>\n         &#x3C;/div>\n        );\n      }\n}\n</code></pre></div>\n<p>Lo que tenemos dentro de <strong>this.state</strong> será lo que iremos cambiando cada vez que pulsemos el botón, es decir la idea es que el componente <strong>PlusOneNumber</strong> tome el valor de número desde el componente principal y le sume uno. ¿Pero como empezamos con esto?</p>\n<p>Lo primero es pasar el valor desde el componente principal a nuestro componente que realiza la suma, para ello es tan simple como \"pasarselo como una propiedad al componente\":</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">&#x3C;h2>Hello with React&#x3C;/h2>\n&#x3C;MiSegundoComponente/>\n&#x3C;PlusOneNumber number={this.state.number}/>\n</code></pre></div>\n<p>Con esto lo mandamos al componente, y para acceder a este número desde nuestro componente auxiliar:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">class PlusOneNumber extends React.Component {\n    render(){\n      return (\n        &#x3C;div>\n         &#x3C;p>{this.props.number}&#x3C;/p>\n         &#x3C;button>AumentarNumero&#x3C;/button>\n        &#x3C;/div>\n      )\n    }\n}\n</code></pre></div>\n<p>Como veis es suficiente con acceder a las propiedades de this en lugar de a su estado. Si ahora cargáis de nuevo la página veréis que todo sigue \"igual\", o casi, la diferencia es que ya está cogiendo el número desde el componente principal.</p>\n<p>Siguiente paso, <strong>Aumentar el número</strong>, para ello lanzo una pregunta, ¿creéis que ahora que tenemos acceso podemos modificar esa propiedad en nuestro componente? Y hablo directamente la propiedad no de hacer un +1 en conjunto del <strong>this.props.number</strong>, ni tampoco de asignarla a una propiedad de este componente y trabajar desde aquí, me refiero a directamente modificar esa propiedad.....<strong>Pues No</strong>, y ¿por qué?, pues porque realmente el dueño o propietario de ese objeto es el componente principal no nuestro componente que realiza la suma. Es como si en <strong>POO</strong> tuviéramos una variable de clase que para cambiarla necesitamos usar un método setter(más o menos) y con esta pista veamos que tenemos que hacer para crear nuestro \"setter\".</p>\n<p>Primero creamos una función en nuestro componente principal que realizará la suma:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">plusOne(){\n    this.setState({number: this.state.number + 1 })\n}\n</code></pre></div>\n<p>Como hemos comentado anteriormente usamos <strong>setState</strong> para cambiar valores y simplemente le sumamos uno.<br>\nA continuación queremos que el button haga algo, por lo que tendríamos que indicarle un <strong>onClick</strong> en algún sitio como suele ser en asuntos relacionados con JS y queremos que ese onClick de alguna manera use el método <strong>plusOne()</strong>, pero ¿como hacemos que nuestro componente auxiliar pueda usar ese método? Pues de la misma manera que hemos conseguido que reciba la propiedad número, lo único que en lugar de pasarle una propiedad o un estado le pasamos una función:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> &#x3C;MiSegundoComponente/>\n&#x3C;PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/>\n</code></pre></div>\n<p>Ahora la propiedad <strong>funAumentar</strong> contiene la función o método <strong>plusOne</strong> y recordemos que es necesario \"enlazar\"(bind) el contexto en el que trabajamos(el this vamos) para que todos tengan la información que necesitan, y por ultimo solo necesitamos decirle al button lo que tiene que hacer cuando lo pulsen en su propiedad <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;p>{this.props.number}&#x3C;/p>\n&#x3C;button onClick={this.props.funAumentar}>AumentarNumero&#x3C;/button>\n</code></pre></div>\n<p>Y ya lo tenemos si ahora recargamos nuestra página tendremos lo siguiente, con un número que crece cada vez que lo pulsamos:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-22.03.14.png\" alt=\"PlusOne Works!!\"><br>\nY como podréis comprobar el componente del post anterior también funciona.<br>\nPara asentar un poco y confirmar que un componente realmente se comunica con otro, vamos a añadir lo siguiente en el componente principal:</p>\n<div class=\"kg-card kg-code-card gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\"> &#x3C;h2>Hello with React&#x3C;/h2>\n &#x3C;MiSegundoComponente/>\n &#x3C;PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/>\n &#x3C;h4>{this.state.number}&#x3C;/h4>\n</code></pre></div>\n<p>Como veis he puesto directamente la propiedad <strong>number</strong> que tiene nuestro <strong>SuperCompomente</strong>, para que veaís que realmente si se esta modificando el número de este componente:<br>\n<img src=\"https://jlgarcia.fulldev.ninja/assets/images/2017/08/Screen-Shot-2017-08-02-at-22.16.33.png\" alt=\"Components communication\"><br>\nBueno como veis es relativamente sencillo compartir información entre componentes, en los próximos post ya empezaremos a ponernos más serios.<br>\nNos vemooosssss</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 veremos como pasar datos o más bien como comunicarnos entre componentes. Para ello partiendo de lo que tenemos del post anterior:"}]},{"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          constructor(){\n            super();\n          }\n\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          constructor(){\n            super();\n            this.state = {\n              nombre: \"Your Super Name\"\n            }\n          }\n          getName(input){\n            this.setState({nombre: input.target.value});\n          }\n\n\n          render(){\n            return (\n              <div>\n                <h2>REACT is in the HOUSE...YEAH!!!!</h2>\n                <input onChange={this.getName.bind(this)}></input>\n                <h4> { this.state.nombre } </h4>\n              </div>\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":"Vamos a crear otro componente que usaremos para hacer que un numero aumente, es decir vamos a sumarle uno, es un ejemplo muy simple pero suficiente para ver los conceptos que queremos, por el momento lo primero sera crear el componente con un botón y un elemento para mostrar el nùmero"}]},{"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 PlusOneNumber extends React.Component {\n    render(){\n            return (\n              <div>\n                 <p>0</p>\n                 <button>AumentarNumero</button>\n              </div>\n              )\n          }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien y lo ponemos en nuestro componente principal para que lo muestre, a continuación del que era "},{"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":"render(){\n     return (\n       <div>\n         <h2>Hello with React</h2>\n         <MiSegundoComponente/>\n         <PlusOneNumber/>\n       </div>\n       );\n  }\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Bien ahora mismo ya se tendría que mostrar, pero esto como tal no hace nada ni el botón ni el 0, vamos a empezar a darle \"vida\" a nuestro componente en conjunto con el componente principal."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nLo primero que hacemos es crear un constructor con una propiedad en el componente principal, algo 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":"class SuperComponente extends React.Component{\n    constructor(){\n         super();\n            this.state = {\n              number: 0\n            }\n          }\n\n     render(){\n       return (\n         <div>\n           <h2>Hello with React</h2>\n           <MiSegundoComponente/>\n           <PlusOneNumber/>\n         </div>\n        );\n      }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo que tenemos dentro de "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this.state"}]},{"type":"text","value":" será lo que iremos cambiando cada vez que pulsemos el botón, es decir la idea es que el componente "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"PlusOneNumber"}]},{"type":"text","value":" tome el valor de número desde el componente principal y le sume uno. ¿Pero como empezamos con esto?"}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Lo primero es pasar el valor desde el componente principal a nuestro componente que realiza la suma, para ello es tan simple como \"pasarselo como una propiedad al componente\":"}]},{"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>Hello with React</h2>\n<MiSegundoComponente/>\n<PlusOneNumber number={this.state.number}/>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Con esto lo mandamos al componente, y para acceder a este número desde nuestro componente auxiliar:"}]},{"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 PlusOneNumber extends React.Component {\n    render(){\n      return (\n        <div>\n         <p>{this.props.number}</p>\n         <button>AumentarNumero</button>\n        </div>\n      )\n    }\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como veis es suficiente con acceder a las propiedades de this en lugar de a su estado. Si ahora cargáis de nuevo la página veréis que todo sigue \"igual\", o casi, la diferencia es que ya está cogiendo el número desde el componente principal."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Siguiente paso, "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Aumentar el número"}]},{"type":"text","value":", para ello lanzo una pregunta, ¿creéis que ahora que tenemos acceso podemos modificar esa propiedad en nuestro componente? Y hablo directamente la propiedad no de hacer un +1 en conjunto del "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"this.props.number"}]},{"type":"text","value":", ni tampoco de asignarla a una propiedad de este componente y trabajar desde aquí, me refiero a directamente modificar esa propiedad....."},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"Pues No"}]},{"type":"text","value":", y ¿por qué?, pues porque realmente el dueño o propietario de ese objeto es el componente principal no nuestro componente que realiza la suma. Es como si en "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"POO"}]},{"type":"text","value":" tuviéramos una variable de clase que para cambiarla necesitamos usar un método setter(más o menos) y con esta pista veamos que tenemos que hacer para crear nuestro \"setter\"."}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Primero creamos una función en nuestro componente principal que realizará la suma:"}]},{"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":"plusOne(){\n    this.setState({number: this.state.number + 1 })\n}\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como hemos comentado anteriormente usamos "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"setState"}]},{"type":"text","value":" para cambiar valores y simplemente le sumamos uno."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nA continuación queremos que el button haga algo, por lo que tendríamos que indicarle un "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]},{"type":"text","value":" en algún sitio como suele ser en asuntos relacionados con JS y queremos que ese onClick de alguna manera use el método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"plusOne()"}]},{"type":"text","value":", pero ¿como hacemos que nuestro componente auxiliar pueda usar ese método? Pues de la misma manera que hemos conseguido que reciba la propiedad número, lo único que en lugar de pasarle una propiedad o un estado le pasamos una funció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":" <MiSegundoComponente/>\n<PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Ahora la propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"funAumentar"}]},{"type":"text","value":" contiene la función o método "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"plusOne"}]},{"type":"text","value":" y recordemos que es necesario \"enlazar\"(bind) el contexto en el que trabajamos(el this vamos) para que todos tengan la información que necesitan, y por ultimo solo necesitamos decirle al button lo que tiene que hacer cuando lo pulsen en su propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"onClick"}]},{"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":"<p>{this.props.number}</p>\n<button onClick={this.props.funAumentar}>AumentarNumero</button>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Y ya lo tenemos si ahora recargamos nuestra página tendremos lo siguiente, con un número que crece cada vez que lo pulsamos:"},{"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-22.03.14.png","alt":"PlusOne Works!!"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nY como podréis comprobar el componente del post anterior también funciona."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nPara asentar un poco y confirmar que un componente realmente se comunica con otro, vamos a añadir lo siguiente en el componente principal:"}]},{"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>Hello with React</h2>\n <MiSegundoComponente/>\n <PlusOneNumber number={this.state.number} funAumentar={this.plusOne.bind(this)}/>\n <h4>{this.state.number}</h4>\n"}]}]}]},{"type":"text","value":"\n"},{"type":"element","tagName":"p","properties":{},"children":[{"type":"text","value":"Como veis he puesto directamente la propiedad "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"number"}]},{"type":"text","value":" que tiene nuestro "},{"type":"element","tagName":"strong","properties":{},"children":[{"type":"text","value":"SuperCompomente"}]},{"type":"text","value":", para que veaís que realmente si se esta modificando el número de este componente:"},{"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-22.16.33.png","alt":"Components communication"},"children":[]},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nBueno como veis es relativamente sencillo compartir información entre componentes, en los próximos post ya empezaremos a ponernos más serios."},{"type":"element","tagName":"br","properties":{},"children":[]},{"type":"text","value":"\nNos vemooosssss"}]},{"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-superhero-v-mobx","prev":"dont-stop-the-party-node-js-v","next":"dont-stop-the-party-node-js-iv-hablemos-un-poco-de-js-iii","tag":"reactjs","limit":3,"skip":0,"primaryTagCount":6,"collectionPaths":{}}},
    "staticQueryHashes": ["1272700106","1676991999","2138873178","2546165603","2681841279","2938721187","293880488","3052966952","4156497161"]}