Inicio ReactJS - parte 2
Post
Cancel

ReactJS - parte 2

Manejando eventos

  • eventos
  • Los eventos de React se nombran usando camelCase, en vez de minúsculas.
  • Con JSX pasas una función como el manejador del evento, en vez de un string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const MiBoton = ({ text, className }) => {
  const handleClick = (text) => {
    console.log("Haz dado click al " + text );
  };

  return (
    <button onClick={() => handleClick(text)} className={className}>
      {text}
    </button>
  );
};

MiBoton.propTypes = {
  text: PropTypes.string.isRequired,
  className: PropTypes.string.isRequired,
};

Componentes (modularizar)

  • components
  • Los componentes permiten separar la interfaz de usuario en piezas independientes, reutilizables y pensar en cada pieza de forma aislada.

Crear en carpeta src una carpeta llamada components donde se colocaran todos los componentes

components/MiBoton.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import PropTypes from "prop-types";

const MiBoton = ({ text, className }) => {
    const handleClick = (text) => {
        console.log("Haz dado click al " + text);
    };

    return (
        <button onClick={() => handleClick(text)} className={className}>
            {text}
        </button>
    );
};

MiBoton.propTypes = {
    text: PropTypes.string.isRequired,
    className: PropTypes.string.isRequired,
};

export default MiBoton;

components/MensajeOnline.jsx

1
2
3
4
5
6
const MensajeOnline = () => {
    return <h3>Bienvenido usuario</h3>;
};

export default MensajeOnline;

components/MensajeOffline.jsx

1
2
3
4
5
6
const MensajeOffline = () => {
    return <h3>Usuario desconectado</h3>;
};

export default MensajeOffline;

components/UserMensaje.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import PropTypes from 'prop-types';
import MensajeOnline from './MensajeOnline';
import MensajeOffline from './MensajeOffline';

const UserMensaje = ({ usuario }) => {
    return usuario ? <MensajeOnline /> : <MensajeOffline />;
    //return <h3> { usuario ? ( "Bienvenido usuario" ) : ( "Usuario desconectado" ) } </h3>
};

UserMensaje.propTypes = {
    usuario: PropTypes.bool.isRequired,
};

export default UserMensaje;

components/ListaFrutas.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import PropTypes from 'prop-types';

const ListaFrutas = ({ frutas }) => {
    //const frutas = ["🍉", "🍌", "🍎"];

    return (
        <ul>
            {frutas.map((fruta, index) => {
                return (
                    <li key={index}>
                        {" "}
                        {index} - {fruta}
                    </li>
                );
            })}
        </ul>
    );
}

ListaFrutas.propTypes = {
    frutas: PropTypes.array.isRequired,
};

export default ListaFrutas;

App.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import MiBoton from "./components/MiBoton";
import UserMensaje from "./components/UserMensaje";
import ListaFrutas from "./components/ListaFrutas";

const App = () => {
  const titulo = "Mi primer proyecto con React.JS";
  const subtitulo = "Lorem ipsum dolor sit amet consectetur adipisicing elit";
  const imagen = "https://picsum.photos/600/400";
  const logo = "./src/assets/react.svg";
  const clases = {
    titulo: "text-info text-center",
    subtitulo: "text-info text-center",
    imagenCenter: "rounded d-block mx-auto",
  };
  const user = true;

  const frutas = ["🍉", "🍌", "🍎"];
  const frutas2 = ["🍐", "🍑", "🍓"];

  return (
    <div className="container">
      <h1 className={clases.titulo}>{titulo}</h1>
      <p className={clases.subtitulo}>{subtitulo}</p>
      <img className={clases.imagenCenter} src={logo} />
      <hr></hr>
      <img
        className={clases.imagenCenter}
        src={imagen}
        alt={`imagen-${titulo}`}
      />
      <hr></hr>
      <UserMensaje usuario={user} />
      <hr></hr>
      <MiBoton text="Boton 1" className="btn btn-light m-3" />
      <MiBoton text="Boton 2" className="btn btn-danger m-3" />
      <MiBoton text="Boton 3" className="btn btn-warning m-3" />
      <MiBoton text="Boton 4" className="btn btn-success m-3" />
      <hr></hr>
      <ListaFrutas frutas={frutas}/>
      <ListaFrutas frutas={frutas2}/>
    </div>
  );
};

export default App;

