Aca pueden encontrar hooks creados por la comunidad:
https://github.com/streamich/react-use
https://usehooks.com/
¡Bienvenida! Este es un curso especial de React Hooks
¿Qué aprenderás en el Curso Profesional de React Hooks?
¿Qué son los React Hooks y cómo cambian el desarrollo con React?
Introducción a React Hooks
useState: estado en componentes creados como funciones
useEffect: olvida el ciclo de vida, ahora piensa en efectos
useContext: la fusión de React Hooks y React Context
useReducer: como useState, pero más escalable
¿Qué es memoization? Programación funcional en JavaScript
useMemo: evita cálculos innecesarios en componentes
useRef: manejo profesional de inputs y formularios
useCallback: evita cálculos innecesarios en funciones
Optimización de componentes en React con React.memo
Custom hooks: abstracción en la lógica de tus componentes
Third Party Custom Hooks de Redux y React Router
Configura un entorno de desarrollo profesional
Proyecto: análisis y retos de Platzi Conf Store
Git Hooks con Husky
Instalación de Webpack y Babel: presets, plugins y loaders
Configuración de Webpack 5 y webpack-dev-server
Configuración de Webpack 5 con loaders y estilos
Loaders de Webpack para Preprocesadores CSS
Flujo de desarrollo seguro y consistente con ESLint y Prettier
Estructura y creación de componentes para Platzi Conf Store
Arquitectura de vistas y componentes con React Router DOM
Maquetación y estilos del home
Maquetación y estilos de la lista de productos
Maquetación y estilos del formulario de checkout
Maquetación y estilos de la información del usuario
Maquetación y estilos del flujo de pago
Integración de íconos y conexión con React Router
Integración de React Hooks en Platzi Conf Merch
Creando nuestro primer custom hook
Implementando useContext en Platzi Conf Merch
useContext en la página de checkout
useRef en la página de checkout
Integrando third party custom hooks en Platzi Conf Merch
Configura mapas y pagos con PayPal y Google Maps
Paso a paso para conectar tu aplicación con la API de PayPal
Integración de pagos con la API de PayPal
Completando la integración de pagos con la API de PayPal
Paso a paso para conectar tu aplicación con la API de Google Maps
Integración de Google Maps en el mapa de checkout
Creando un Custom Hook para Google Maps
Estrategias de deployment profesional
Continuous integration y continuous delivery con GitHub Actions
Compra del dominio y despliega con Cloudflare
Optimización de aplicaciones web con React
Integración de React Helmet para mejorar el SEO con meta etiquetas
Análisis de performance con Google Lighthouse
Convierte tu aplicación de React en PWA
Bonus: trabaja con Strapi CMS para crear tu propia API
Crea una API con Strapi CMS y consúmela con React.js
¿Qué sigue en tu carrera profesional?
Próximos pasos para especializarte en frontend
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 31
Preguntas 4
Aca pueden encontrar hooks creados por la comunidad:
https://github.com/streamich/react-use
https://usehooks.com/
Resultado final de esta sección:
Soy muy fan de hacer uso los custom hooks, personalmente hay uno que uso en todos mis proyectos para trabajar de forma muy sencilla el hecho de adaptar componentes a diferentes tamaños de pantalla (normalmente trabajo con styledComponents y me apoyo de la librería de useMediaQuery para detectar de forma sencilla el tamaño de pantalla)
<h3>Custom Responsive Hook</h3>import { useMediaQuery } from 'react-responsive';
export const useResponsive = () => {
const isSuperBigScreen = useMediaQuery({
minWidth: 2270,
});
const isBigScreen = useMediaQuery({
minWidth: 1400,
});
const isDesktop = useMediaQuery({
minWidth: 801,
maxWidth: 1399,
});
const isSmallDesktop = useMediaQuery({
minWidth: 801,
maxWidth: 1000,
});
const isTablet = useMediaQuery({
minWidth: 501,
maxWidth: 800,
});
const isPhone = useMediaQuery({
maxWidth: 500,
});
const isTabletOrPhone = useMediaQuery({
maxWidth: 800,
});
return {
isBigScreen: isBigScreen,
isTablet: isTablet,
isPhone: isPhone,
isDesktop: isDesktop,
isTabletOrPhone: isTabletOrPhone,
isSmallDesktop: isSmallDesktop,
isSuperBigScreen: isSuperBigScreen,
};
};
<h3>Uso en componentes</h3>
import styled from 'styled-components';
import { useResponsive } from '../hooks/useResponsive';
const Stack = ({ children, cols }) => {
const { isSmallDesktop, isTablet, isPhone } = useResponsive();
const StackContainer = styled.section``;
const StackIconContainer = styled.div`
display: grid;
grid-template-columns: ${cols
? `repeat(${cols}, 1fr)`
: isSmallDesktop
? 'repeat(5, 1fr)'
: isTablet
? 'repeat(4, 1fr)'
: isPhone
? 'repeat(3, 1fr)'
: 'repeat(7, 1fr)'};
grid-gap: 20px;
margin-top: 60px;
`;
const IconContainer = styled.div`
box-sizing: border-box;
background: #e5e5e5;
width: 100%;
margin: 0px;
border-radius: 15px;
padding: 15px;
`;
return children ? (
<StackContainer>
<Title>Stack</Title>
<StackIconContainer>
{children.map((item) => {
return (
<IconContainer key={item.id}>
<a href={item.url} rel="noopener noreferrer" target="_blank">
{item.img}
</a>
</IconContainer>
);
})}
</StackIconContainer>
</StackContainer>
) : (
''
);
};
export default Stack;
El proyecto de esta sección
Repository
Es importante a esta altura del curso conocer las reglas de los hooks
Proyecto con todos los hooks.
Esto me parece mucho mejor. Aquí el código pero usando async/await:
import { useState, useEffect } from "react";
const useCharacters = url => {
const [characters, setCharacters] = useState([]);
useEffect(() => {
async function fetchCharacters() {
const response = await fetch(url);
const characters = await response.json();
setCharacters(characters.results);
}
fetchCharacters();
}, [url]);
return characters;
};
export default useCharacters;
Así quedo mi deploy final perdonen los estilos pero practiqué mucho los hooks haha 😄 https://hooks.franciscoep.vercel.app/
usando todos los hooks
Dark Mode
Amo vue, pero este curso está muy pro!
Por si alguien tiene curiosidad en cuanto a pasarle en el array a useEffect la url, tenemos 3 casos, cuando no le mandamos nada, cuando le mandamos un array vacío y cuando le enviamos la url en el array
Caso 1. No enviamos nada al segundo parámetro
En este caso, entraríamos en un Loop Infinito, por qué? Porque recordar que cuando no enviamos ese segundo parámetro, el useEffect se va a renderizar en cada ocasión que cambie el estado. Por ende, cada vez que en la lìnea 4 llamamos al método “setCharacters” y definimos el nuevo estado de characters, este estado se ve actualizado lo que implica re renderizar el componente. Por ello, entraríamos en un bucle infinito (incluir un console.log si quieren comprobarlo)
Caso 2. Le enviamos un array vacio
En este otro caso, de enviar un array vacío, le estamos diciendo a useEffect que se renderice en dos de sus etapas de ciclo de vida, cuando se monte y cuando se desmonte. Esto no provocará un ciclo infinito, pero ocasionará que el componente se invoque 4 veces.
Si bien es cierto que es funcional, en algunos casos llamar 4 veces al componente podría acabar en un problema en el performance de la aplicación
Caso 3. Le enviamos la url en el array
En este caso, el expuesto en la clase, este se renderiza solamente 2 veces, cuando el componente nace y cuando lo invocamos dentro de Characters. Ya no importa si el componente está muriendo, ni tampoco importa que se actualice el estado, ya que solo se actualizará cuando nuestra url se actualice (cosa que no ocurrirá dentro del mismo Componente, evitando así un Loop infinito)
Esto sería más o menos todo, esto fue lo que entendí de las clases y revisando documentación y blogs, ya que no entendía del todo porque esto ocurría, si hay algún punto donde esté fallando o me esté confundiendo agradezco me lo indiquen y de igual manera, espero les ayude a comprender un poco el porqué de esta acción
Asi quedo el proyecto final de esta seccion:
Repo
Live Project
Acá tiene una lista de reproducción que implementa custom hooks que se suelen usar:
https://youtube.com/playlist?list=PLZlA0Gpn_vH-aEDXnaFNLsqiJWFpIWV03
Resultado final de esta sesión! 😄
Decidí agregar un nuevo customHook llamado ‘useCharacterContext’ donde me encargo de utilizar useContext y retornar los valores de CharacterContext, de esta manera evito estar importando useContext en los componentes donde quiera usar el contexto de character, de la siguiente manera:
Luego, en el componente donde necesite hacer uso del contexto, nada mas encapsulo el componente dentro del provider, y luego lo importo de la siguiente forma:
Por ultimo, así quedo visualmente !
Ya que estamos creando un Custom Hook, no deberíamos ser tan específicos en el nombre de las propiedades del CH. Es decir, entiendo que para el ejemplo de clase fue así, pero en general, un custom hook debería contener nombres genéricos.
Si alguno tiene problemas con que la data no llega al momento de renderizar el componente pueden probrar lo siguiente
// Notese el optional chaining
const filteredUsers = useMemo(() => {
return characters?.filter(user => {
return user.name.toLowerCase().includes(search.toLowerCase())
})
}, [characters, search])
// En el renderizado
<div className="character-wrapper">
{ characters && filteredUsers.map((character, key) =>
(
<Character {...character} parentCallback={setFavorite} key={key}/>
)
)}
</div>
Así quedó mi proyecto
En este caso ¿el custom hook funciona de manera sincrona?¿puede pasar que el componente quiera renderizarse y la data de la API no haya llegado?
import {useState, useEffect} from "react";
const useCharacters = (url) => {
const [characters, setCharacters] = useState([]);
useEffect(() => {
fetch(url)
.then(response => response.json())
.then(data => setCharacters(data.results));
}, [url]);
return characters;
}
export default useCharacters;
muy buen profesional Oscar Bajaras he seguido varios de sus cursos y cada vez son mejores Gracias
Custom hook con estado de loading para avisarle al padre que la petición se encuentra en proceso y así mostrar un spinner o algo similar
import {useState, useEffect} from 'react';
const useCryptos = (API_URL, page) => {
const [cryptos, setCryptos] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
setIsLoading(true);
fetch(`${API_URL}${page}`)
.then((res) => res.json())
.then((data) => {
setCryptos(data);
setIsLoading(false);
});
}, [API_URL, page]);
return [cryptos, isLoading]
}
export default useCryptos
muchas gracias profesor 😄
Resultado de Uso de Hooks de React y algunos estilos improvisados:
.
.
Así quedó mi código. Si alguien separó el Characters.jsx en componentes mas pequeños estaria bueno que lo comparta!
Está incre!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.