React
  • ¡Bienvenidos! 👋
  • ¿Qué es React.js? 👀
  • Technology radar React.js 🧿
  • Conceptos principales
  • Ventajas ✔✔✔
  • Comparación de React con otros Framewors y librería 💥
  • Redux y React Hook 🤔
  • Referencias 📄
  • Ejercicio práctico
    • DOJO 💻
      • Organización del proyecto ☝
      • Creación de Store Redux para la aplicación ✌
      • Maquetación de la aplicación 👌
      • Implementación de React, Redux y React Hook 🤘
Con tecnología de GitBook
En esta página

¿Te fue útil?

  1. Ejercicio práctico
  2. DOJO 💻

Implementación de React, Redux y React Hook 🤘

Paso número 4.

Con la maquetación Finalizada podemos conectar la Store Redux creada y nuestra aplicación frontend. Para esto primero tenemos que decirle a React que nuestra aplicación tiene una Store para usar en ella, esto se hace "encerrando" la aplicación con la etiqueta Provider, el código debe quedar de la siguiente manera.

import React from 'react';
import './App.css';
import ActionPokemon from './components/ActionPokemon';
import CantPokemon from './components/CantPokemon';
import ResultPokemon from './components/searchBar/ResultPokemon';
import SearchBarPokemon from './components/searchBar/SearchBarPokemon';
import store from './redux/store';
import { Provider } from 'react-redux';

function App() {
  return (
    <Provider store={store}>
      <div className="App">
        <div className="row">
          <div className="col-12">
            <div className="card mt-5" style={{ maxWidth: '370px' }}>
              <div className="row no-gutters">
                <div className="col-4">
                  <img src={require("../src/img/pokemon.png")} alt="pokemon" className="card-img"></img>
                </div>
                <div className='col-8'>
                  <div className="card-body">
                    <div className="card-title h3 text-center">
                      <CantPokemon></CantPokemon>
                    </div>
                    <ActionPokemon></ActionPokemon>
                  </div>
                </div>
              </div>
            </div>
          </div>
          <div className="col-12 mt-4 border-top pt-3">
            <SearchBarPokemon></SearchBarPokemon>
          </div>
          <div className="col-12">
            <ResultPokemon></ResultPokemon>
          </div>
        </div>
      </div>
    </Provider>

  );
}

export default App;

La etiqueta Provider se encarga de decirle a React que todo dentro de esta etiqueta puede acceder al Store asignado.

Primero haremos que CantPokemon muestre la cantidad de pokemon que hay en el Store haciendo que el componente traiga el estado actual del Store y lo imprima en pantalla, el componente quedaria de la siguiente forma.

import React from 'react';
import { useSelector } from 'react-redux';

export default function CantPokemon() {
    const gameShop = useSelector((state) => state.games)
    return (
        <React.Fragment>
            Unidades : {gameShop.pokemon}
        </React.Fragment>
    )

}

el método useSelector() se encarga de obtener el estado actual de nuestra Store y asignarlo a una variable, en el código tomamos el estado y guardamos la propiedad games en la constante gameShop, la cual tendrá la cantidad de unidades disponible en la tienda. luego simplemente mostramos las unidades en la etiqueta.

Teniendo esto listo podemos hacer que nuestros componentes tengas los eventos para realizar la compra, devolución y búsqueda de pokemon. Primero haremos compra y devolución.

Asignaremos un onClick() a los botones en el componente ActionPokemon, el cual quedaría como el siguiente código.

//imports nesesarios
import React from 'react';
import { useDispatch } from 'react-redux';
import { BuyPokemonActions, ReturnPokemonActions } from '../redux/actions';

export default function ActionPokemon() {
    const dispatch = useDispatch()
    return (
        <div>
            <button className="btn btn-dark btn-sm mb-2" onClick={() => {
                dispatch(BuyPokemonActions(1));
            }}>Comprar Pokemon</button>

            <button className="btn btn-dark btn-sm " onClick={() => {
                dispatch(ReturnPokemonActions(1))
            }}>Devolver Pokemon</button>

        </div>
    )

}

La dispatch se inicializa con el método useDispatch() y este permite enviar la acción que deseamos que realice nuestro Reducer en el Store. por ello en la línea 10 se envía la acción BuyPokemonActions al dispatch cuando le damos click al botón comprar de esta forma, cada que le demos al botón comprar en el Store se restara uno a la cantidad actual de pokemon y se actualizara inmediatamente en la vista.

Para realizar el barra de búsqueda utilizaremos un Hook para guardar el valor del input para realizar la petición. esto se hacer con el método useState() que crea una variable estado y un método set para modificarla.

Teniendo la variable estado la asignamos a la etiqueta input con la propiedad "value" y creamos un método onChange() logrando que cada vez que el texto cambien en el input, la variable se actualice. y luego creamos un método onClick() en el botón enviar y hacemos que el Reducer efectué la acción fetchPokemon enviándole como valor el texto en la etiqueta input.

import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { fetchPokemonAction } from '../../redux/actions';

export default function SearchBarPokemon() {
    const dispatch = useDispatch()
    const [pokemonName, setPokemonName] = useState("Umbreon")
    return (
        <div className="form-group">
            <label htmlFor="buscarPokemon" className="text-white">Buscar Pokemon</label>
            <input type="text" className="form-control" id="buscarPokemon" value={pokemonName}
                onChange={(event) => {
                    setPokemonName(event.target.value)
                }}></input>
            <button className="btn btn-primary mt-3" onClick={() => {
                dispatch(fetchPokemonAction(pokemonName.toLowerCase()))
            }}>Enviar</button>
        </div>
    )

}

Con todas las acciones creadas e implementadas, procedemos a mostrar el resultado en el componente ResultPokemon. para ello solo tenemos que obtener el estado del Store y mostrar los datos que nos interesa, en este caso el nombre del pokemon y su artwork oficial.

Para mostrar las etiquetas de "Buscando", "Resultado" y "Error" React permite renderizar condicionalmente al encerrar la línea o bloque de código HTML y anteponer una condición booleana seguido de &&, como el siguiente código.

import React from 'react';
import { useSelector } from 'react-redux';

export default function ResultPokemon() {
    const seeker = useSelector(state => state.seeker)
    return (
        <div>
            <h3 className="text-white">Resultado: </h3>
            {seeker.loading && <div className="text-warning">Buscando...</div>}
            {seeker.pokemon.length >= 1 && <div className="text-success">
                <img src={seeker.pokemon[0].sprites.other["official-artwork"].front_default} alt={seeker.pokemon[0].name} />
            </div>}
            {seeker.error !== '' && <span className="text-danger">{seeker.error}</span>}
        </div>
    )
}

Como se puede ver. el div de la línea 9 solo se mostrara cuando seeker.loading sea igual a "TRUE".

Listo con esto solo queda iniciar la aplicación y probarla.

AnteriorMaquetación de la aplicación 👌

Última actualización hace 4 años

¿Te fue útil?

¡¡¡Felicitaciones, has completado el dojo !!

🥳