Y ahí es donde entraron en juego los componentes de orden superior. La idea con los componentes de orden superior, de los que vamos a seguir hablando un poco, es que tienes, sí, tu componente de presentación, tal vez tu componente contenedor, y luego envuelves todo. Y lo que hace es inyectar lo que necesitas a través de props. Los componentes de orden superior son simplemente una función que toma un componente como argumento y devuelve otro componente. De esa manera, esencialmente estás haciendo una composición funcional, pero con componentes de React. Y lo que puedes hacer es pasarles cosas a través de props porque los componentes obtienen cosas desde el exterior a través de props, o al menos eso hacían en el mundo antiguo. Esa era la forma en que los obtenían. Así es como surgieron los componentes de orden superior.
Obviamente, probablemente hayas visto bastantes componentes de orden superior, como Connect, que es uno muy famoso con Redux, o también con Router de React, Router es otro componente de orden superior muy conocido de las bibliotecas. Así que fue muy... todo este ecosistema de React adoptó mucho ese patrón también, como una forma de compartir lógica con estado o lógica de componentes, tal vez es una mejor manera de decirlo.
Y luego, sí, avanzando un poco más en el tiempo, llegamos a esta idea del patrón RenderProps que nos permitió hacer nuestra composición un poco más declarativa y esencialmente hacer nuestra composición en tiempo de renderizado. Entonces, la forma en que funciona, siguiendo con los componentes de orden superior, es que en realidad solo necesitas algunas dependencias, como cuando un componente se renderiza realmente. Y en React, tienes este modelo de composición donde puedes pasar hijos. Veremos ejemplos de código de esto más adelante, así que no te preocupes si piensas que suena un poco abstracto.
Pero puedes, ya sabes, puedes tener una función como hijo. Como puedes ver en este gráfico a la izquierda, es como si tuvieras un componente de React y dices, ok, mis hijos son una función, esa función puede ser invocada desde cualquier lugar por este padre con algunos argumentos, y luego en los parámetros aquí, puedes extraer lo que necesites y simplemente devolver más componentes. Y tienes, como, las cosas que necesitas en tiempo de renderizado, lo cual es genial. Y sí, esto fue algo que realmente ganó mucho impulso. Nuevamente, es un patrón que todavía está presente, y también es un patrón que todavía se usa bastante. Es realmente relevante. Por eso estoy hablando de todas estas cosas. Este todavía está muy presente, ya sabes, en el día a día, lo verás por ahí. Los componentes de orden superior un poco menos, veremos por qué en los ejemplos también.
Y finalmente, esta última evolución, que estoy seguro de que todos conocen porque ha pasado un par de años, los hooks surgieron. Y lo que los hooks de React nos permitieron hacer fue esencialmente hacer esta composición perpendicular al árbol. Me gusta mucho esta forma de pensarlo, porque realmente ayuda, de hecho, siempre a pensar en tus componentes, en toda tu aplicación realmente, como una estructura de árbol. Y de esa manera, puedes razonar sobre quién es el padre, quiénes son los hijos. Y, ya sabes, el cambio de estado o props en un padre es lo que hace que los hijos se vuelvan a renderizar. Así que siempre vale la pena pensar de esta manera, como en el árbol, como cuál es la jerarquía. Pero sí, esencialmente los hooks, lo que hacen es en lugar de tener que hacerlo verticalmente, que es lo que hacen los otros patrones, puedes hacerlo horizontalmente, porque simplemente puedes escribir una pieza de lógica de componente y luego simplemente puedes enganchar esa pieza de lógica de componente desde cualquier componente en cualquier lugar del árbol. Esa es la gran idea. Así que sí, espero que tenga sentido, pero veremos más.
Entonces, si estamos usando componentes funcionales y queremos, sí, reutilizar algún tipo de, en este caso, un efecto secundario, useDocumentTitle, entonces simplemente podemos usarlo. Como puedes ver en el lado izquierdo, una función aquí, llamándola useDocumentTitle. Entonces es un hook, recibe un título y luego simplemente ejecuta este efecto, ¿verdad? Entonces, el hook useEffect, todo lo que es un efecto secundario debe usar eso, y en este caso, obviamente, usar esta API del documento es un efecto secundario. Así que simplemente ejecútalo y luego, sí, dentro de cualquier componente dado, solo importaríamos useDocumentTitle y pasaríamos esa cadena que es el título que espera. Así de simple.
Pero luego, sí, probablemente estés pensando, ¿qué pasa si el hook devuelve algo? Bueno, sí, buena pregunta. Entonces, si el hook devuelve algo, siguiendo con ese mismo ejemplo aquí, puedes ver en la parte superior aquí un hook personalizado que recibe el título como argumento, y también devuelve una función de actualización y el recuento actual. Así que simplemente agregando un poco de estado a la ecuación aquí, dentro de este hook personalizado. Y sí, lo que va a hacer en ese useEffect es simplemente ejecutar el efecto allí y luego imprimir el recuento y el título, así que lo veríamos en la parte superior del documento. Y desde el hook, estamos devolviendo un objeto con dos cosas diferentes, como el recuento actual en sí, y también la función de actualización que es el setCounter, que definimos en la parte superior del useState. Y luego, sí, si queremos usar ese hook personalizado en un componente funcional, muy simple, sí, podría haber algún componente funcional llamado document.titleEffectFnComponent, y todo lo que tenemos que hacer es simplemente usar nuestra desestructuración de ES6 aquí para definir dos variables, count y setCount, porque sabemos que eso es lo que se devuelve de ese objeto, y luego pasar también nuestro argumento. Entonces, en este caso, también hemos pasado un objeto con, por ejemplo, el título, hola. Sí, espero que todo eso tenga sentido. Esto es bastante básico hasta ahora para los hooks, pero estamos avanzando. Así que, genial, supongo que, siguiendo con esto, ¿qué haces, sin embargo, cuando tienes un buen hook personalizado, como el que acabamos de ver, y piensas, oh, eso es genial, puedo cambiar mi título de documento. No estoy seguro de si querrías, pero podrías. Pero todos tus componentes son componentes de clase. Estás en este mundo donde es una base de código heredada. Sí, primero podrías decir, bueno, podría refactorizar todo a hooks, pero eso podría no ser viable por varias razones, ¿verdad? Porque tus componentes podrían ser realmente grandes y difíciles de refactorizar. Podría haber mucha lógica compleja. También podría estar muy bien probado, y no tienes tiempo para reescribir las pruebas. También podría ser simplemente una cuestión de tiempo, porque, ¿cuál es el beneficio relativo de la refactorización? Y eso es una de las cosas que tenemos que evaluar porque tenemos que, supongo, sopesarlo con la entrega. Si necesitas entregar nuevas características, entonces necesitas entregar nuevas características. Y obviamente puedes escribir cualquier cosa nueva utilizando la nueva sintaxis y todo, asumiendo que has actualizado tu versión de React, lo cual deberías hacer porque tiene una gran compatibilidad hacia atrás pero sí. Quiero decir, podrías tener esta situación. Ciertamente, donde trabajo, siendo una empresa de 160 años, nada de código heredado y, sí, a veces habrá como código heredado también. Que simplemente no ha sido posible en tal vez parte del código heredado y tal vez parte ha comenzado a moverse. Así que eso es lo que vamos a ver ahora. Entonces, ¿qué sucede, supongo que es la primera pregunta? Como cuando intentamos usar hooks en el componente de clase, tal vez algunos de ustedes lo hayan intentado, pero les diré, básicamente obtienes un error que dice, solo se puede llamar en un componente funcional. El mensaje de error se ve así. Sí, te dice cuál es el problema. Obviamente, este es uno de los requisitos de los hooks. Recomiendo, ya sabes, trabajar con hooks, en general, definitivamente leer eso porque hace que todos los errores que no puedes cometer tengan mucho más sentido. De hecho, hay enlaces en las diapositivas. Las diapositivas se compartirán al final, para que puedas hacer clic en cualquiera de los enlaces directamente. También los publicaré todos en el canal de Discord. Abriré algunos de ellos, pero probablemente no este, ya que es solo la documentación de React. Entonces, sí, cuando nos enfrentamos a esta situación, necesitamos una forma de avanzar que equilibre los factores de código con la entrega. Esa suele ser la razón por la que surge este tipo de cosas. Entonces, sí, lo que podríamos hacer entonces para comenzar a resolver esto es seguir el error. Identificar los efectos secundarios lógicos en nuestro hook personalizado que queremos reutilizar. Comenzaremos con eso.
Comments