<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>React &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/category/react/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Thu, 04 Oct 2018 17:00:24 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>React &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>React Props (Propiedades)</title>
		<link>https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/</link>
					<comments>https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 04 Oct 2018 17:00:24 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[react]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2340</guid>

					<description><![CDATA[Las propiedades son la forma que tiene React para pasar parámetros de un componente padre a los hijos.normal que un componente pase datos a los componentes hijos, sin embargo, no es lo único que se puede pasar, si no que existe ocasiones en las que los padres mandar funciones a los hijos, para que estos [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img fetchpriority="high" decoding="async" class="aligncenter wp-image-2347 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/react-props-1-1024x573.jpg" alt="React props (propiedades)" width="648" height="363" />Las propiedades son la forma que tiene React para pasar parámetros de un componente padre a los hijos.normal que un componente pase datos a los componentes hijos, sin embargo, no es lo único que se puede pasar, si no que existe ocasiones en las que los padres mandar funciones a los hijos, para que estos ejecuten operaciones de los padres, puede sonar extraño, pero ya veremos cómo funciona.<span id="more-2340"></span></p>
<p>Los props se envían a los componentes al momento de crearlos, y es tan fácil como mandar las propiedades como un atributo del <span class="lang:default decode:true crayon-inline ">&lt;tag&gt;</span>  del componente, por ejemplo, supongamos que tenemos un componente <span class="lang:default decode:true crayon-inline ">&lt;ItemList&gt;</span> , el cual necesita recibir los datos de un producto, dicho producto debe contener el nombre y un precio:</p>
<pre class="lang:js decode:true">&lt;ItemList product={item}/&gt;</pre>
<p>Mandar objetos es una forma simple y limpia de mandar propiedades, pero también lo podríamos hacer en varias propiedades, por ejemplo:</p>
<pre class="lang:js decode:true ">&lt;ItemList productName={product.name} productPrice={product.price}/&gt;</pre>
<p>La única diferencia entre estos dos métodos será la forma de recuperar las propiedades. Para recuperar una propiedad es necesario usar el prefijo, <span class="lang:default decode:true crayon-inline ">this.props</span> , por lo que en el primer ejemplo, el ítem se recupera como <span class="lang:default decode:true crayon-inline ">this.props.product</span> , y en el segundo ejemplo, sería <span class="lang:default decode:true crayon-inline ">this.props.productName</span>  para el nombre y <span class="lang:default decode:true crayon-inline ">this.props.productPrice</span>  para el precio.</p>
<p>Una limitación que tenemos para mandar props, es la de no utilizar un nombre de propiedad que coincida con los atributo de React, por ejemplo: <span class="lang:default decode:true crayon-inline ">onClick</span> , <span class="lang:default decode:true crayon-inline ">onChange</span> , <span class="lang:default decode:true crayon-inline ">className</span> , etc.</p>
<p>&nbsp;</p>
<blockquote><p><strong><em>Las propiedades son inmutables</em></strong><br />
La propiedad tiene la característica de ser inmutables, es decir, no debemos de modificarlas o actualizarlas, pues es considerada una mala práctica, solo las debemos utilizar de modo lectura.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Regresemos al ejemplo del formulario que vimos en la sección de <span style="color: #ff0000;">componentes con estado y sin estado<span style="color: #000000;"> del que hablamos en un artículo pasado</span></span>. En este ejemplo, creamos el componente <span class="lang:default decode:true crayon-inline ">App</span>  y sobre este montamos un formulario de registro de empleados. Ahora bien, ¿qué pasaría si quisiéramos que la acción de guardar la controlara el componente padre? La solución es simple, el componente padre tendría que enviar como props la función de guardar, para que el hijo la ejecute.</p>
<p>Lo primero será pasar el formulario a un componente externo, por lo cual, crearemos un componente llamado <span class="lang:default decode:true crayon-inline">EmployeeForm</span> , el cual se verá como a continuación:</p>
<pre class="lang:js mark:44 decode:true" title="EmployeeForm.js">import React from 'react'

class EmployeeForm extends React.Component{

  constructor(){
    super(...arguments)
    this.state = {
      firstName: '',
      lastName: '',
      age: ''
    }
  }

  componentDidMount(){
    this.refs.firstName.focus();
  }

  handleChanges(e){
    let newState = Object.assign(
      this.state, {[e.target.id]: e.target.value})
    this.setState(newState)
  }

  saveEmployee(e){
    this.props.save(this.state)
  }

  render(){
    return (
      &lt;form&gt;
        &lt;label htmlFor='firstName'&gt;Nombre&lt;/label&gt;
        &lt;input ref='firstName' id='firstName'
          type='text' value={this.state.firstName}
          onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt;
        &lt;label htmlFor='lastName'&gt;Apellido&lt;/label&gt;
        &lt;input id='lastName' type='text' value={this.state.lastName}
          onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt;
        &lt;label htmlFor='age'&gt;Edad&lt;/label&gt;
        &lt;input id='age' type='number' value={this.state.age}
          onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt;
        &lt;button onClick={this.saveEmployee.bind(this)}&gt;Guardar&lt;/button&gt;
      &lt;/form&gt;
    )
  }
}
export default EmployeeForm</pre>
<p>Este componente tiene dos cosas a resaltar, lo primero es que agregamos un botón (línea 44), el cual, al ser presionado, ejecutar la función <span class="lang:default decode:true crayon-inline">saveEmployee</span>  declarada en este mismo componente, lo segundo es la función <span class="lang:default decode:true crayon-inline">saveEmployee</span>  que declaramos en la línea 24, la cual ejecuta la función <span class="lang:default decode:true crayon-inline ">save</span>  enviada por el parent como prop.</p>
<p>Por otra parte, tenemos al componente <span class="lang:default decode:true crayon-inline ">App</span>  que será el padre del componente anterior:</p>
<pre class="lang:js decode:true" title="App.js">import React from 'react'
import { render } from 'react-dom'
import EmployeeForm from './EmployeeForm'

class App extends React.Component{
  
  save(employee){ 
    alert(JSON.stringify(employee))
  } 
		
  render(){
    return (
	  &lt;EmployeeForm save={ this.save.bind(this) }/&gt; 
	) 
  } 
} 
render(&lt;App/&gt;, document.getElementById('root'));</pre>
<p>Podemos ver que al momento de crear el componente <span class="lang:default decode:true crayon-inline ">EmployeeForm</span> , este le envía como una prop la función <span class="lang:default decode:true crayon-inline ">save</span> . De esta forma, cuando el componente <span class="lang:default decode:true crayon-inline ">EmployeeForm</span> , ejecute la propiedad, se lanzará una alerta con los datos capturados (línea 8).</p>
<p><img decoding="async" class="aligncenter size-full wp-image-2345" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/react-props.jpg" alt="" width="713" height="312" /></p>
<p>&nbsp;</p>
<p>Cuando es necesario &#8220;<em>bindear</em>&#8221; una función con una prop o queremos utilizar una función en un evento como <span class="lang:default decode:true crayon-inline ">onClick</span> , <span class="lang:default decode:true crayon-inline ">onChange</span> , etc. es necesario siempre empezar con <span class="lang:default decode:true crayon-inline ">this</span> , y finalizar con <span class="lang:default decode:true crayon-inline ">binding(this)</span>  como se ve a continuación <span class="lang:default decode:true crayon-inline">this.&lt;function&gt;.bind(this)</span> .</p>
<p>&nbsp;</p>
<p>Debido a que un componente padre puede enviar cualquier propiedad a sus componentes hijos, React proporciona un mecanismo para validar las propiedades que espera un determinado componente, validar su estructura, tipo de dato y definir un valor por default, para eso existen dos términos llamados PropTypes y DefaultProps, de los cuales estaremos hablando en otra ocasión.</p>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos visto, las propiedades son el único método que ofrece React para transmitir información de forma descendente, desde un componente padre hacia sus hijos, sin embargo, existe otras alternativas como <a href="https://es.redux.js.org/">Redux</a>, una librería que permite gestionar la información de la aplicación totalmente desacoplada de los componentes.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/10/04/react-props-propiedades/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2340</post-id>	</item>
		<item>
		<title>Componentes con estado y sin estado</title>
		<link>https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/</link>
					<comments>https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 26 Sep 2018 17:00:11 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[react]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2311</guid>

					<description><![CDATA[Una característica de los componentes, es su estado, el cual determina tanto la información que se muestras en pantalla, hasta como se representa la información, de esta forma, el estado puede cambiar la apariencia gráfica de un componente y la forma en que se muestra la información. Un ejemplo básico de un estado, es, por [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img decoding="async" class="aligncenter wp-image-2320 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componentes-con-estado-sin-estado-1024x573.jpg" alt="Componentes con estado y sin estado" width="648" height="363" /></p>
<p>Una característica de los componentes, es su estado, el cual determina tanto la información que se muestras en pantalla, hasta como se representa la información, de esta forma, el estado puede cambiar la apariencia gráfica de un componente y la forma en que se muestra la información. Un ejemplo básico de un estado, es, por ejemplo, un formulario que puede pasar de modo lectura a escritura.<span id="more-2311"></span></p>
<figure id="attachment_2312" aria-describedby="caption-attachment-2312" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2312 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/cambio-estado-componente-1024x516.png" alt="Cambio de estado en un componente" width="648" height="327" /><figcaption id="caption-attachment-2312" class="wp-caption-text">Cambio de estado en un componente</figcaption></figure>
<p>&nbsp;</p>
<p>Como vemos en la imagen, una componente puede pasar de un formulario que no permite la edición, a otro donde los valores se muestran en <span class="lang:default decode:true crayon-inline">&lt;input&gt;</span>  para que el usuario pueda cambiar sus valores. Al guardar los cambios, el componente puede regresar a su estado principal. No vamos a entrar en los detalles de lo que es un estado, ni cómo es posible modificarlo, pues eso lo podremos para más adelante, por ahora, solo quiero que tengas una idea de lo que es el estado y cómo puede afectar la forma en que se muestra un componente.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Componentes sin estado</h2>
<p>Este tipo de componentes son los más simples, pues solo se utilizan para representar la información que les llega como parámetros. En algunas ocasiones, estos componentes pueden transformar la información con el único objetivo de mostrarla en un formato más amigable, sin embargo, estos compontes no consumen datos de fuentes externas ni modifican la información que se les envía.</p>
<p>&nbsp;</p>
<blockquote><p><em>Los componentes sin estado también son llamados componentes de presentación, pero son mejor conocidos como Stateless Component por su nombre en inglés.</em></p></blockquote>
<p>&nbsp;</p>
<p>Para ejemplificar mejor este tipo de componentes vamos a analizar el siguiente archivo llamado <span class="lang:default decode:true crayon-inline">ItemList.js</span> , el cual representará un ítem de una lista de productos:</p>
<pre class="lang:js decode:true " title="ItemList.js">import React from 'react' 
class ItemList extends React.Component{ 
  constructor(props){ 
	super(props) 
  } 
  
  render(){ 
    return( 
	  &lt;li&gt;{this.props.product.name} - {this.props.product.price}&lt;/li&gt; 
	) 
  }
 } 
 export default ItemList</pre>
<p>Este componte utiliza algo que hasta ahora no habíamos utilizado, las Props, las cuales son parámetros que son enviados durante la creación del componente. En este caso, se le envía una propiedad llamada product, la cual debe de tener un nombre (<span class="lang:default decode:true crayon-inline ">name</span> ) y un precio (<span class="lang:default decode:true crayon-inline ">price</span> ).</p>
<p>&nbsp;</p>
<blockquote><p>Las propiedades o simplemente props, son parámetros que se le envían a un componente durante su creación. Los props pueden ser datos para mostrar o información para inicializar el estado. Como regla general, las props son inmutables, lo que quieres decir, que son de solo lectura. Para obtener las propiedades de un componente es necesario obtenerlas mediante el prefijo <span class="lang:default decode:true crayon-inline ">this.props</span> , seguido del nombre de la propiedad.</p></blockquote>
<p>&nbsp;</p>
<p>Observemos que el componente <span class="lang:default decode:true crayon-inline">ItemList</span>  solo muestra las propiedades que recibe como parámetro, sin realizar ninguna actualización sobre ella.<br />
Para completar este ejemplo, crearemos el componente <span class="lang:default decode:true crayon-inline ">App</span>  que quedará de la siguiente manera:</p>
<pre class="lang:js decode:true" title="App.js">import React from 'react' 
import { render } from 'react-dom' 
import ItemList from './ItemList' 

class App extends React.Component{ 
  render(){
    let items = [{ 9. name: 'Item 1', 10. price: 100 11. }, { 12. name: 'Item 2', 13. price: 200 14. }] 
	
	return ( 
	  &lt;ul&gt; 
	    &lt;For each="item" index='index' of={ items }&gt; 
		  &lt;ItemList product={item}/&gt;
		&lt;/For&gt; 
	  &lt;/ul&gt; 
	)
  } 
}

render(&lt;App/&gt;, document.getElementById('root'));</pre>
<p>Veamos que hemos creado un array de ítems (línea 8), los cuales cuentan con un nombre y un precio. Seguido, iteramos los ítems para crear un componente <span class="lang:default decode:true crayon-inline ">&lt;ItemList&gt;</span>  por cada ítem de la lista, también le mandamos los datos del producto mediante la propiedad <span class="lang:default decode:true crayon-inline ">product</span> , la cual podrá ser accedida por el componente <span class="lang:default decode:true crayon-inline ">&lt;ItemList&gt;</span>  utilizando la instrucción <span class="lang:default decode:true crayon-inline ">this.props.product</span> .</p>
<p>Otra cosa importante a notar, es la línea 3, pues en ella se realiza la importación del nuevo componente para poder ser utilizando.</p>
<figure id="attachment_2314" aria-describedby="caption-attachment-2314" style="width: 774px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2314 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componenete-state-test.jpg" alt="Componentes sin estado" width="774" height="475" /><figcaption id="caption-attachment-2314" class="wp-caption-text">Componentes sin estado</figcaption></figure>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Componentes con estado</h2>
<p>Los componentes con estado se distinguen de los anteriores, debido a que estos tienen un estado asociado al componente, el cual se manipula a mediad que el usuario interactúa con la aplicación. Este tipo de componentes en ocasiones consumen servicios externos para recuperar o modificar la información.</p>
<p>Un ejemplo típico de componentes con estados, son los formularios, pues es necesario ligar cada campo a una propiedad del estado, el cual, al modificar los campos afecta directamente al estado. Veamos cómo quedaría un componente de este tipo. Regresaremos al componente <span class="lang:default decode:true crayon-inline ">App</span>  y lo dejaremos de la siguiente manera:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true" title="App.js">import React from 'react' 
import { render } from 'react-dom' 
import ItemItem from './ItemList' 

class App extends React.Component{ 
  constructor(){ 
    super(...arguments) 
       this.state = { 
       firstName: '', 
       lastName: '', 
       age: '' 
      }  
  } 
  
  handleChanges(e){ 
    let newState = Object.assign(this.state, {[e.target.id]: e.target.value}) 
    this.setState(newState) 
  } 

  render(){ 
    return ( 
      &lt;form&gt; 
        &lt;label htmlFor='firstName'&gt;Nombre&lt;/label&gt; 
        &lt;input id='firstName' type='text' value={this.state.firstName}  onChange={this.handleChanges.bind(this)}/&gt;
        &lt;br/&gt; 
        &lt;label htmlFor='lastName'&gt;Apellido&lt;/label&gt; 
        &lt;input id='lastName' type='text' value={this.state.lastName}  onChange={this.handleChanges.bind(this)}/&gt; 
        &lt;br/&gt; 
        &lt;label htmlFor='age'&gt;Edad&lt;/label&gt; 
        &lt;input id='age' type='number' value={this.state.age}  onChange={this.handleChanges.bind(this)}/&gt; 
      &lt;/form&gt; 
    ) 
  } 
} 
render(&lt;App/&gt;, document.getElementById('root'));</pre>
<p>&nbsp;</p>
<p>No vamos a entrar en detalle acerca de los estados, ni cómo se actualizan, más adelante lo veremos, por lo que solo te cuento rápido que está pasando.<br />
Primero que nada, vemos que en el constructor se establece el estado inicial del componente, el cual tiene un <span class="lang:default decode:true crayon-inline ">firstName</span>  (nombre), <span class="lang:default decode:true crayon-inline ">lastName</span>  (apellido) y <span class="lang:default decode:true crayon-inline ">ege</span>  (edad). Los cuales están inicialmente en blanco.<br />
Seguido tenemos la función genérica <span class="lang:default decode:true crayon-inline ">handleChanges</span>  que modifica el estado a medida que vamos capturando valores en los campos de texto. Y finalmente en el método <span class="lang:default decode:true crayon-inline ">render</span> , retornamos 3 campos, correspondientes a las 3 propiedades del estado, adicional, cada campo está ligado a una propiedad del estado mediante la propiedad <span class="lang:default decode:true crayon-inline ">value</span> . Cuando el usuario captura valores en los campos, se dispara la función <span class="lang:default decode:true crayon-inline ">handleHanges</span>  para actualizar el estado.</p>
<p>&nbsp;</p>
<figure id="attachment_2316" aria-describedby="caption-attachment-2316" style="width: 670px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2316 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componenete-state-test2.jpg" alt="Componente con estado" width="670" height="352" /><figcaption id="caption-attachment-2316" class="wp-caption-text">Componente con estado</figcaption></figure>
<p>&nbsp;</p>
<p>Seguramente al ver esta imagen, no quede muy claro que está pasando con el estado, es por eso que utilizaremos el plugin <em>React Developer Tools</em> que puedes descargar desde chrome para analizar mejor como es que el estado se actualiza. Para esto, nos iremos al inspector, luego seleccionaremos el <em>Tab React</em>:</p>
<figure id="attachment_2317" aria-describedby="caption-attachment-2317" style="width: 802px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-2317 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/componenete-state-test3.jpg" alt="Inspeccionando un componente con estado" width="802" height="515" /><figcaption id="caption-attachment-2317" class="wp-caption-text">Inspeccionando un componente con estado</figcaption></figure>
<p>&nbsp;</p>
<p>Una vez en el <em>tab React</em>, seleccionamos el tag <span class="lang:default decode:true crayon-inline ">&lt;App&gt;</span>  y del lado izquierdo veremos las propiedades y el estado. Con el inspector abierto, actualiza los campos de texto y verás cómo el estado también cambia.</p>
<p>&nbsp;</p>
<blockquote><p>Se le conoce como componente con estado, a aquellos componentes que tiene estado y que adicional, manipulan el estado a medida que el usuario interactúa con ellos. Estos componentes también son conocidos como Componentes Contenedores, pero es más común llamarlos Stateful Components, por su nombre en inglés.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<figure id="attachment_2293" aria-describedby="caption-attachment-2293" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="Aplicaciones reactivas con React, NodeJS &amp; MongoDB" width="648" height="249" /></a><figcaption id="caption-attachment-2293" class="wp-caption-text">¿Quieres aprender React como un profesional? te invito a que veas mi nuevo libro</figcaption></figure>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos podido analizar en este artículo, existen dos tipos de componentes, con estado y sin estado, los cuales podrán ser utilizados según las necesidades que tengamos. Recordemos que los componentes sin estado solo se utilizan para representar las propiedades enviadas como parámetros o mostrar una estructura estática, mientras que los componentes con estados permiten interacturar con un estado que representa la información interna del componente, lo que les permite afectar la forma en que se ven y la como muestran los datos antes el usuario.		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/09/26/componentes-con-estado-y-sin-estado/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2311</post-id>	</item>
		<item>
		<title>Las 4 formas de crear un componentes en React</title>
		<link>https://www.oscarblancarteblog.com/2018/09/22/las-4-formas-crear-component-react/</link>
					<comments>https://www.oscarblancarteblog.com/2018/09/22/las-4-formas-crear-component-react/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Sat, 22 Sep 2018 16:23:02 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2300</guid>

					<description><![CDATA[Debido a que React está creado bajo el lenguaje de programación JavaScript, este también depende de su sintaxis para construir y declarar sus componentes y es por ello que existen actualmente 4 formas de crear componentes, las cuales obedecen a las distintas versiones del Estándar ECMAScript. &#160; ECMAScript 5 – createClass Este fue el primer [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="aligncenter wp-image-2305 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/09/react-components-1024x573.jpg" alt="Las 4 formas de crear un componentes en React" width="648" height="363" />Debido a que React está creado bajo el lenguaje de programación JavaScript, este también depende de su sintaxis para construir y declarar sus componentes y es por ello que existen actualmente 4 formas de crear componentes, las cuales obedecen a las distintas versiones del Estándar ECMAScript.<span id="more-2300"></span></p>
<p>&nbsp;</p>
<h2>ECMAScript 5 – createClass</h2>
<p>Este fue el primer método que existió para crear componentes en React y aun que ya está bastante anticuado, la realidad es que puedes encontrar mucho material en Internet que todavía utiliza este método. Es muy probable que ya no te toque trabajar con este método, sin embargo, no está de más mencionarlo y si te lo llegaras a encontrar, sepas de que están hablando.<br />
Para crear componentes en ECMAScript 5 es necesario utilizar el método <span class="lang:default decode:true crayon-inline ">createClass</span>  de la clase React, Veamos un ejemplo muy rápido:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true " title="ECMAScript 5">var miComponent = React.createClass({ 
  propTypes: {...}, 
  getDefaultProps: {...}, 
  getInitialState: {...}, 
  render: function(){...} 
})</pre>
<p>Lo primero que podemos ver, es que la clase se crea mediante la función <span class="lang:default decode:true crayon-inline ">React.createClass</span> , el cual recibe un objeto que debe de tener al menos la función render, adicional, se puede declarar los <span class="lang:default decode:true crayon-inline ">propTypes</span> , <span class="lang:default decode:true crayon-inline ">defaultProps</span>  y el estado inicial del componente.</p>
<p>&nbsp;</p>
<h2>ECMAScript 6 &#8211; React.Component</h2>
<p>Este es el método que hemos está utilizando hasta ahora, en la cual los componentes se crean mediante clases que extienden de <span class="lang:default decode:true crayon-inline">React.Component</span> . vemos un ejemplo rápido:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true" title="ECMAScript 6">import React from 'react' 
class ECMAScript6Class extends React.Component{ 
  constructor(props){ 
    super(props) 
      state = {
        ...
      } 
    } 
	
  render(){ 
    return ( 
      ... 
    ) 
  } 
}

ECMAScript6Class.propTypes = { ... } 
ECMAScript6Class.defaultProps = { ... }</pre>
<p>Cuando declaramos una clase, es necesario crear el constructor que reciba los <span class="lang:default decode:true crayon-inline ">props</span> , para después enviarlos a la superclase, de esta forma iniciamos correctamente el componente. Los <span class="lang:default decode:true crayon-inline ">propsTypes</span>  y <span class="lang:default decode:true crayon-inline">defaultsProps</span>  son declarados fuera de la clase. Este es el componente más recomendable cuando trabajamos con componentes con estado (<em>Stateful</em>). Pues permite un mejor control sobre el componente.</p>
<p>&nbsp;</p>
<h2>ECMAScript 6 &#8211; Function Component</h2>
<p>La siguiente forma que soporta ECMAScript 6, es la creación de componentes mediante funciones, y es recomendado únicamente para componentes sin estado (<em>Stateless</em>). Veamos cómo quedaría:</p>
<p>&nbsp;</p>
<pre class="lang:default decode:true" title="ECMAScript 6 Stateles">cont MiComponent = ({prop1, prop2, prop2}) =&gt; ( 
  return( 
    ... 
  ) 
) 
MiComponent.propTypes = { 
  ... 
} 
MiComponent.defaultProps = { 
  ...
}</pre>
<p>Observemos que el componente se reduce a una <em>arrow function</em>, la cual recibe como parámetros las <span class="lang:default decode:true crayon-inline ">props</span> . El cuerpo de la función es como el método render, podremos crear variables, poner un poco de lógica y retornar un JSX.<br />
Adicional, se puede definir los <span class="lang:default decode:true crayon-inline">propTypes</span>  y <span class="lang:default decode:true crayon-inline ">defaultProps</span>  por fuera de la función.</p>
<p>&nbsp;</p>
<h2>ECMAScript 7 &#8211; React.Component</h2>
<p>La última forma disponible, es utilizar las nuevas sintaxis de ECMAScript 7. Aunque todo apunta a que esta sea la mejor forma de declarar componentes, no es muy utilizada aun, debido a que ECMAScript 7 todavía se encuentra en desarrollo. Este método es muy parecido a la creación de componentes mediante <span class="lang:default decode:true crayon-inline ">React.Componentes</span>  ES6. Veamos cómo quedaría:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true" title="ECMAScript 7">class MiComponent extends React.Component { 
  static propTypes = {
    ...
  } 
  
  static defaultProps = { 
    ... 
  } 
  
  state = { 
	... 
  } 
  
  constructor(props){ 
    super(props) 
  } 
  
  render(){ 
    ... 
  } 
}</pre>
<p>Este método es prácticamente igual que crear una clase en ES6, con la diferencia que es posible declarar el estado como una propiedad, adicional, podemos declarar los <span class="lang:default decode:true crayon-inline ">defaultProps</span>  y <span class="lang:default decode:true crayon-inline ">propTypes</span>  dentro de la clase y marcarlos como <span class="lang:default decode:true crayon-inline ">static</span>  para poder ser accedidos desde fuera sin necesidad de crear una instancia.</p>
<p>&nbsp;</p>
<figure id="attachment_2293-2" aria-describedby="caption-attachment-2293-2" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="Aplicaciones reactivas con React, NodeJS &amp; MongoDB" width="648" height="249" /></a><figcaption id="caption-attachment-2293-2" class="wp-caption-text">¿Quieres aprender React como un profesional? te invito a ves mi nuevo libro</figcaption></figure>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos podido observar, React ha venido cambiando la forma en que podemos crear componentes, permitiendo crear componentes desde una simple <span class="lang:default decode:true crayon-inline ">arrow function</span> , hasta una clase JavaScript que extiende de <span class="lang:default decode:true crayon-inline ">React.Component</span> , la forma de definir los <span class="lang:default decode:true crayon-inline ">defaultProps</span>  y <span class="lang:default decode:true crayon-inline ">propTypes</span>  también ha venido cambiando a medida que el lenguaje Javascript evoluciona y nos permite nuevas formas de definirlas, lo que nos hace pensar que seguramente veremos más formas de crear Componentes en el futuro.		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/09/22/las-4-formas-crear-component-react/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2300</post-id>	</item>
		<item>
		<title>Hello World con React</title>
		<link>https://www.oscarblancarteblog.com/2017/11/29/hello-world-con-react/</link>
					<comments>https://www.oscarblancarteblog.com/2017/11/29/hello-world-con-react/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 29 Nov 2017 09:00:44 +0000</pubDate>
				<category><![CDATA[React]]></category>
		<category><![CDATA[react]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1927</guid>

					<description><![CDATA[Una de las grandes ventajas que ofrece React con respecto a otras herramientas para el desarrollo web, es la facilidad con que es posible implementar en un proyecto, pues al ser una librería Javascript, es posible instalarla en un proyecto de diversas formas. &#160; Si todavía no sabes que es React o la forma en [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="aligncenter wp-image-1939" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/banner.png" alt="Hello World con React" width="875" height="490" />Una de las grandes ventajas que ofrece React con respecto a otras herramientas para el desarrollo web, es la facilidad con que es posible implementar en un proyecto, pues al ser una librería Javascript, es posible instalarla en un proyecto de diversas formas.<span id="more-1927"></span></p>
<p>&nbsp;</p>
<p>Si todavía no sabes que es React o la forma en que este trabaja, te invito a que veas una <a href="https://www.oscarblancarteblog.com/2017/05/02/introduccion-react-js/">Introducción a React JS</a> que escribí hace unos días, en donde hablo de las ventajas y desventajas, así de porqué es tan exitoso este framework.</p>
<p>&nbsp;</p>
<p>Tenemos básicamente 3 formas de implementar React en nuestro proyecto, la las cuales son mediante CDN, utilerías (boilerplate) o una configuración manual, aunque en la práctica y para desarrollos profesionales, solo se utilizan las dos últimas opciones, sin embargo, aquí vamos a explicar las 3 formas para que las conozcas y sea tu quien identifique qué forma se adapta mejor a tus necesidades.</p>
<p>&nbsp;</p>
<h2>Instalar React con CDN</h2>
<p>&nbsp;</p>
<p>Este es el método más simple, pues solo requiere importar React mediante el tag &lt;script&gt; directamente sobre el documento HTML en donde se requiere. Veamos un ejemplo:</p>
<pre class="lang:xhtml decode:true" title="index.html">&lt;!DOCTYPE html&gt;  
&lt;html lang="es"&gt;  
  &lt;head&gt;  
    &lt;title&gt;Hello World React CDN&lt;/title&gt;  
  &lt;/head&gt;  
  &lt;body&gt;  
    &lt;div id="root"&gt;&lt;/div&gt;  
    &lt;script src="https://fb.me/react-15.0.0.js"&gt;&lt;/script&gt;  
    &lt;script src="https://fb.me/react-dom-15.0.0.js"&gt;&lt;/script&gt;  
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"&gt;&lt;/script&gt;  
    &lt;script cross src="App.js" type="text/babel"&gt;&lt;/script&gt;  
  &lt;/body&gt;  
&lt;/html&gt;  
</pre>
<p>&nbsp;</p>
<p>En el documento anterior podemos apreciar un documento HTML simple, sin nada más que una división <em>&lt;div&gt;</em> y 4 scripts, de los cuales, los dos primeros son necesario para tener a React disponible en nuestra página. El tercero, importa Babel, el cual es un transpilador que nos permite utilizar JSX para desarrollar con React.</p>
<p><em>JSX o JavaScript XML, es un lenguaje que extiende a JavaScript para hacerlo más potente y es el estándar para el desarrollo web con React, un que también es posible utilizar JavaScript puro. </em></p>
<p>El cuarto script (<em>App.js</em>) es un archivo Javascript que hemos creado para agregar toda la lógica de React y separarla del documento HTML, un que es posible insertar directamente el código dentro de la etiqueta <em>&lt;script&gt;</em> ahorrándonos la creación de un archivo adicional.</p>
<p>&nbsp;</p>
<p>El archivo App.js se ve de la siguiente forma:</p>
<pre class="lang:js decode:true " title="App.js">var HelloWorld = React.createClass({    
  render: function() {    
    return (    
      &lt;h1&gt;Hello World CDN&lt;/h1&gt;    
    )    
  }    
});    
    
ReactDOM.render(    
  &lt;HelloWorld/&gt;,    
  document.getElementById('root')    
);</pre>
<p>&nbsp;</p>
<p>En las líneas 1 a 7 creamos un Componente llamado HelloWorld el cual retornará una etiqueta &lt;h1&gt; con la frase, “<em>Hello World CDN</em>”.</p>
<p>Finalmente, en las líneas 9 a 12 hacemos que React muestre nuestro componente dentro del elemento con id = root, el cual lo tenemos definido en el documento index.html.</p>
<p>Clave aclarar que este método es ajeno a cualquier web, ya sea Apache, NodeJS, ISS, o cualquier otro, por lo que puede ser montado en el que sea, el cual dará como resultado lo siguiente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1930" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/Hello-Word-React-CDN.png" alt="Hello Word React CDN" width="643" height="401" /></p>
<p>&nbsp;</p>
<h2>Instalar React con utilerías</h2>
<p>&nbsp;</p>
<p>Este segundo método es recomendado únicamente cuando vamos a desarrollar el FrontEnd, y asumimos que todos los servicios o recursos WEB ya está disponibles para ser consumidos.</p>
<p>Para este método será necesario instalar NodeJS + NPM, para lo cual, tendremos que ir a la página oficial de NodeJS y descargarlo. <a href="https://nodejs.org">https://nodejs.org</a>.</p>
<p>Puedes ver una <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/"><strong>introducción a NodeJS</strong></a> en el siguiente artículo.</p>
<p>Una vez que tenemos NodeJS instalado, deberemos instalar la utilería <em>create-react-app</em> mediante la ejecución del siguiente comando en la terminal: <em>npm install -g create-react-app</em>. Una vez instalada la utilería, deberemos ubicarnos mediante la terminal en la carpeta en la queramos crear el proyecto y ejecutar el comando: <em>create-react-app &lt;app-name&gt;</em>, donde &lt;<em>app-name&gt;</em> deberá ser el nombre del proyecto. Este comando tardará un momento, principalmente si es la primera vez que lo ejecutamos, pues descargará algunas dependencias.</p>
<p>Una vez terminada la instalación veremos lo siguiente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1931" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/Hello-Word-React-create-react-app.png" alt="Hello Word React create-react-app" width="634" height="430" /></p>
<p>&nbsp;</p>
<p>El siguiente paso será cambiar de directorio al creado por la nueva aplicación, en nuestro caso app-test, para lo cual ejecutamos el comando <em>cd app-test</em>, y finalmente ejecutamos el comando <em>npm start</em>.</p>
<p>Esta acción levantará un servidor NodeJS en el puerto 3000, por lo que podremos ir al navegador y entrar a <a href="http://localhost:3000">http://localhost:3000</a>.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1932" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/Hello-Word-React-create-react-app2.png" alt="Hello Word React create-react-app2" width="599" height="431" /></p>
<p>&nbsp;</p>
<p>Como resultado, veremos la pantalla anterior y solo nos restará editar el archivo <em>App.js</em> para personalizar nuestra aplicación.</p>
<p>&nbsp;</p>
<h2>Instalar React manualmente.</h2>
<p>&nbsp;</p>
<p>El tercer método es el más complicado, pues requiere que configuremos todo el proyecto paso a paso, pero también es el más recomendado, pues permite que configurar cada aspecto de React y nuestro servidor NodeJS.</p>
<p>Este método es recomendado cuando queremos desarrollar el FrontEnd, pero adicional, requerimos desarrollar funcionalidad del lado del servidor. Muy utilizado para crear el FrontEnd + BackEnd.</p>
<p>Para iniciar este método, es necesario ubicarnos mediante la terminal en la carpeta en donde queremos crear el proyecto. Una vez allí, ejecutaremos el comando <em>npm init -y</em>. Este comando creará solamente el archivo <em>package.json</em>, el cual es el inicio para cualquier proyecto con NodeJS.</p>
<p>Lo siguiente será instalar todas las dependencias necesarias mediante npm. Es posible instalar todas las dependencias de una por una o agregar todas las dependencias al archivo package.json e instalarlas todas de una. En nuestro caso, actualizaremos el archivo<em> package.json</em> para que se vea de la siguiente manera:</p>
<pre class="lang:js decode:true " title="package.json">{  
  "name": "app-test",  
  "version": "1.0.0",  
  "description": "",  
  "main": "index.js",  
  "scripts": {  
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"  
  },  
  "keywords": [],  
  "author": "",  
  "license": "ISC",  
  "devDependencies": {  
    "babel-core": "^6.24.1",  
    "babel-loader": "^7.0.0",  
    "babel-preset-es2015": "^6.24.1",  
    "babel-preset-react": "^6.24.1",  
    "webpack-dev-middleware": "^1.12.1",  
    "webpack": "^3.8.1"  
  },  
  "dependencies": {  
    "express": "^4.16.2",  
    "react": "^16.1.1",  
    "react-dom": "^16.1.1"  
  }  
}</pre>
<p>&nbsp;</p>
<p>Y continuaremos con la ejecución del comando npm install, este simple paso instalará todas las dependencias listadas en el archivo de forma automática.</p>
<p>Podemos apreciar dos secciones en el archivo, <em>devDependencies</em> que es para librerías para desarrollo y <em>dependencies</em>, las cuales estarán disponibles en todo momento, ya sea desarrollo o producción.</p>
<p>Las librerías que inician con <em>babel-*</em> son para permitir la transpilación de JSX a JavaScript nativo, mientras que <em>Webpack</em> y <em>Webpack-dev-middleware</em> son para el empaquetamiento del proyecto y de la compilación de los archivos (respectivamente).</p>
<p>Las librerías <em>react</em> y <em>react-dom</em> son las indispensables para utilizar react, mientras que express es un framework para desarrollo web con NodeJS.</p>
<p>&nbsp;</p>
<p>Para que Webpack funcione, será necesario crear el archivo w<em>ebpack.config.js</em> sobre la raíz del proyecto, el cual se verá de la siguiente manera:</p>
<pre class="lang:js decode:true " title="webpack.config.json">module.exports = {    
  entry: [    
    __dirname + "/app/App.js",    
  ],    
  output: {    
    path: __dirname + "/public",    
    filename: "bundle.js",    
    publicPath: "/public"    
  },    
        
  module: {    
    loaders: [{    
      test: /\.jsx?$/,    
      exclude: /node_modules/,    
      loader: 'babel-loader',    
      query:{    
        presets: ['es2015','react']    
      }    
    }]    
  }    
};</pre>
<p>&nbsp;</p>
<p>En este archivo tenemos 3 secciones, entry, que permite definir el punto de inicio de la aplicación, en este caso el archivo App.js.</p>
<p>Output, donde configuramos donde quedará los archivos empaquetados por Webpack, en este caso, definimos que estará disponibles en el path <em>/public</em> y que el archivo empaquetado se llamará <em>public.js</em>.</p>
<p>La sección module nos ayuda a definir como se llevará a cabo la transpilación y los archivos a procesar, en este caso, definimos que tome todos los archivos <em>*.js</em> y que excluya los que estén en la carpeta <em>node-module</em>, también indicamos que utilizará el modulo <em>babel-loader</em> para transpilar los archivos.</p>
<p>&nbsp;</p>
<p>El siguiente paso será crear nuestro archivo index.html, el cual se verá de la siguiente manera:</p>
<pre class="lang:xhtml decode:true " title="index.html">&lt;!DOCTYPE html&gt;    
&lt;html lang="es"&gt;    
  &lt;head&gt;    
    &lt;title&gt;Hello World React CDN&lt;/title&gt;    
  &lt;/head&gt;    
  &lt;body&gt;    
    &lt;div id="root"&gt;&lt;/div&gt;    
    &lt;script type="text/javascript" src="/public/bundle.js"&gt;&lt;/script&gt;    
  &lt;/body&gt;    
&lt;/html&gt;</pre>
<p>&nbsp;</p>
<p>Podemos ver que este archivo se ve más simple que en el primer método que analizamos, pues solo requiere hacer referencia al archivo<em> bundle.js</em>, el cual tiene toda la aplicación transpilada y empaquetada. Adicional, es necesario tener un div con id=root, para que sirve como punto de montado para React.</p>
<p>&nbsp;</p>
<p>Los últimos pasos será crear nuestros archivos de React, me refiero a <em>App.js</em> y a nuestro componente <em>HelloWord.js</em> dentro de la carpeta <em>/app</em>:</p>
<pre class="lang:js decode:true " title="App.js">import React from 'react'    
import { render } from 'react-dom'    
import HelloWorld from './HelloWorld'    
    
render((    
  &lt;HelloWorld/&gt;    
), document.getElementById('root'))</pre>
<p>&nbsp;</p>
<p>La función render es la encargada de montar el componente HelloWord dentro del elemento con ID =root</p>
<pre class="lang:js decode:true " title="HelloWorld.js">import React from 'react'    
    
class HelloWorld extends React.Component{    
    
  render(){    
    return(    
      &lt;h1&gt;Hello World!&lt;/h1&gt;    
    )    
  }    
}    
export default HelloWorld</pre>
<p>&nbsp;</p>
<p>En este punto ya tenemos creada la aplicación en React, sin embargo, es necesario crear un servidor con NodeJS para que responda a las peticiones del puerto <span class="lang:default decode:true crayon-inline ">3000</span> , para ello, deberemos crear el archivo <span class="lang:default decode:true crayon-inline ">server.js</span>  en la raíz del proyecto:</p>
<pre class="lang:js decode:true" title="server.js">var express = require('express');
var app = express();
var path = require('path')
var webpack = require('webpack')
var config = require('./webpack.config')
var compiler = webpack(config)

app.use('/public', express.static(__dirname + '/public'))
app.use(require('webpack-dev-middleware')(compiler, {
    noInfo: true,
    publicPath: config.output.publicPath
}))

app.get('/*', function (req, res) {
    res.sendFile(path.join(__dirname, 'index.html'))
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
});
</pre>
<p>&nbsp;</p>
<p>A grandes rasgos, este archivo lo que hace es responder a todas la peticiones en la url <span class="lang:default decode:true crayon-inline ">/*</span> , es decir, todo lo que venga después de la raíz del dominio y enviar el archivo <span class="lang:default decode:true crayon-inline ">index.html</span> , adicional, utiliza el módulo <span class="lang:default decode:true crayon-inline ">webpack-dev-middleware</span>  para &#8220;Transpilar&#8221; la aplicación en tiempo real y crear el archivo <span class="lang:default decode:true crayon-inline ">bundle.js</span> . En este punto, solo restaría ejecutar la aplicación con el comando <span class="lang:default decode:true crayon-inline ">node ./server.js</span> . El componente HelloWord solamente imprime Hello Word! En pantalla.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1934" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/Hello-World-con-React-manual.png" alt="Hello World con React manual" width="599" height="368" /></p>
<p>Finalmente, código completo de la aplicación lo puedes encontrar en el siguiente repositorio de GitHub: https://github.com/oscarjb1/blog-react-hello-world</p>
<p>&nbsp;</p>
<figure id="attachment_2293-3" aria-describedby="caption-attachment-2293-3" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" decoding="async" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="Aplicaciones reactivas con React, NodeJS &amp; MongoDB" width="648" height="249" /></a><figcaption id="caption-attachment-2293-3" class="wp-caption-text">¿Quieres aprender React como un profesional? te invito a que veas mi nuevo libro</figcaption></figure>
<p>&nbsp;</p>
<h2>Conclusiones:</h2>
<p>Instalar React puede parecer un reto la primera vez que lo utilizamos, pues no existe un IDE especial para React que nos ayude en la creación y configuración del proyecto, como es el caso de Java con Eclipse y NetBeans o C# con Visual Estudio. Sin embargo, una vez que entendemos como instalarlo y configurarlo ya no representa más un problema.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/11/29/hello-world-con-react/feed/</wfw:commentRss>
			<slash:comments>19</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1927</post-id>	</item>
		<item>
		<title>Introducción a React JS</title>
		<link>https://www.oscarblancarteblog.com/2017/05/02/introduccion-react-js/</link>
					<comments>https://www.oscarblancarteblog.com/2017/05/02/introduccion-react-js/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 02 May 2017 09:00:02 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[desarrollo web]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1699</guid>

					<description><![CDATA[React es sin duda una de las tecnologías web más revolucionarias de la actualidad, pues proporciona todo un mecanismo de desarrollo de aplicaciones totalmente desacoplado del backend y ejecutado 100% del lado del cliente. &#160; React fue lanzado por primera vez en 2013 por Facebook y es actualmente mantenido por ellos mismo y la comunidad [&#8230;]]]></description>
										<content:encoded><![CDATA[<h1><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1701" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/Introducción-a-React-JS.jpg" alt="Introducción a React JS" width="942" height="528" /></h1>
<p>React es sin duda una de las tecnologías web más revolucionarias de la actualidad, pues proporciona todo un mecanismo de desarrollo de aplicaciones totalmente desacoplado del backend y ejecutado 100% del lado del cliente.<span id="more-1699"></span></p>
<p>&nbsp;</p>
<p>React fue lanzado por primera vez en 2013 por Facebook y es actualmente mantenido por ellos mismo y la comunidad de código abierto, la cual se extiende alrededor del mundo. React, a diferencia de muchas tecnologías del desarrollo web, es una librería lo que lo hace mucho más fácil de implementar en muchos desarrollos, ya que se encarga <strong>exclusivamente de la interface gráfica del usuario</strong> y consume los datos a través de API que por lo general son REST.</p>
<p>Te recomiendo el artículo <a href="https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/">SOAP vs REST</a> en donde hablo de las diferencias que existen entre ambas.</p>
<p>El nombre de React proviene de su capacidad de crear <strong>interfaces de usuario reactivas</strong>, la cual es la capacidad de una aplicación para actualizar toda la interface gráfica en cadena, como si se tratara de una formula en Excel, donde al cambiar el valor de una celda automáticamente actualiza todas las celdas que depende del valor actualizado y esto se repite con las celdas que a la vez dependía de estas últimas.</p>
<p>&nbsp;</p>
<h2>Como funciona React</h2>
<p>&nbsp;</p>
<p>React es una librería de Javascript que nos permite crear la interface UI mediante una sintaxis propia llamada Javascript XML (JSX) el cual es una mezcla entre XML y HTML que permite la construcción de elementos HTML de una forma muy simple y rápida.</p>
<p>Las aplicaciones desarrolladas mediante JSX <strong>no pueden ser interpretadas por el navegador</strong>, por lo que es requerido que todo el código sea convertido a Javascript nativo mediante un proceso llamado <strong>Transpilación</strong>, el cual es parecido a la compilación, pero en este proceso no se lleva a cabo una compilación como tal, sino que el código es convertido de JSX a Javascript.</p>
<p>Este proceso es llevado a cabo mediante herramientas como Webpack el cual es el más ampliamente utilizado.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1702" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/react-webpack.png" alt="React Webpack" width="817" height="350" /></p>
<p>Como vemos en la imagen, Webpack es en realidad un empaquetador, el cual organiza, compacta y mediante plugins como Babel realiza la transpilación, arrojando como resultado una serie de archivos compactos y listos para ser utilizados.</p>
<p>&nbsp;</p>
<h2>React y el Backend</h2>
<p>&nbsp;</p>
<p>Como hablamos, React solo sirve para la creación de interface gráfica, por lo que <strong>el desarrollo del backend queda fuera de React</strong> y es precisamente eso lo que lo hace una librería super portable, ya que la podemos integrar con cualquier API ya desarrollada.</p>
<p>&nbsp;</p>
<p>Como React no es capaz de resolver la parte del backend es necesario desarrollar el API de datos mediante otras tecnologías como NodeJS, el cual es por lo general el servidor más utilizado para el desarrollo con React.</p>
<p>El API es consumido mediante AJAX a medida que la aplicación lo demanda.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1703" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/react.png" alt="react nodejs" width="651" height="215" /></p>
<p>&nbsp;</p>
<h2>React y Web Components</h2>
<p>&nbsp;</p>
<p>React utiliza una forma de trabajar que a mi parecer se convertirá en el estándar en unos años más y es que utiliza un concepto llamado <em>Web Componentes</em>, el cual es la creación de tus propias etiquetas de HTML para representar tus componentes. Te imaginas crear un login en tu página utilizando una etiqueta como esta &lt;login&gt;, pues esta forma de trabajar es la que propone React, donde todo lo que desarrollemos sean componentes que puedan ser reutilizables cuantas veces queramos, incluso podrán ser empaquetadas como librerías para que las utilices en diferentes desarrollos. Esto lo puedes ver como si cada componente fuera una pequeña caja, y lo único que tenemos que hacer es colocar las cajas donde la necesitemos.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1704" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/react-2.png" alt="React Web Components" width="865" height="441" /></p>
<p>Como podemos ver en la imagen, cada parte de la aplicación puede ser un componente (etiqueta) el cual solo se tiene que agregar a la página para crear interfaces gráficas micho más rápido. Ahora veamos cómo quedaría esta misma página, pero en código con React:</p>
<p>&nbsp;</p>
<pre class="lang:js decode:true" title="LoginApp.js">import React from 'react'
import NavBar from './NavBar'
import Login from './Login'
import Footer from './Footer'

class LoginApp extends React.Component{

  render(){

    return(
      &lt;div&gt;
        &lt;NavBar/&gt;
        &lt;Login/&gt;
        &lt;Footer/&gt;
      &lt;/div&gt;
    )
  }
}</pre>
<p>&nbsp;</p>
<p>Observemos que estamos utilizando las etiquetas &lt;NavBar&gt;, &lt;Login&gt; y &lt;Footer&gt; las cuales no son propias de HTML , pero sin componentes desarrollados en React, los cuales pueden ser simplemente importados y utilizados.</p>
<p>&nbsp;</p>
<h2>React y el Shadow DOM</h2>
<p>&nbsp;</p>
<p>React es una librería que se ejecuta del lado de cliente, por lo que es esta misma la encargada de actualizar el DOM a medida que el usuario interactúa con la UI, sin embargo, el proceso de actualización del DOM es un trabajo muy costoso para el navegador, por lo que actualizar el DOM cada vez que el usuario realiza una acción, no es una opción, es por esto que React provee un DOM propio llamado Shadow DOM el cual es una versión del DOM sobre la cual React trabaja para realizar los cambios, y una vez que calcula todos los cambios que hay que realizar es solo entonces cuando actualiza el DOM del navegador. Este proceso es en realidad muy complejo y React se encarga por completo de su gestión, por lo que como programadores no hace falta preocuparnos por estos detallas en la mayoría de las veces.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1705" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/react-3.png" alt="React Shadow DOM" width="653" height="314" /></p>
<p>Cuando se realiza un cambio en el Shadow DOM, este se dé sincroniza con el DOM original y es necesario realizar un proceso llamado reconciliación, el cual es el encargado de aplicar los cambios del Shadow DOM al DOM real.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1706" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/react-4.png" alt="React Shadow DOM Reconciliation" width="865" height="295" /></p>
<h2></h2>
<h2>React y los Estados</h2>
<p>&nbsp;</p>
<p>Una de las principales características de React es que los componentes pueden mantener estados. Los estados le indican los datos que el componente muestra, e incluso el formato en se muestran.</p>
<p>Por ejemplo, podemos tener un formulario, el cual tenga los estados de solo lectura y edición, en el primero, solo mostraremos los datos en texto plano, como un &lt;p&gt; o un &lt;span&gt; mientras que cuando el formulario está en estado de edición, podemos representar el formulario con &lt;imput type=”text” /&gt;</p>
<p>Cuando un componte por alguna razón modifica su estado, entra en lo que se le conoce como Dirty o Sucio, y esto le indica a React que debe de haber un proceso de Reconciliación para actualizar los datos en la UI.</p>
<p>Como ya hablamos en hace un momento, React utiliza programación Rectiva para actualizar los componentes, de tal forma, que cuando un componente es actualizado, todos los componentes hijos del árbol DOM serán evaluados para determinar si deben de ser también actualizados.</p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1707" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/05/react-5.png" alt="React Shadow DOM Dirty" width="746" height="445" /></p>
<p>En la imagen podemos apreciar en Rojo, los componentes que fueron actualizados por el usuario, por lo que React deberá iniciar el proceso de Reconciliación para estos componentes, pero adicional, si este componente tiene componentes hijos, React deberá determinar si los hijos necesitan ser también actualizados en cascada, ha este proceso es a lo que se le conoce como programación Reactiva.</p>
<p>&nbsp;</p>
<p>React es bastante inteligente para determinar que componentes deberán ser actualizado, sin embargo, React también nos da la posibilidad de ayudarle en este proceso, con la finalidad de optimizar aún más la forma en que se lleva a cabo la Reconciliación.</p>
<p>&nbsp;</p>
<figure id="attachment_2293-4" aria-describedby="caption-attachment-2293-4" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb"><img loading="lazy" decoding="async" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="Aplicaciones reactivas con React, NodeJS &amp; MongoDB" width="648" height="249" /></a><figcaption id="caption-attachment-2293-4" class="wp-caption-text">¿Quieres aprender React como un profesional? te invito a que veas mi nuevo libro.</figcaption></figure>
<p>&nbsp;</p>
<h2> Deploy de React</h2>
<p>&nbsp;</p>
<p>Finalmente, React tiene una forma muy particular de ser cargado por el navegador, pues cuando el usuario entra a la página, esta solo tiene un elemento, sobre el cual react montará toda la aplicación.</p>
<p>&nbsp;</p>
<pre class="lang:xhtml decode:true" title="index.html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="root"&gt;&lt;/div&gt;
&lt;script type="text/javascript" src="/bundle.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>&nbsp;</p>
<p>Adicional del elemento root, se carga un JavaScript llamado bundle.js el cual es en realidad TODA LA APLICACIÓN en un solo archivo, el cual es generado por Webpack tras ejecutar el proceso de Transpilación.</p>
<p>Cuando el bundle.js se carga por completo, remplaza el componente root por la aplicación desarrollada en React.</p>
<p>&nbsp;</p>
<blockquote><p>Referencias adicionales: <a href="https://softwarecrafters.io/react/tutorial-react-js-introduccion/" target="_blank" rel="noopener">introducción a reactjs</a> por Miguel Gómez</p></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/05/02/introduccion-react-js/feed/</wfw:commentRss>
			<slash:comments>20</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1699</post-id>	</item>
	</channel>
</rss>
