React Hooks Manual
React Hooks Manual
libro
He creado un curso que se complementa perfectamente con el contenido del
libro React Hooks Manual Desde Cero.
Puedes ver una parte de este curso, Guía definitiva: Aprende los 9 Patrones
Avanzados en ReactJS absolutamente GRATIS en este momento.
Esto es sólo para los lectores React Hooks Manual Desde Cero, ¡así que no
pierdas esta valiosa oportunidad!
!OBTENLO AQUÍ!
En caso de que no puedas abrir el link dando click, accede manualmente a esta
URL: https://developero.io/react-patterns-free
React Hooks
Manual Desde
Cero
De Developero
1
Índice
¿Quién debería de leer este libro? 4
Mi promesa hacia ti 5
2
Emular variables de instancia en componente funcional (this) 75
Recapitulación del hook useRef 77
Sobre el autor 81
3
¿Quién debería de leer este libro?
Escribí React Hooks Manual Desde Cero para los desarrolladores de React JS
principiantes (trainees o juniors) que quieren aprender lo necesario de los
React Hooks de manera rápida y con escenarios del mundo real.
Lo que tienen en común los perfiles anteriores es: se enteraron que los React
Hooks marcan un antes y un después y que saber usarlos va a impulsar
bastante la calidad de su código y las probabilidades de ser contratados en un
puesto de trabajo.
4
Mi promesa hacia ti
Si sigues conmigo hasta el final de este libro, te prometo que las siguientes dos
horas que te tome leerlo no serán una pérdida de tiempo.
Tengo la fuerte esperanza de que aprendas las bases de lo que será tu nuevo
camino en tu carrera profesional.
Todo para que puedas dominar los Hooks de manera fácil y rápida, sin una
curva de aprendizaje alta y lenta como la tuve yo, llena de confusiones.
● Conocer los por qué, cómo y en qué casos aplicar cada hook vistos en este
libro.
● Ser capaz de refactorizar componentes de tipo clase a componentes
funcionales con hooks.
● Aplicar los hooks en escenarios de la vida real.
● Aprendizaje exprés: domina los hooks en un día, sin contenido de relleno
ni ambigüedades.
Por supuesto, si quieres o necesitas más información sobre cómo aplicar los
hooks de manera más avanzada, te recomiendo mucho que descargues la parte
del curso: Guía definitiva: Aprende los 9 Patrones Avanzados en ReactJS
absolutamente GRATIS que tengo para los lectores de este libro.
Da click aquí.
5
Introducción a los React Hooks
Los React Hooks fueron incorporados a partir de la versión 16.8 de
React y nos permiten utilizar las características de esta biblioteca en
componentes funcionales.
Un ejemplo a continuación.
Ejemplo de useState
1 import React, { useState } from "react";
2
10 return (
11 <>
12 <p>Clicks: {count}</p>
13 <button onClick={handleClick}>Clickeame</button>
14 </>
15 );
16 };
Esto es sólo una muestra introductoria para que veas como luce un
hook. No te preocupes si este ejemplo no hace sentido. Ya veremos
en capítulos posteriores cada hook paso a paso :).
6
Conforme avances en estas páginas te darás cuenta del PODER de
los hooks y los nuevos caminos que se abren para ti al momento en
que diseñas tus componentes.
7
¿Los React Hooks van a reemplazar los componentes de tipo clase?
Los hooks nos proveen de una manera más limpia para manejar la
misma lógica que nos permiten manejar los ciclos de vida de una clase
como veremos en los ejemplos de cada hook.
Aunque ojo: aún con hooks puedes terminar con código complejo si
sigues malas prácticas. Este manual te va a guiar en las buenas
prácticas para que saques el máximo provecho a los hooks.
8
props y los componentes de orden superior (HOC por sus siglas en
inglés).
Ahora pasemos a la acción y veamos cada uno de los hooks, cómo, por
qué y en qué contextos usarlos.
9
Hook de estado: useState
El hook useState te permite poder usar variables de estado dentro de
un componente funcional.
8 render() {
9 const { count } = this.state;
10 return (
11 <>
12 <p>Clicks: {count}</p>
13 <button onClick={this.handleClick}>Clickeame</button>
14 </>
15 );
16 }
17 }
10
Lo definimos por fuera del constructor basados en la sintaxis
alternativa, es decir, declarar el estado como una propiedad de la clase
desde fuera del constructor.
8 return (
9 <>
10 <p>Clicks: {count}</p>
11 <button onClick={handleClick}>Clickeame</button>
12 </>
13 );
14 };
11
El hook useState nos retorna siempre un array con dos elementos.
12
A diferencia del estado en un componente de tipo clase, la variable de
estado usando este hook no tiene que ser necesariamente un objeto.
● String.
● Boolean.
● Number.
● Float.
● Null.
● Undefined.
● Object.
● Array.
Ten en cuenta que los valores iniciales del estado se ejecutan solo una
vez y es cuando se monta el componente
13
Puedes declarar más de un estado local con useState
14
Actualizando Arrays con useState
Es importante que tengas en cuenta la manera correcta de actualizar el
estado cuando usas este tipo de datos ya que puedes caer en
comportamientos inesperados.
4 // NO
5 tags.push('new value');
6
7 // SI
8 setTags([...tags, 'new value']);
9}
15
Modificar el contenido de un Array como variable de
estado
Para actualizar elementos existentes dentro de un array podemos usar
diferentes estrategias.
4 // update
5 const indexToUpdate = 1;
6 const newValue = "four?";
7 const tagsUpdated = tags.map((value, index) => {
8 if (index === indexToUpdate) {
9 return newValue;
10 }
11
12 return value;
13 });
14
15 setTags(tagsUpdated);
16 };
16
6 ]);
7
8 // update
9 const idToUpdate = 2;
10 const newValue = { id: 2, value: "four?" };
11 const tagsUpdated = tags.map((value) => {
12 if (value.id === idToUpdate) {
13 return newValue;
14 }
15
16 return value;
17 });
18
19 setTags(tagsUpdated);
20 };
17
Eliminar un elemento de un array como variable de
estado
Para eliminar un elemento necesitamos pasar un nuevo array sin el
elemento que queremos eliminar.
8 // remove
9 const idToUpdate = 2;
10
13 setTags(tagsUpdated);
14 };
18
Actualizando Objetos con useState
Al igual que cuando actualizamos un array, cuando actualizamos un
objeto también necesitamos pasar el objeto completo en la función
que actualiza dicho estado.
7 // NO
8 userData.name = "Juanito";
9
10 // SI
11 setUserData({ ...userData, name: "Juanito Banana" });
12 setUserData({ ...userData, age: "20" });
13
14 // SI
15 const property = 'name';
16
17 setUserData({
18 ...userData,
19 [property]: "Juanito Banana"
20 });
21 };
Nota que también estamos usando el spread operator para crear un nuevo
objeto con las propiedades correspondientes.
19
Recapitulación del hook useState
En este capítulo hemos visto los principales casos de uso que vas a
necesitar en tu dia a dia programando:
Por cierto, si aún no has calificado este libro y tienes 3 minutos, ¿Me
ayudarías agregando una calificación y reseña honestas? ¡Me ayudaría
bastante!
20
Hook de efectos secundarios
useEffect
EL hook useEffect es el segundo hook que más vas a usar debido a que
nos ayuda a todo lo relativo de efectos secundarios.
● Peticiones de datos.
● Establecimiento de suscripciones.
● Actualizaciones manuales del DOM.
Pues bien, estos efectos secundarios ahora también los podemos hacer
en componentes funcionales.
6 return ':)';
7}
21
Vamos a entrar más en materia a continuación.
Ejemplos de useEffect
1 const MyComponent = ({ someProp }) => {
2 useEffect(() => {
3 console.log("se ejecuta cada render");
4 console.log("incluso el inicial");
5 });
6
7 useEffect(() => {
8 console.log("nuevo valor de someProp", someProp);
9 }, [someProp]);
10
11 useEffect(() => {
12 // code
13 return () => console.log("componente desmontado");
14 });
15
16 return ":)";
17 };
Pero para ponerla más fácil, vamos a ver ejemplos de casos prácticos
del mundo real en el uso de este hook.
22
Petición de datos (componentDidMount y
componentDidUpdate)
El siguiente ejemplo va a ser sólo para fines educativos y es simular
una llamada a una API.
6 componentDidMount() {
7 const data = myApi.fakeFetch();
8 this.setState({ data });
9 }
10
11 render() {
12 return this.state.data.map(
13 ({ label }) => (<p>{label}</p>)
14 );
15 }
16 }
4 useEffect(() => {
5 const data = myApi.fakeFetch();
6 setData(data);
23
7 }, []);
8
6 componentDidMount() {
7 const { userId } = this.props;
8 const data = myApi.fakeFetch(userId);
9 this.setState({
10 data
11 });
24
12 }
13
14 // nuevo
15 componentDidUpdate(prevProps) {
16 const { userId } = this.props;
17
26 render() {
27 return this.state.data.map(
28 ({ label }) => <p>{label}</p>);
29 }
30 }
4 useEffect(() => {
5 const data = myApi.fakeFetch(userId);
6 setData(data);
7 }, [userId]); // nuevo
8
25
Como puedes ver, sólo hemos pasado la variable userId como
dependencia dentro del array del useEffect.
26
Iniciar y eliminar suscripciones (componentDidMount,
componentWillUnmount)
Vamos a usar de ejemplo la suscripción del evento de cuando se
presiona la tecla Enter del teclado.
Ejemplo de suscripción
1 const MyComponent = ({ someProp }) => {
2 useEffect(() => {
3 window.addEventListener("keydown", handleKeydown);
4
5 return () =>
6 window.removeEventListener(
7 "keydown",
8 handleKeydown,
9 );
10 });
11
27
21 };
28
Recapitulación del hook useEffect
En este capítulo hemos visto lo siguiente:
29
Hook para memorizar funciones useCallback
El hook useCallback sirve para mejorar el rendimiento de nuestros
componentes en base a memorizar funciones que se usan como
callbacks.
30
9z === z // true
Nota: las funciones para actualizar el estado que retorna useState tienen
garantía de que serán estables todo el tiempo, por lo que nos podemos
despreocupar de ellas.
31
Ejemplo de optimización con useCallback (incluyendo
React.memo)
Antes mencioné que este hook es útil cuando pasas funciones como
props a componentes hijos.
Para ilustrar bien este ejemplo, vamos a hacer una mini app que
consiste en tener una lista de comida con la capacidad de remover
elementos de dicha lista.
lista de alimentos
1 const food = [
2 { id: 1, name: "pizza" },
3 { id: 2, name: "hamburger" },
4 { id: 3, name: "hot-dog" },
5 { id: 4, name: "tacos" },
6 { id: 5, name: "pizza again :)" }
7 ];
FoodContainer
1 const FoodContainer = () => {
2 console.log("FoodContainer rendered");
3
32
4 const [foodList, setFoodList] = useState(food);
5 const [textInput, setTextInput] = useState("");
6
14 return (
15 <>
16 <h2>My Food List</h2>
17 <p>
18 New food
19 <input
20 value={textInput}
21 onChange={handleChange}
22 />
23 </p>
24 <FoodList
25 foodList={foodList}
26 removeItem={removeItem}
27 />
28 </>
29 );
30 };
FoodList
1 const FoodList = ({ foodList, removeItem }) => {
2 console.log("FoodList rendered");
3 return (
4 <ul>
5 {foodList.map((item) => (
33
6 <FoodItem
7 key={item.id}
8 item={item}
9 removeItem={removeItem}
10 />
11 ))}
12 </ul>
13 );
14 };
FoodItem
1 const FoodItem = ({ item, removeItem }) => {
2 console.log("FoodItem rendered");
3 return (
4 <>
5 <li>{item.name}</li>
6 <button
7 onClick={() => removeItem(item.id)}>
8 Remove :(
9 </button>
10 </>
11 );
12 };
34
Nota: hacemos import de memo del modo: import React, { memo } from 'react';
35
La razón es que React considera que el prop removeItem no es
equivalente al anterior prop a través de los re renderizados.
Dentro de FoodContainer
1 const removeItem = useCallback(
2 (id) => setFoodList(foodList.filter((foodItem) =>
3 foodItem.id !== id)),
4 [foodList]
5 );
36
15
16 return (
17 <>
18 <h2>My Food List</h2>
19 <p>
20 New food <input
21 value={textInput}
22 onChange={handleChange} />
23 </p>
24 <FoodList
25 foodList={foodList}
26 removeItem={removeItem} />
27 </>
28 );
29 };
37
¿Debo memorizar funciones todo el tiempo?
No. Es muy importante elegir sabiamente en base a la relación costo -
beneficio.
38
Recapitulación del hook useCallback
● Usa este hook en las funciones que pases por props a
componentes hijos que ocasionen re renderizados innecesarios.
● Si la función depende de otras variables, pásalas en el array de
dependencias de este hook.
● Puedes usar React.memo en conjunto para complementar una
optimización de re renders.
● NO (en mayúsculas) necesitas aplicar useCallback en cada función
que definas ya que tiene un costo. Hazlo sólo cuando realmente
exista una mejora significativa en el performance.
39
Hook para optimizar cálculos
useMemo
El hook useMemo sirve para memorizar valores.
● Constant: O(1)
● Logarithmic: O(log n)
● Linear: O(n)
● Linearithmic: O(n log n)
● Quadratic: O(n²)
● Expontential: O(2^n)
● Factorial: O(n!)
40
6 }
7}
10 console.log('iteraciones:', c);
11 }
12
41
Incluso puede que logres optimizar la complejidad de ese algoritmo
usando otra estructura de datos como un diccionario o una tabla hash.
Pero si quieres una solución basada en lo que tiene React, en este caso
el hook useMemo viene como anillo al dedo.
42
PureComponent, React.memo y useMemo
Primero vamos a definir la identidad de cada elemento:
Considera lo siguiente:
1 class Title extends PureComponent {
2 render() {
3 return <h1>{this.props.value}</h1>;
4 }
5}
43
Este es un componente que sólo renderiza un elemento visual, no
tiene lógica de llamada a api ni nada por el estilo.
8 render() {
9 return <h1>{this.props.value}</h1>;
10 }
11 }
44
1 const Title = (value) => <h1>{value}</h1>;
2
45
Recapitulación del hook useMemo
En este capítulo hemos visto lo siguiente:
Con esto hemos cubierto gran parte del tema para hacer
optimizaciones en componentes en React.
46
Hook para estados complejos useReducer
Este capítulo va a abarcar varios conceptos que si no estás
familiarizado con ellos, puede que te sientas un poco abrumado.
2 foo: {
3 faa: {
4 test: [],
5 testB: ''
6 }
7 },
8 fee: [],
9 fii: {
10 testC: [],
11 testD: {}
12 }
13 }
47
En caso de que requieras un estado como el ejemplo anterior y no sea
viable dividirlo usando diferentes useState, lo recomendado es que
uses useReducer.
48
Funciones reductoras (reducers)
Un reducer es una función de Javascript que recibe por parámetro el
valor del estado actual y por segundo parámetro un objeto plano de
Javascript llamado action con la información necesaria para actualizar
el estado.
“Kha?”
49
Hay quienes prefieren evitar el uso de switch pero debes saber que es
opcional usarlo. Puedes usar una serie de sentencias if también.
Depende de ti.
50
Ejemplo de un componente con useReducer
Vamos a hacer un componente para manejar una lista de cosas por
hacer (TODO list).
Primero hay que pensar en cuál es el estado más simple que puede
necesitar nuestro componente de cosas por hacer.
Consideremos lo siguiente:
51
Ahora hagamos nuestro reducer incluyendo la lógica necesaria para
agregar un nuevo elemento de nuestro TODO solamente de momento.
5 return [
6 ...state,
7 {
8 id: uuidv4(),
9 name,
10 isCompleted: false
11 }
12 ];
13 }
14 };
Para retornar el nuevo estado, vamos a usar el spread operator para crear
un nuevo array agregando todos los valores actuales de state, ya
que state es un array.
52
Ahora vamos a agregar la lógica para actualizar isCompleted de un
elemento del TODO en particular.
13 return singleTodo;
14 });
15
16 return newState;
17 }
53
Ejemplo:
1 // Si...
2 singleTodo.isCompleted = true
3
4 // Entonces...
5 !singleTodo.isCompleted // igual a false
6
7 // y viceversa
8
9 // Si...
10 singleTodo.isCompleted = false
11
12 // Entonces...
13 !singleTodo.isCompleted // igual a true
reducer completo
1 const reducer = (state, action) => {
2 if (action.type === "ADD_TODO") {
3 const { name } = action.payload;
4
5 return [
6 ...state,
7 {
8 id: uuidv4(),
9 name,
10 isCompleted: false
11 }
12 ];
13 }
14
54
16 const { id } = action.payload;
17
26 return singleTodo;
27 });
28
29 return newState;
30 }
31
32 return state;
33 };
7 return (
8 <>
9 <p>
10 Nuevo TODO:
11 <input
12 type="text"
55
13 value={todoText}
14 onChange={handleChange}
15 />
16 <button>Agregar</button>
17 </p>
18
19 <h2>Listado</h2>
20 <ul>
21 <li>Test</li>
22 </ul>
23 </>
24 );
25 };
4 // AQUI
5 const [state, dispatch] = useReducer(reducer, initialState);
6
56
2 {
3 state.map(({ name, isCompleted, id }) => {
4 const style = {
5 textDecoration: isCompleted
6 ? "line-through" : "inherit"
7 };
8
9 return (
10 <li key={id} style={style}>
11 {name}
12 </li>
13 );
14 })
15 }
16 </ul>
8 return (
9 <>
10 <p>
11 Nuevo TODO:
12 <input
13 type="text"
14 value={todoText}
15 onChange={handleChange}
16 />
17 <button>Agregar</button>
18 </p>
57
19
20 <h2>Listado</h2>
21
22 <ul>
23 {state.map(({ name, isCompleted, id }) => {
24 const style = {
25 textDecoration: isCompleted
26 ? "line-through" : "inherit"
27 };
28
29 return (
30 <li key={id} style={style}>
31 {name}
32 </li>
33 );
34 })}
35 </ul>
36 </>
37 );
38 };
9 // en el botón
10 <button onClick={handleClick}>Agregar</button>
58
Ejecutamos el dispatch para actualizar el estado. Le pasamos el type y
el payload necesarios como se ve en el ejemplo.
8 // en el elemento li
9 return (
10 <li
11 key={id}
12 style={style}
13 onClick={() => handleToggle(id)}
14 >
15 {name}
16 </li>
17 );
59
5 const handleChange = ({ target }) =>
6 setTodoText(target.value);
7
23 return (
24 <>
25 <p>
26 Nuevo TODO:
27 <input
28 type="text"
29 value={todoText}
30 onChange={handleChange}
31 />
32 <button onClick={handleClick}>Agregar</button>
33 </p>
34
35 <h2>Listado</h2>
36
37 <ul>
38 {state.map(({ name, isCompleted, id }) => {
39 const style = {
40 textDecoration: isCompleted
41 ? "line-through" : "inherit"
60
42 };
43
44 return (
45 <li
46 key={id}
47 style={style}
48 onClick={() => handleToggle(id)}
49 >
50 {name}
51 </li>
52 );
53 })}
54 </ul>
55 </>
56 );
57 };
61
Diferencia entre useReducer y Redux
El nombre de useReducer da pie a confundirlo con redux, pero en realidad
son cosas completamente diferentes.
62
Recapitulación del hook useReducer
En este capítulo hemos visto lo siguiente:
Espero que este capítulo te haya dado luces para que puedas comenzar
a implementar este hook en tus desarrollos cuando lo consideres
necesario.
63
Hook para manejar la API de Context useContext
El hook useContext nos sirve para poder implementar la API de Context que
ya existía en React desde antes de los hooks.
64
Ejemplo de Context en componente clase y useContext
en componente funcional
Primero implementaremos un Context para aplicar un tema en
componentes usando la API tradicional y luego lo refactorizaremos
usando useContext.
17
65
El tema por defecto es themes.light que es pasado por parámetro
a createContext.
Proveer Context
1 export default function App() {
2 const [currentTheme, setCurrentTheme] =
3 useState(themes.light);
4
5 return (
6 <div className="App">
7 <h1>React Context</h1>
8
9 <ThemeContext.Provider value={currentTheme}>
10 <MyButton>Hello World!</MyButton>
11 </ThemeContext.Provider>
12 </div>
13 );
14 }
Consumir Context
1 class MyButton extends Component {
2 render() {
3 const theme = this.context;
4 const style = {
5 backgroundColor: theme.background,
6 color: theme.color,
7 border: "1px solid",
66
8 borderRadius: 5
9 };
10 return <button style={style} {...this.props} />;
11 }
12 }
13
modificar context
1 export default function App() {
2 const [currentTheme, setCurrentTheme] = useState(themes.light);
3
4 return (
5 <div className="App">
6 <h1>React Context</h1>
7 <ThemeContext.Provider value={currentTheme}>
8 <MyButton
9 onClick={() => setCurrentTheme(themes.dark)}
10 >
11 Dark Theme
12 </MyButton>
13 <MyButton
14 onClick={() => setCurrentTheme(themes.vaporwave)}
15 >
16 Vaporwave Theme
17 </MyButton>
18 </ThemeContext.Provider>
19 </div>
20 );
21 }
67
Con esto ya funciona pero por lo común vas a tener la necesidad de
modificar el context desde un componente hijo.
4 return (
5 <div className="App">
6 <h1>React Context</h1>
7
68
19 </MyButton>
20
21 <MyButton
22 onClick={() => setCurrentTheme(themes.vaporwave)}
23 >
24 Vaporwave Theme
25 </MyButton>
26
69
18 return <button
19 onClick={onClick}
20 style={style}
21 {...this.props}
22 />;
23 }
24 }
Ahora vamos a hacer una nueva versión del código anterior para hacer
uso de useContext y puedas apreciar las diferencias.
Veamos el refactor:
Ejemplo de useContext
1 const MyNewButton = (props) => {
2 const { theme, updateTheme } = useContext(ThemeContext);
3
4 const style = {
5 backgroundColor: theme.background,
6 color: theme.color,
7 border: "1px solid",
8 borderRadius: 5
9 };
10
70
15 const onClick = props.handleClick || updateLightTheme;
16
Como puedes ver, lo único que cambia es que ahora podemos obtener
nuestro valor de context usando const { theme, updateTheme } =
useContext(ThemeContext);.
71
Recapitulación del hook useContext
En este capítulo hemos visto:
72
Hook para trabajar con referencias useRef
El hook useRef nos permite trabajar con referencias en componentes
funcionales.
Este hook nos retorna un objeto con una propiedad current que es
mutable y cuyo valor persiste durante los renderizados y ciclo de vida
del componente.
Por ejemplo, cuando queremos hacer que un input tenga un auto focus
al montarse.
4 componentDidMount() {
5 this.inputEl.focus();
6 }
7
8 render() {
9 return (
10 <p>
11 Name:
12 <input
13 type="text"
14 ref={(el) => (this.inputEl = el)}
15 />
73
16 </p>
17 );
18 }
19 }
6 return (
7 <p>
8 Name:
9 <input type="text" ref={inputEl} />
10 </p>
11 );
12 };
74
Emular variables de instancia en componente funcional
(this)
Dentro de un componente de tipo clase podemos crear variables de
instancia como el siguiente ejemplo:
1 class MyComponent extends React.Component {
2 intervalId = null;
3
4 componentDidMount() {
5 // Accedemos con "this"
6 this.intervalId = setInterval(() => {
7 // ...
8 });
9 }
10
11 componentWillUnmount() {
12 clearInterval(this.intervalId);
13 }
14
15 render () {
16 // code
17 }
18 }
Ejemplo de reactjs.org
1 function Timer() {
2 const intervalRef = useRef();
3
4 useEffect(() => {
5 const id = setInterval(() => {
6 // ...
75
7 });
8 intervalRef.current = id;
9 return () => {
10 clearInterval(intervalRef.current);
11 };
12 });
13
14 // ...
15 }
76
Recapitulación del hook useRef
Este ha sido un capítulo corto debido a la sencillez de este hook. Lo que
vimos fue:
77
Siguientes pasos en tu carrera de
React Developer
¡Felicidades por haber llegado hasta el final del libro! Has dado el primer paso
para mejorar como profesional.
En esta sección te voy a compartir otros recursos que he creado para ayudar a
muchos desarrolladores de JavaScript a mejorar sus conocimientos.
Si para este punto, aún no has calificado este libro y tienes 3 minutos, ¿Me
ayudarías agregando una calificación y reseña honestas?
Recursos Gratuitos
Aprende más temas de desarrollo en JavaScript consultando los diferentes
cursos y tutoriales.
Recursos Premium
A continuación te comparto los cursos premium que tengo al momento de
publicar este libro.
78
● Aplicar REALMENTE TDD en React JS moderno (incluyendo hooks) en tu
día a día.
● Aplicar fuertemente buenas prácticas - Código limpio y refactors en
React JS.
● Unit e Integration testing con React Testing Library.
- Vas a tener acceso al código fuente de los ejemplos de cada patrón con la
posibilidad de poder ejecutarlo y editarlo para que consolides mejor tu
aprendizaje.
Conoce los por qué, cómo y en qué casos aplicar cada hook. Vamos a revisar en
cada hook cuáles son los escenarios donde conviene aplicarlos y cómo hacerlo
con buenas prácticas.
79
Acceso a ejemplos con código fuente. Leer sin aplicar no sirve de mucho. Es por
eso que tienes acceso al código fuente de los ejemplos para que puedas
ejecutarlo, editarlo y ver los resultados.
Este curso está orientado a ver ejemplos prácticos de los hooks junto a una
comparación de sus equivalentes en componentes de tipo clases.
80
Sobre el autor
81