Fragmentos:
fragment: Un patrón común en React es que un componente devuelva múltiples elementos. Los Fragmentos te permiten agrupar una lista de hijos sin agregar nodos extra al DOM.

App.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import MiBoton from "./components/MiBoton";
import UserMensaje from "./components/UserMensaje";
import ListaFrutas from "./components/ListaFrutas";
import React from "react";

const App = () => {
  const titulo = "Mi primer proyecto con React.JS";
  const subtitulo = "Lorem ipsum dolor sit amet consectetur adipisicing elit";
  const imagen = "https://picsum.photos/600/400";
  const logo = "./src/assets/react.svg";
  const clases = {
    titulo: "text-info text-center",
    subtitulo: "text-info text-center",
    imagenCenter: "rounded d-block mx-auto",
  };
  const user = true;

  const frutas = ["🍉", "🍌", "🍎"];
  const frutas2 = ["🍐", "🍑", "🍓"];

  return (
    <React.Fragment>
      <h1 className={clases.titulo}>{titulo}</h1>
      <p className={clases.subtitulo}>{subtitulo}</p>
      <img className={clases.imagenCenter} src={logo} />
      <hr></hr>
      <img
        className={clases.imagenCenter}
        src={imagen}
        alt={`imagen-${titulo}`}
      />
      <hr></hr>
      <UserMensaje usuario={user} />
      <hr></hr>
      <MiBoton text="Boton 1" className="btn btn-light m-3" />
      <MiBoton text="Boton 2" className="btn btn-danger m-3" />
      <MiBoton text="Boton 3" className="btn btn-warning m-3" />
      <MiBoton text="Boton 4" className="btn btn-success m-3" />
      <hr></hr>
      <ListaFrutas frutas={frutas}/>
      <ListaFrutas frutas={frutas2}/>
    </React.Fragment>
  );
};

export default App;

Estado

  • El estado le permite a los componentes de React cambiar su salida a lo largo del tiempo en respuesta a acciones del usuario, respuestas de red y cualquier otra cosa.
  • state
  • Nada le indica a React que tenemos que volver a renderizar para pintar nuevamente button.
  • Para hacer cambios vamos a utilizar un hook.

components/BotonState.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const BotonState = () => {
    let contador = 0;

    const handleClick = () => {
        contador = contador + 1;
        console.log("Contador: " + contador);
    };

    return (
        <div className="text-center">
            <button onClick={handleClick} className="btn btn-info">Contador: {contador}</button>
        </div>
    );
};

export default BotonState;

Hooks

  • hooks
  • Los Hooks son funciones que te permiten “enganchar” el estado de React y el ciclo de vida desde componentes de función.
  • Los hooks no funcionan dentro de las clases — te permiten usar React sin clases.
  • React proporciona algunos Hooks incorporados como useState.
  • También puedes crear tus propios Hooks para reutilizar el comportamiento con estado entre diferentes componentes.

useState

¿Qué hace la llamada a useState?

  • Declara una “variable de estado”.
  • useState es una nueva forma de usar exactamente las mismas funciones que this.state nos da en una clase.
  • Normalmente, las variables “desaparecen” cuando se sale de la función, pero las variables de estado son conservadas por React.

¿Qué pasamos a useState como argumento?

  • El único argumento para el Hook useState() es el estado inicial.

¿Qué devuelve useState?

  • Devuelve una pareja de valores (array): el estado actual y una función que lo actualiza.

components/BotonState.jsx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { useState } from "react";

const BotonState = () => {
    const [contador, setContador] = useState(0);

    const handleClick = () => {
        setContador(contador + 1);
        console.log("Contador: " + contador);
    };

    return (
        <div className="text-center">
            <button onClick={handleClick} className="btn btn-info">Contador: {contador}</button>
        </div>
    );
};

export default BotonState;

Resumen:

  • Declaramos una variable de estado llamada contador y le asignamos a 0.
  • React recordará su valor actual entre re-renderizados, y devolverá el valor más reciente a nuestra función.
  • Si se quiere actualizar el valor de contador actual, podemos llamar a setContador.
  • Cuando el usuario hace click, llamamos a setContador con un nuevo valor. React actualizará entonces el componente Contador pasándole el nuevo valor de contador.
  • Nota los corchetes son intaxis de Javascript, se llama “desestructuración de arrays”.
This post is licensed under CC BY 4.0 by the author.