https://cursos.devtalles.com/courses/take/react-cero-experto
Mis notas personales del Curso de React: De cero a experto (Hooks y MERN) brindado por Fernando Herrera.
- devTalles - Curso de React: De cero a experto (Hooks y MERN)
- Descripción
- Tabla de contenidos
- Secciones
- Sección 1: Introducción
- Sección 2: Introducción a React y conceptos generales
- Sección 3: Introducción a JavaScript moderno
- Sección 4: Primeros pasos en React
- Sección 5: Pruebas unitarias y de integración - Probando las secciones anteriores
- Sección 6: GifExpertApp - Aplicación
- Sección 7: Generando el build de producción y despliegues
- Sección 8: Testing - Probando la aplicación de GifExpert
- Sección 9: Profundizando Hooks - Generales
- Sección 10: Profundizando Hooks - useReducer
- Sección 11: Profundizando Hooks - useContext
- Sección 12: Pruebas unitarias y de integración - Hooks
- Sección 13: Bonus: Repositorio de Custom Hooks
- Sección 14: HeroesApp - Single Page Application (SPA)
- Sección 15: Protección de rutas
- Sección 16: Pruebas de nuestra aplicación de Héroes
- Sección 17: JournalApp - MaterialUI - Estructura y Diseño
- Sección 18: Redux - ¿Qué es y conceptos? + React Redux
- VSCode plugins
- Atajos del teclado (MacOSx) con vscode
- Constantes y variables Let
- Template String
- Objetos literales
- Arreglos
- Funciones
- Desestructruación de objetos
- Desestructuración de arreglos
- Import, export y funciones comunes de arreglos
- Promesas
- Fetch API
- Async - await
- Operador condicional ternario
- Código fuente en GitHub
- .map()
- .find()
- .filter()
- .forEach()
- .reduce()
- Desestructuración
- Promise()
- Giphy API
- Fetch API
- Console.functions
- Babel
- Create-react-app
- Chrome: console.log, console.debug are not working
Instalar React
usando yarn + vite:
brew install yarn
yarn create vite
cd <app-name>
yarn install
yarn dev
Instalar React
usando create-react-app (CRA):
npx create-react-app <app-name>
cd <app-name>
npm install
npm run dev
Para cambiar de npm
a yarn
o viceversa, es suficiente con borrar la carpeta jarn.lock
o package-lock.json
y ejecutar nuevamente npm install
o yarn install
, pero esto no se recomienda.
El archivo package-lock.json
solo se crea con cra, es decir, con una aplicación creada con vite no aparece este archivo.
Single Page Application (SPA): Tipo de aplicación que se crea por defecto con create-react-app en React. Más información.
Vite fue creado por Evan You, el mismo creador de vueJS.
- Primera aplicación de React
- Estructura de directorios: CRA vs Vite
- Hola Mundo en React
- Nuestro primer Componente. Nota: sí aparece un error de "function export don't declare", agregar en el contenido del componente creado al final
export default HelloWorldApp
- Tarea - Crear un nuevo componente
- Retornar elementos en el Componente - Fragment
- Impresión de variables en el HTML
- Colocar estilos de CSS
- Comunicación entre componentes Props
- PropTypes En
CRA
aparece instalado por defecto pero envite
hay que instalarlo:import PropTypes from 'prop-types'
para importar en los componentes y desde terminalyarn add prop-types
- Tarea - Componente CounterApp
- Crear un nuevo componente dentro de la carpeta SRC llamado
CounterApp
- El CounterApp debe de ser un Functional Component
- El contenido del CounterApp debe de ser:
<h1>CounterApp</h1> <h2> { value } </h2>
- Donde
"value"
es una propiedad enviada desde el padre hacia el componente CounterApp (Debe ser númerica validada con PropTypes) - Reemplazar en el index.js ó main.jsx el componente de
<PrimeraApp />
por el componente<CounterApp />
(no se olviden del value que debe de ser un número) - Asegúrense de no tener errores ni warnings (Cualquier warning no usado, comentar el código)
- Evento click (Eventos en general)
- useState - Hook
- handleSubtract y jandleReset
- Código fuente de la clase
- Vite
- Create React App (CRA)
- CRA - Available Scripts
- Learn Progresive Web App (PWA)
- Robots.txt
- Error: no se muestran los warning en DevTools
- Presentando Hooks
- SyntheticEvent
- Ejemplo - Tarea de desestructuración de arreglos
_AAA_: Arrange - arreglar, Act - Actuar , Assert - Afirmar
_Partes de las pruebas_: 1. Inicialización, 2. Estímulo (lo que se aplica al sujeto de las pruebas), 3. Las aserciones (observar el comportamiento esperado)
_en caso de ver el error "You appear to be using a native ECMAScript module configuration file, which is only supported when running Babel asynchronously.": Cambiar extensión de los archivos jest.config.js y babel.config.js a .cjs_
- Mi primera prueba y configuraciones iniciales con
yarn
:
yarn add --dev jest
yarn add -D @types/jest
yarn add --dev babel-jest @babel/core @babel/preset-env
yarn add -D whatwg-fetch
yarn add --dev @testing-library/react
yarn add -D jest-environment-jsdom
yarn add -D @babel/preset-react
Con npm
sería:
npm install -save-dev jest
npm install -D @types/jest
npm install --save-dev babel-jest @babel/core @babel/preset-env
npm install -D whatwg-fetch
npm install --dev @testing-library/react
npm install -D jest-environment-jsdom
npm install -D @babel/preset-react
Agregar al archivo package.json: "test": "jest --watch All" en la sección de scripts:
"scripts": {
"test": "jest --watch All"
}
Archivos de configuración babel.config.cjs, jest.config.js y jest.setup.js. Con esto ya debe de estar bien configurado vite
para hacer testing usando jest
y testing-library
.
React Testing Library es muy bueno para trabajar con el Dom, simular clics... y es mejor para ello que Jest (que está más orientada a las aserciones, mocks... ). Ambas pueden funcionar juntas para los tests.
- Sí Error: ReferenceError: module is not defined in ES module scope
This file is being treated as an ES module because it has a '.js' file extension and '...' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
Cambiar contenido de `jest.config.js`
```
module.exports = {
testEnvironment: 'jest-environment-jsdom',
setupFiles: ['./jest.setup.js']
}
```
por
```
export default {
testEnvironment: 'jest-environment-jsdom',
setupFiles: ['./jest.setup.js']
}
```
- Sí aparece `describe` y/o `test` como no definidos en vscode, agregar las siguiente línea en el archivo .`eslintrc` :
"env": {
"jest": true
}
- Jest - Expect - toBe
- Pruebas en el archivo 02-template-strings.js
- toEqual
- Pruebas en 08-imp-exp.js - Arreglos
- Pruebas en el archivo 07-deses.arr.js
- Pruebas con tareas asíncronas
- Pruebas con async-await
- Pruebas en FirstApp - Componentes de React
- Probar FirstApp (toMatchSnapshot)
- getByTestId y otras props
- Screen - Testing Library
- Pruebas básicas del CounterApp
- Simular eventos - Click
- Código fuente de la sección
- Jest - Documentación oficial
- heroes.js - Gist
- Giphy API - Developers
- https://jestjs.io/docs/getting-started
- https://testing-library.com/
Deploy de GifExpertApp en GitHub Pages y netlify.
- Inicio de proyecto - GifExpertApp
- Creando una lista de categorias
- Agregar una nueva categoría
- Componente AddCategory
- Comunicación entre componentes
- Emitir un evento al padre
- Validar que sean únicos los nombres
- GifGrid - Nuevo componente
- Fetch API - Obtener las imágenes deseadas
- useEffect
- Demostración de producción (usando http-server):
brew install http-server
yarn build
cd dist
http-server -o
- Mostrar los títulos de las imágenes
- className - Clases de css
- Custom Hook - useFetchGifs
- Mostrar mensaje de carga
- Archivos de barril - index.js
- Código fuente de la sección
- Giphy API - Developers
- Reactjs.org - Estructura de directorios
- Estructura, nombres de folders y componentes en React - Hackernoon.com
- Estilos GifExpertApp
- Giphy Developers - Search Endpoint
- https://reactjs.org/docs/strict-mode.html
- http-server
- React-Router issue when deployed to Github Pages?
- Comandos útiles de git
// Crear respositorio
git init
// Agregar todos los archivos al repo para actualización
git add .
// Realizar commit
git commit -m "First commit"
// Restaurar repo a como estaba en el último commit
git checkout -- .
// Agregar un repositorio externo a donde actualizar en remoto
git remote add origin <git url>
// Cambiar el nombre de la rama y cambiarse a ella
git branch -M main
// Actualizar repositorio remoto
// La primera vez que se hace el push se piden las credenciales de git para acceder
git push -u origin main
- Actualizar código para ser usado en Github Pages
Cambiar en dist/index.html
o docs/index.html
la ruta a los archivos .css y .js a relativa para que se despligue bien en github pages, es decir, de src="/..."
a src="./..."
. Ejemplo de cambios en index.html
Un Mock
es una simulación de una función y se usa para capturar eventos, parámetros...
- Instalación y configuracion de Jest + React Testing Library. Información local aquí. Para que no me de error, tengo que cambiar el nombre del archivo
babel.config.js
porbabel.config.cjs
y configurarjest.config.js
como:
export default {
testEnvironment: 'jest-environment-jsdom',
setupFiles: ['./jest.setup.js'],
}
- Resolución de Tarea implementando PropTypes y Snapshot
- Pruebas del componente - GifGridItem
- Pruebas en el helper getGifs
- Pruebas del componente - AddCategory y simular un submit del formulario
- Jest Functions
- Pruebas del componente GifGrid - Mock customHook
- Hacer un mock completo de un Custom Hook
- Pruebas sobre customHooks
- Pruebas de tarea de test con GifExpertApp componente
- Código fuente de la sección
const { a, b } = false // a = undefined, b = undefined
null // null
!null // true
!!null // false
undefined // undefined
!undefined // true
!!undefined // false
!!data && data // true and data (devuelve el valor de data sí data no es undefined o null)
const { a, b, ...rest } = !!data && data // desestructuración para asignar el valor a las variables a partir de data sí tiene un valor
- useState
- useCounter - CustomHook
- Exponer métodos del Hook
- useEffect - SimpleForm
- Dependencias del useEffect
- useEffect unmount - Cleanup
- useEffect - Precauciones
- Formulario con custom Hook
- Tarea - Implementar funcionalidad de Reset
- useFetch - CustomHook
- useFetch + useCounter
- Conectando ambos Hooks
- Optimizaciones al código anterior
- useRef - Primer uso
- useLayoutEffect - Deploy
- Memo - Método de React
- useMemo - Deploy
- useCallback
- useCallback con argumentos
- Tarea Memorize - Deploy
- Código fuente de la sección 9
- getBootstrap.com - Sitio oficial
- react-hook-form
- rickandmortyapi.com - API
- useLayoutEffect - React docs
- Breaking Bad Quotes API
- Deploy Example TodoList
- Idea general de un reducer - Vía código
- useReducer - Todo List
- Creando el cascarón de la lista de TODOs
- Tarea: Crear componentes y emitir eventos
- Resolución de la tarea - TodoApp
- Agregar un nuevo TODO
- Guardar y Leer TODOs en LocalStorage
- Borrar un TODO
- Toggle Todo - Marcar como completado o pendiente un TODO
- Tarea - useTodo
- Resolución de la tarea - useTodos - Deploy
- Código fuente de GitHub - Fin sección 10
- Preparación de nuestra aplicación con rutas
Install react-router-dom 6:
yarn add react-router-dom@6
- Preparación de nuestra aplicación con rutas (react-router-dom)
- Configurar Router en React
- Link
- NavLink
- CreateContext y ContextProvider
- useContext
- Código fuente Github- Fin sección 11
- Inicio de proyecto - Pruebas sobre Hooks
- Pruebas sobre useCounter - CustomHook
- Ejecutar funciones del customHook dentro de las pruebas
- Pruebas sobre useForm - CustomHook
- Pruebas con múltipes hooks simultáneos
- Evaluar respuesta del useFetch
- Pruebas sobre el Reducer
- Resolución de la tarea
- Pruebas en el componente TodoItem
- Pruebas en los eventos del TodoItem
- Pruebas en el TodoApp
- Pruebas con useContext
- Pruebas de funciones del context
- Pruebas generales en nuestro AppRouter
- Código GitHub: Fin sección 12
Installation:
// react router v.6
yarn add react-router-dom@6
// query-string to handle url params
yarn add query-string
- Inicio del proyecto - HeroesApp
- Colocar clase de la ruta activa
- Creando un segundo Router
- Navigate push/replace - useNavigate
- Lista de Heroes
- Tarjetas con la información del Héroe
- Tarjeta del Héroe - parte 2
- Leer argumentos por URL
- Estilo del componente HeroScreen
- Nota: useMemo
- Animaciones en nuestro componente
- Diseño de la pantalla de búsqueda
- SearchComponent
- Mostrar listado de héroes
- Mostrar mensajes condicionales
- Nota de actualización - Error imágenes producción
- Código fuente Github - Fin sección 14
- heroes.zip
- Gist - Navbar
- React Router - Docs
- https://reactrouter.com/ - Versión 6
- Migrar de React Router v5 a v6
- HeroesList - Data
- animate.css
- https://github.com/Klerith/custom-hooks/blob/main/useForm/useForm.js
- Assets y su manejo por vite en producción y desarrollo
Sobre el manejo de las imágenes (assets) por parte de Vite
Si quieren hacer el build de la app para hacer el deploy, si se fijan verán que los assets con las imágenes no se copian automáticamente a la carpeta dist con el build de producción.Esto es debido a Vite y como estamos creando las URL's de las imágenes en HeroCard.jsx.
Si importamos directamente una imagen con import imgUrl from '/assets/heroes/marvel-spider.jpg', Vite se encargará de gestionarlo y añadirá el archivo al build de producción, pero nosotros estamos creando la URL con const heroImageUrl = /assets/heroes/${ id }.jpg
;, de ahí que Vite no las copie automáticamente.
La solución sería crear una carpeta llamada public en la raíz del proyecto (al mismo nivel que package.json o index.html) y dentro de esta carpeta mover la carpeta heroes que contiene todas las imágenes.
De esta forma ya añadimos la carpeta heroes al build de producción.
Para acceder a "public" tenemos que usar la ruta raíz /, por lo que ahora modificaremos la URL de heroImageUrl en el archivo HeroCard.jsx quedando: const heroImageUrl = /heroes/${ id }.jpg
;.
De esta forma ya se copian automáticamente las imágenes, y funciona nuestra app tanto en desarrollo como producción.
Si quieren leer más sobre los assets y cómo manejarlos en Vite: https://vitejs.dev/guide/assets.html.
- Context y Reducer de mi aplicación
- Login de un usuario
- Mantener el usuario activo
- Logout del usuario
- Rutas privadas
- Rutas públicas
- Recordar la última página visitada
- Código fuente GitHub - Fin sección 15
- Inicio de la sección - Pruebas en HeroApp
- Pruebas en el authReducer
- Pruebas sobre los Types
- Pruebas en el PublicRoute
- Pruebas en el PrivateRoute
- Pruebas en el AppRouter
- Pruebas en el NavBar
- Pruebas en el SearchScreen
- Código fuente de GitHub - Fin sección 16
yarn add @mui/material @emotion/react @emotion/styled
yarn add @mui/icons-material
- Inicio de proyecto - JournalApp
- Configuración de Rutas principales y secundarias
- Instalación de Material UI
- Configuración de MUI con Vite
- LoginPage - Diseño sin Layout
- AuthLayout
- RegisterPage - Diseño
- JournalLayout y JournalPage
- NavBar
- SideBar
- NothingSelectedView - No hay nada seleccionado
- NoteView
- ImageList - Galería de imágenes
- Boton Flotante
- Código fuente en GitHub - Fin sección 17
Instalar redux toolkit y react-redux:
yarn add @reduxjs/toolkit react-redux
Instalar axios:
yarn add axios
Thunks: acción que es asíncrona que dispara otra acción.
RTK Query: está hecho para optimizar y controlar las peticiónes http (como lo hace sqlquery, axios, fetch) pero usa caché interno que mejora mucho el rendimiento de la aplicación. Viene ya incluído en Redux Toolkit.
- Inicio del proyecto - Redux-Tool
- ConfigureStore y Slices
- Usar valores del store y despachar acciones
- Tarea - decrement e incrementBy
- Snippet y Gists de Slice
- pokemonSlice
- Thunks
- Axios
- Mostrar los pokemons paginadamente
- RTK Query
- Consumir el API mediante el custom
- Obtener un Todo por ID
- Código fuente Fin sección 18 - Introducción a Redux
- Cambiar el nombre de una variable en todo el documento: Seleccionar la variable + fn + F2
- Poner comentario en línea: Cmd + , (después de seleccionar el texto o sobre la línea a comentar)
- Ordenar líneas ascendentemente (css styles): Cmd + Shift + P > Sort Lines Ascending
- Crear un functional-component. Snippet:
rafc
hay que tener instalado ES7 en vscode. Sí no funciona ver esto - Para duplicar una línea en vscode, simplemente sin seleccionar nada sobre la línea: Cmd + c, Cmd + v
- Snippets en vscode. VSCode tiene algunos snippets predefinidos como "clg" o "log" para
console.log()
. - Crear un snippets con vscode. cmd + shift + p > configure users snippets > javascript Para marcar todo el texto: cmd + option + flechas