Tutorial de React
Tutorial de React
React
1. ¿Qué es JSX?
2. ECMAScript 6. Lo Básico
3. React API y ReactDOM
4. Componente-zación y Create React App — Código
fuente: GitHub
5. Propiedades y Estado de los Componentes — Código
fuente: GitHub
6. Eventos en React — Código fuente: GitHub
7. Ciclos de Vida de los Componentes de React
1. ¿Qué es JSX?
¿Y BabelJS?
Nuestro código JSX es compilado por un “Transpiler”, que
quiere decir que toma un código de un lenguaje y lo compila
al mismo código en otro lenguaje. Este “Transpiler”,
llamado Babel JS, compila el código JSX a código JS. (Más
sobre source-to-source compiler)
¿Cómo funciona?
Las expresiones JSX se convierten en llamados regulates de
funciones de JavaScript que finalmente evalúan a un Objeto.
<h1>Hello world!</h1>
evaluaría a algo como:
React.createElement("h1", null, "Hello world!");
Nuevas variables
ES6 nos trae dos nuevas formas de declarar
variables, const y let. La gran diferencia entre estas 2 formas
de declarar variables y la forma antigua, var es que
el scope de var es hacia una función mientras que
el scope de const y let es hacia un bloque de código.
Arrow functions
se usan para definir funciones
arrow functions
anónimas con 2 grandes características que la diferencia
de la forma tradicional de definir una función (con la
palabra clave function).
Características:
Destructuring
Una manera de asignar múltiples llaves o
propiedades de un objeto o arreglo simultáneamente.
Sé que no es muy claro, pero este es uno de esos momentos
en que definitivamente el código tiene muchísimo más
sentido que la teoría.
const newArray = [1, 2, 3];
let [one, two, three] = newArray;const newObject = {
name: 'Simon',
hobby: 'React'
};
let { hobby, name } = newObject;
En este código estamos creando tres variables one, two, three y
a cada una le estamos asignando cada uno de los valores
correspondientes del arreglo. Lo mismo para newObject,
creamos 2 variables hobby y name y les asignamos a cada una la
llave correspondiente. Esto sería lo mismo que el siguiente
código:
var newArray = [1, 2, 3];
var one = newArray[0],
var two = newArray[1],
var three = newArray[2];var newObject = {
name: "Simon",
hobby: "React"
};
var hobby = newObject.hobby,
var name = newObject.name;
Importaciones y Exportaciones
y export proveen un manejo más avanzado de módulos
import
en JavaScript. Es posible importar/exportar funciones,
objetos o valores primitivos. Existen 2 maneras de
hacerlo: nombradas y por defecto.
Clases
Las clases, creadas con la palabra clave class no son más que
funciones. En realidad, el principal objetivo de las clases es
cambiar un poco (o mucho), para bien o para mal,
la sintaxis existente de objetos, prototipos y
herencia.
Template literals
Son cadenas de texto que nos permiten:
• escribir en varias líneas.
const es6String = `
Hello world,
I'm a multiline
Template literal.
`;
Anteriormente:
var oldString = "\n Hello world,\n I'm a multiline\n
Template literal.\n";
En resumen
Al igual que con JSX, el uso de ES6 no es obligatorio al
momento de usar React. Pero poco a poco iremos viendo sus
beneficios. ES6 nos brinda un amplio repertorio de nuevas
funcionalidades y nuevas formas de hacer cosas con
JavaScript.
3. React API y ReactDOM
En los últimos post hablamos de JSX y de ES6, pero cuando
hice una promesa en “Y así empieza el 2018…”, dije que el
blog que crearía, sería sobre React. Y aunque estos temas
están directamente relacionados con React, creo que ha
llegado la hora de tocar el tema en cuestión. Ahora es el
momento en que empezamos a hablar de React.
Instalando React
Para trabajar con React tenemos dos opciones, usar
un CDN o si tenemos acceso a npm o yarn (gestores de
paquetes, que nos permiten manejar las dependencias de
nuestro proyecto) y conocimientos de ES6 básico, el cual
ahora tenemos, podemos importar el paquete de React
usando import React from 'react';. Este último será el método
que usaremos de ahora en adelante.
En resumen
Mientras React nos provee de métodos para crear los
elementos que se van a renderizar en nuestro HTML,
ReactDOM nos provee los métodos que nos permitirán
llegar a un punto donde se encontrará nuestro código con
nuestro HTML.
Componentes funcionales
Se les llama de esta manera porque son funciones de
JavaScript. Lo que las hace ser componentes de React, es
que reciben props o propiedades (argumento de la función) y
retorna JSX, o mejor dicho un elemento de React.
Un componente funcional se vería de la siguiente forma:
function Button() {
return <button className='add-button'
type='button'>+</button>
}
Componentes clase
Utilizan la sintaxis de class de ES6, teniendo en cuenta los
siguientes puntos:
Ejemplo
Para ver los componentes en acción, vamos a borrar el
contenido del archivo App.js y App.css y agregaremos nuestro
propio código.
Se pueden mejorar
¿Recuerdan que les pedí anteriormente borrar el contenido
del archivo App.css? Vamos a agregar los siguientes estilos
para que nuestros botones se vean un poco más bonitos ;)
(siéntanse libres de modificar los estilos).
.add-button {
padding: 10px 20px;
font-size: 20px;
color: #fff;
background-color: #4682b4;
border-color: #586D7F;
border-radius: 10px;
}.add-button:hover {
background-color: #63B8FF;
border-color: #63B8FF;
}.add-button {
outline: none;
}
En conclusión
Create React App es una herramienta que nos permite
empezar un proyecto desde cero, sin mayores
preocupaciones por la configuración del mismo (sin dejar de
lado la importancia de conocer esta ni la manera de hacerlo
por nosotros mismos).
Lo que haremos
1. Cambiaremos el contenido de los botones para que
uno muestre el signo ‘+’ y el otro el signo ‘-’, y cada uno
de los botones deberá mostrarse de un color diferente.
Esto sin tener que crear un nuevo componente.
2. Mostraremos un contador en pantalla.
3. Agregaremos funcionalidad a los botones para que nos
permita incrementar y disminuir el contador. No
usaremos los eventos de React, por ahora utilizaremos
eventos de JavaScript.
Props
Son las propiedades que se le pasan desde un componente
padre a un elemento hijo y solo el padre las puede modificar.
Estas propiedades son como los atributos HTML y
se configuran al momento de “instanciar” un
componente.
o
<h1 className='my-class'>Hello world</h1>
<h1 className='my-class' children='Hello world' />
Destructuring props
Podemos aprovecharnos de destructuring de ES6. Ya que
sabemos con certeza cuales van a ser las propiedades que
recibirá nuestro componente, podemos cambiar nuestro
código por alguna de las siguientes 2 opciones:
const Button = (props) => {
const { primary, className, children } = props; ...
}
o
const Button = ({ primary, className, children}) => {
...
}
componentDidMount() {
const increment = document.querySelector('.js-
increment');
const decrement = document.querySelector('.js-
decrement'); if(increment && decrement) {
increment.addEventListener('click',
this.onIncrementClick);
decrement.addEventListener('click',
this.onDecrementClick);
}
} onIncrementClick = () => {
this.setState({
counter: this.state.counter + 1,
});
} onDecrementClick = () => {
this.setState({
counter: this.state.counter - 1,
});
} render()
...
}
En resumen
Las propiedades o props son externas al componente, se
configuran y se modifican desde el padre, y nunca desde el
mismo componente.
Eventos sintéticos
En este caso event ese un evento sintético de React, en
React todos los manejadores de eventos son instancias
de SyntheticEvents. Los eventos sintéticos son
una envoltura de los eventos nativos del navegador, por lo
que estos eventos cuentan con la misma interfaz de los
eventos nativos, como por
ejemplo preventDefault() y stopPropagation(), con la ventaja de
que todos estos eventos funcionan idénticamente en la
mayoría de los navegadores.
Eventos disponibles
React incluye eventos de teclado como onKeyUp,
onKeyPress, onKeyDown; de mouse como onClick,
onMouseMove, onDragOut, onDrop, etc.; de formularios,
como onChange, onInput, onInvalid, onSubmit; y muchos
más eventos que puedes ver en React Docs.
Creando conexiones
Cuando invocamos una función como lo hicimos
anteriormente handleClick={this.onIncrementClick}, this,
normalmente, tendría un valor undefined, ya que las clases no
crean ninguna conexión (bind) por defecto.
this.onIncrementClick = this.onIncrementClick.bind(this);
} onIncrementClick() { ... } render() {
...
<Button
...
onIncrementClick={this.onIncrementClick}
>
} ...
}
En resumen
React tiene sus propios eventos, que cuentan con las
misma interfaz de los eventos nativos del navegador, con la
ventaja que los eventos de React tienen
un comportamiento compatible con la mayoría de los
navegadores.
• constructor():
este ciclo de vida se ejecuta cuando el
componente es instanciado. Acá podemos definir su
configuración inicial. Por ejemplo, configurar
el estado o crear conexiones con nuestras funciones.
constructor(props) {
super(props);
this.state = {
initialState: true,
}; this.method = this.method.bind(this);
}
• componentWillMount():
las modificaciones en este ciclo de
vida no causan actualizaciones en el componente, y se
corre justo antes de montar o renderizar el
componente. Por ejemplo, un cambio condicional en
el estado.
componentWillMount() {
let answer;
if(this.props.number % 3 === 0 && this.props.number % 5 ===
0) {
answer = 'fizzbuzz';
} else if(this.props.number % 3 === 0) {
answer = 'buzz';
} else if(this.props.number % 5 === 0) {
answer = 'fizz';
} else {
answer = this.props.number
}
this.setState({
answer: answer
});
}
• componentWillReceiveProps(nextProps):
el primer ciclo en la
etapa de actualización. Nos permite hacer cambios en el
componente basados en un cambio en las propiedades.
La razón por la que este método recibe el
parámetro nextProps, es para permitirnos validar el
cambio en las propiedades. nextProps debe ser diferente
a this.props.
componentWillReaceiveProps(nextProps) {
if(this.props.num1 !== nextProps.num1 || this.props.num2
!== nextProps.num2) {
this.setState({
sum: nextProps.num1 + nextProps.num2,
})
}
}
• componentWillUpdate(nextProps, nextState):
se ejecuta
cuando shouldComponentUpdate() retorna verdadero. Se
hacen los últimos cambios antes de renderizar
nuevamente el componente.
componentWillUpdate(nextProps, nextState) {
if(this.state.age !== nextStage.age) {
this.onGrow();
}
}
• componentDidUpdate(prevProps, prevState):
este es el último
método de esta etapa. El componente se ha renderizado
con los nuevos valores. Es perfecto para interactuar
con el DOM
componentDidUpdate(prevProps, prevState) {
this.createCard();
}
• componentWillUnmount():
su principal funcionalidad
es limpiar nuestro componente. Por ejemplo, dejar de
escuchar eventos o cancelar peticiones HTTP
pendientes.
componentWillUnmount() {
window.removeEventListener(anyEvent, anyEventHandler());
}
Conclusión
Entender los ciclos de vida de React es muy importante.
Estos nos permiten empoderarnos de los recursos de
nuestra aplicación.