Vamos a crear una insignia para premiar a los usuarios que hayan recibido más de 5 votos. Nos burlaríamos de los datos JSON localmente y le daríamos a cada usuario que tenga más de five-votes
una insignia usando reaccionar y redux para consumir los datos.
En un proyecto en blanco Create React App, cree un archivo JSON local llamado data.json
dentro del directorio público.
Sus llamadas a la API Fetch realizadas desde un componente React siempre buscan archivos o cualquier otro activo relevante dentro de este directorio público. Create-React-App
no coloca sus activos automáticamente dentro de este directorio durante la compilación, por lo que debe hacerlo manualmente.
[ { "id": 1, "name": "Daniel", "email": "[email protected]", "post": "I love football", "votes": 5 } ]
npm i -s react-redux redux axios redux-thunk or yarn add react-redux redux axios
Además, instalaríamos fontaweasome
, donde importaríamos iconos a modo de insignia.
npm i --save @fortawesome/fontawesome-svg-core npm install --save @fortawesome/free-solid-svg-icons npm install --save @fortawesome/react-fontawesome
o yarn add @fortawesome/fontawesome-svg-core yarn add @fortawesome/free-solid-svg-icons yarn add @fortawesome/react-fontawesome
En el directorio src/ hagamos 6 archivos
const USER = { LOAD: "REQUEST_USERS_DATA", LOAD_SUCCESS: "RECEIVE_USERS_DATA", }; export default USER;
import USER from "./constants"; const initalState = { usersData: [], isLoading: false, isError: false, }; const reducer = (state = initalState, action) => { switch (action.type) { case USER.LOAD: return { ...state, isLoading: true, isError: false, }; case USER.LOAD_SUCCESS: return { ...state, usersData: action.usersData, isLoading: false, }; default: return state; } }; export default reducer;
import axios from "axios"; import USER from "./constants"; export const requestUsers = (data) => async (dispatch) => { dispatch({ type: USER.LOAD, }); try { const json = await axios.get("data.json"); console.log(json); dispatch({ type: USER.LOAD_SUCCESS, usersData: json.data, isError: false, }); } catch (e) { dispatch({ type: USER.LOAD_SUCCESS, usersData: [], isError: true, }); } };
En el archivo de índice, importaríamos fontawesome
para que cualquier componente pudiera heredar de él.
import React from "react"; import ReactDOM from "react-dom"; import App from "./App"; import { store } from "./store"; import { Provider } from "react-redux"; import "./fontAwesome"; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById("root") );
import { library } from "@fortawesome/fontawesome-svg-core"; import { faGithubAlt, faGoogle, faFacebook, faTwitter, faJediOrder, } from "@fortawesome/free-brands-svg-icons"; library.add(faGithubAlt, faGoogle, faFacebook, faTwitter, faJediOrder);
import thunkMiddleware from "redux-thunk"; import { createStore, applyMiddleware } from "redux"; import reducer from "./reducer"; export const store = createStore(reducer, applyMiddleware(thunkMiddleware));
[ { "id": 1, "name": "Daniel", "email": "[email protected]", "post": "I love football", "votes": 5 } ]
Importamos los siguientes ganchos de react-redux: useSelector
y useDispatch
.
useSelector
es una función que toma el estado actual como argumento y devuelve los datos que desea de él y le permite almacenar los valores devueltos dentro de una variable dentro del alcance de sus componentes funcionales en lugar de pasarlos como accesorios.
useDispatch
es equivalente a mapDispatchToProps
. useDispatch
y lo almacenaremos en una variable, dispatch. Este enlace devuelve una referencia a la función de despacho de la tienda Redux.
import React, { useEffect } from "react"; import { useSelector, useDispatch } from "react-redux"; import { requestUsers } from "./action"; import data from "./data.json"; import "./App.css"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; const App = () => { const { usersData, isLoading } = useSelector((state) => state); const dispatch = useDispatch(); useEffect(() => { dispatch(requestUsers(data)); }, []); return ( <> {isLoading && <div className="loading">Data loading...</div>} {usersData.map((user) => { return ( <div key={user.id} className="container"> <div className="content"> <h1>{user.name}</h1> <span>{user.email}</span> <h3>{user.post}</h3> Votes: {user.votes} {user.votes >= 5 ? ( <div> <FontAwesomeIcon icon={["fab", "jedi-order"]} size="3x" /> </div> ) : ( <p>Get up to five votes to have a badge</p> )} </div> </div> ); })} </> ); }; export default App;
Redux es un contenedor de estado predecible para javascript.
¡Feliz codificación!