Curso de React | Hook useState en React

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Cuando actualizamos una variable state, automáticamente, en caso de ser necesario, el código html vinculado a esa variable es actualizado.

La diferencia entre un estado de React y una variable normal es que cuando un estado cambia, el componente es renderizado de nuevo y se ejecutarán los useEffect vinculados a ese estado, pero cuando cambia una variable normal, esto no ocurre.

Por otro lado, el ciclo de vida de una variable normal acaba en cada render, ya que se vuelve a generar otra. En el caso de un esto, su valor es conservado a través de los sucesivos renders.

Los hooks (useState y useEffect)fueron introducidos en la versión 16.8 de react. Por tanto, para utilizarlos, deberemos tener al menos esta versión en el package.json

  "dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",

Modificar un estado

Cuando queremos modificar un estado, utilizaremos el segundo parámetro que devuelve la función useState, que al ejecutarla nos guardará el parámetro que le pasemos como nuevo valor del estado.

import {useState} from 'react';

const MyCounter = () =>{
  const [contador, setContador] = useState(0); 
 
  const incrementarContador = () => setContador(contador + 1)
 
  return <button onClick={incrementarContador}>{contador}</button>
}

export default MyCounter;

Ejercicios useState y useRef

Ahora modificaremos los ejercicios que vimos en la sección de useRef para utilizar useState a la hora de mostrar el resultado. Seguiremos utilizando useRef para la recogida de valores.

1. Euros a dólares

Hay que realizar un conversor de euros a dólares. Supondremos que un euro son dos dólares. El usuario introducirá un valor en euros y se mostrará un mensaje en pantalla con el correspondiente valor en dólares.

2. Grados centígrados

Hay que realizar un conversor de grados Centígrados a grados Fahrenheit.

Para ello deberé multiplicar por 9/5 y sumar 32. Como todo el mundo sabe, 20 grados centígrados son 68 grados Farenheit.

Con useState también podemos recoger un valor del usuario

Si queremos recoger un valor introducido por el usuario, también usaremos useState. No obstante, es posible hacer esto utilizando el método useRef, pero dado que este no funciona en ReactNative, no lo vamos a ver.

import { useState } from 'react';

const App = () => {
  const [inputText, setInputText ] = useState('');

    return (
      <div>
        <input type="text" onChange={e => setInputText(e.target.value)} />
        <div>{ inputText }</div>
      </div>
    );
}

export default App;

En el caso de que quisieramos saber si una checkbox está marcada o no, usaríamos la propiedad checked:

<input type="checkbox" onclick={e=> setEstaMarcado(e.target.checked)}/>

Ejercicios únicamente usando useState

Ahora modificaremos los ejercicios que vimos en la sección de useRef para utilizar useState en su lugar.

La solución debe ir imprimendose a medida que vamos introduciendo los datos, sin que sea necesario pulsar ningún botón de «calcular».

1. Euros a dólares

Hay que realizar un conversor de euros a dólares. Supondremos que un euro son dos dólares. El usuario introducirá un valor en euros y se mostrará un mensaje en pantalla con el correspondiente valor en dólares.

Ver ejercicio terminado

2. Grados centígrados

Hay que realizar un conversor de grados Centígrados a grados Fahrenheit.

Para ello deberé multiplicar por 9/5 y sumar 32. Como todo el mundo sabe, 20 grados centígrados son 68 grados Farenheit.

Ver ejercicio terminado

Cambiar valor al hacer click en un botón, en lugar de cuando cambia el input

import { useState } from 'react';

const App = () => {
    const [inputText, setInputText] = useState('');
    const [valorAMostrar, setValorAMostrar] = useState(0);

    return (
        <div>
            <input type="text" onChange={e=> setInputText(e.target.value)} />
            <button onClick={() => setValorAMostrar(inputText)}>Cambiar valor</button>
            <div>{valorAMostrar}</div>
        </div>
    );
}

export default App;
Ver ejercicio terminado Descargar código

3. Calcular la superficie de un rectángulo

Tendremos un formulario que recogerá el ancho y el alto de un rectángulo y calculará su superficie.

Ver ejercicio terminado

4. Cambia imagen

Desarrollar la siguiente aplicación. Al pulsar sobre cada uno de los botones, debe cargarse la imagen correspondiente a una de las propiedades del siguiente objeto:

const ANIMAL_IMAGES = {
  img1: "http://via.placeholder.com/111x111",
  img2: "http://via.placeholder.com/222x222",
  img3: "http://via.placeholder.com/333x333",
};
ejercicio imagenes con react
Ver ejercicio terminado

Problema al usar estados con setInterval y setTimeout

La siguiente función:

setInterval( () => setSeconds(seconds +1), 1000);

Debería actualizar el estado seconds incrementándole una unidad a cada segundo. Sin embargo esto no ocurre debido a que la función que recibe como parámetro setInterval es almacenada en memoria y no se va a actualizar (siempre se llamará exáctamente al mismo código y seconds siempre valdrá lo mismo).

Para subsanar este problema, cambiaremos la función anterior por:

setInterval(() => setSeconds(seconds => seconds + 1), 1000);

Otro ejemplo:

Cuando actualizamos un estado utilizando la función setTimeout de Javascript:

const [stateValue, setStateValue] = useState(0);

const recursiveFunction = () => {
    setTimeout(() => {
        setStateValue(stateValue + 1);
        console.log(stateValue);
        recursiveFunction();
    }, 1000);
}

Tendremos un problema. Y es que al hacer el log, veremos que el valor de stateValue no cambia.

Para resolver este problema tenemos dos opciones:

1. Una sería pasarle una función al método setStateValue cuyo primer parámetro será el valor actual del estado. Dentro de esa función, stateValue tendrá el valor correcto.

const recursiveFunction = () => {
    setTimeout(() => {
        setStateValue(stateValue => {
            //Aquí vendría el código que utiliza stateValue
            return stateValue + 1;
        });
        recursiveFunction();
    }, 1000);
}

2. La otra forma, sería utilizando useEffect (el useEffect lo veremos más adelante en este curso):

const recursiveFunction = () => {
    setTimeout(() => {
        setStateValue(stateValue => stateValue+1);
        recursiveFunction();
    }, 1000);
}

useEffect(() => {
    //Aquí vendría el código que utiliza stateValue
}, [stateValue]);

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.