La organización de estilos en React puede parecer simple, pero conforme un proyecto crece puede volverse un desafío. Es fundamental separar cuidadosamente los estilos en archivos específicos. Podríamos tener un archivo CSS por cada componente, como un todoItem.css para contener los estilos del componente TodoItem. Así, podremos mantener la coherencia y facilitar el mantenimiento, actualizaciones o cambios en el futuro.
Para aplicar los estilos a los elementos de forma correcta, podemos separar la lógica de iconos. Creamos clases específicas como icon-container para el contenedor y una clase icon-svg para el SVG, dándoles estilos distintos, como ajustar su tamaño mediante propiedades CSS: width: 24px y height correspondiente.
Además, al emplear SVGs es importante recordar que podemos aplicar la propiedad fill directamente a través de CSS para cambiar sus colores, tanto de manera estática como dinámica.
¿Cómo añadir clases y enviar propiedades en componentes React?
Integrar clases y enviar propiedades a los componentes en React es una practica poderosa que permite dinamizar tu aplicación. En el caso de importar un SVG como React Component, puedes asignarle clases directamente desde el archivo JS donde se importa, lo cual se traduce en un manejo CSS más claro y eficiente.
Para el manejo de propiedades, si tenemos un componente que recibe props, como color, podemos utilizar esa propiedad para cambiar dinámicamente estilos y comportamientos. Si deseamos que, por ejemplo, un ícono tenga diferente color según su estado (completo o no), podemos enviar esta propiedad al componente y usarla en el elemento que lo necesite, como el SVG.
functionCompleteIcon({ completed }){const color = completed ?'green':'gray';return<SVGComponent className="icon-svg" fill={color}/>;}
¿Cómo manejar eventos y estados en React?
Gestionar eventos y estados en React es crucial para lograr una aplicación interactiva. Se pueden definir funciones que manejen interacciones específicas y luego asignar esas funciones a eventos en los elementos, como el onClick.
Aquí, los eventos se envían como props a los componentes, permitiendo que sean manejados de manera centralizada en el componente padre. Para mantener una comunicación fluida entre componentes y estados, se utilizan las props para enviar datos entre ellos.
Sin embargo, este enfoque puede volverse complicado si el número de props es elevado, resultando en un problema conocido como "prop drilling", que precisamente resolveremos con un enfoque más avanzado en módulos siguientes.
¿Cómo aplicar interacciones visuales con CSS en React?
Para mejorar la experiencia del usuario mediante interacciones visuales, CSS se convierte en una herramienta poderosa. Podemos manejar estados visuales como hover para cambiar el aspecto de los componentes al pasar el cursor sobre ellos.
Esto se logra aplicando selectores CSS específicos, como por ejemplo:
.icon-container:hover.icon-svg{fill:red;}
Este ejemplo ilustra cómo al pasar el mouse sobre el contenedor de un ícono, su color cambia. Este tipo de integración CSS potencia la interfaz de usuario, haciendo la aplicación más reactiva e intuitiva.
No hay que olvidar considerar la accesibilidad y experiencia de usuario al diseñar las interacciones, asegurando que las transiciones y cambios de estado visual tengan sentido en el contexto de la aplicación.
¿Qué vendrá en el desarrollo de una aplicación React?
El desarrollo de aplicaciones React no termina con interactividad básica. A medida que una aplicación crece, es necesario adaptarse a nuevas prácticas, herramientas y mecanismos de organización que faciliten el desarrollo sostenible y escalable. Esto incluye soluciones al "prop drilling" que te permitirá gestionar tus estados de manera más eficiente.
Por lo tanto, la exploración no termina aquí. Continuemos el viaje para mejorar nuestras habilidades y conocimientos en React, propiciando que cada componente y función dentro de nuestra aplicación encuentren su espacio correcto. De esta manera, lograremos estructuras que sean capaces de abordar incluso las crecientes necesidades de nuestros usuarios. ¡Nos vemos en el siguiente módulo donde estos temas se desarrollarán aún más!
¡¡¡Si como a mí casi se te estalla la cabeza!!!, espero este resumen te ayude un poco.
Debemos partir desde App.js que es el primer lugar en el cual enviamos una función encapsulada (el termino oficial es Render Props: “se refiere a una técnica para compartir código entre componentes en React utilizando una propiedad cuyo valor es una función ”) dentro de una prop a cada uno de los componentes TodoItem que se crean.
[Render Props - documentación]
(https://es.legacy.reactjs.org/docs/render-props.html)![1.jpg]
Como se aprecia estamos pasan esa función en onComplete y onDelete.
Luego en nuestro componente TodoItem las recibimos y nuevamente las pasamos en una prop que volvemos a llamar onComplete y onDelete(El pro las llama onClick).
Finalmente las recibiremos en nuestros componentes DeleteIcon y CompleteIcon respectivamente, y es ahí donde si crearemos ese evento que las ejecutará.
En resumen:
Muy buena ayuda!, hice casi lo mismo pero en un tablero, a parte, el "complete" y "completed" con la "d" al final es complejo de diferenciar. Con las flechas para saber donde sale cada cosa y repasarlo es muy buen método! Gracias!
Hola Jose gracias por la ayuda con lo que realizaste de las funciones encapsuladas. Te queria preguntar, me gusto mucho los colores de tu editor, nos podrias compartir el tema?
El tema de los iconos parece complicarse bastante en este caso cuando son personalizados... En mi caso desde hace varias clases ya tenia bajo recomendacion de otro companero unos iconos importados desde Font Awesome y logre solucionar estos problemas facilmente con CSS y algun que otro condicional sin recurrir a nuevos componentes, pero me imagino que para aplicaciones mas personalizadas si o si toca hacer esto..
Exactamente eso pense, yo con CSS y unos iconos de Font Awesome resolvi mi vida omg que caos es utilizarlo personalizado
Así es bro, te puedes ahorrar mucho tiempo utilizando iconos importados, como el casode: https://iconoir.com/
Entiendo que estas clases sirven para tener más habilidades y maneras de contextualizar tu trabajo, por eso sigo viendo paso a paso al profe para también no creerme que lo sé todo y no depender de estos servicios.
La verdad me parece gracioso que mucha gente se queja por que en platzi los cursos no son avanzados ni profundos, pero llega un tema como este que seguramente se tendra que hacer en la vida real y todos dicen “eso con una libreria sale”. Claro eso es logico pero se les olvida que una empresa que contrata un desarrollador que sepa React.js la mayoria de veces lo hace por que quiere cosas personalizadas, y en ese caso no saber hacer esto va a ser un verdadero problema.
Yo use css para el cambio de colores de los íconos...pero no sé si sea escalable o no ello
Buen momento para... Keep to calm and carry on!, Sé que al inicio la cabeza estalla, pero vengo del futuro y mi consejo es:
Sigue escribiendo y practicando con el codigo. No te desanimes y sigue tu aprendizaje. Verás como con el tiempo entiendes absolutamente todo y te sientes muy feliz de como has avanzado.
Clase 11 - Iconos en React: librerías y SVG
Primero usaramos los react-icons bastante comoda y facil desde varias librerias y formatos:
npm install react-icons --save
Y la manera de usarlos es bastante sencilla, primero debemos importar el icono:
import{FaBeer}from'react-icons/fa';
Y luego dentro del codigo lo usamos como si fuera un componente:
return<h4>Lets go for a <FaBeer/>?</h4>
Pero en la clase usaremos los iconos hechos por el Team Platzi!.
Bueno lo primero es definir dos archivos con los nombres de los iconos:
CompleteIcon.js:
Ahora debemos, crear un 3er archivos TodoIcon.js, dentro de este importamos los svg del TeamPLatzi (que tambien deben estar dentro de un archivo independiente) con los nombres de check.svg:
Yo normalmente uso https://boxicons.com/. Es bastante sencillo, lo importo como una fuente en mi archivo html y ya después voy llamando cada icono con la etiqueta <i> que me bota directamente la documentación que está en la página. Y como es una fuente pues es muy facil cambiarle el color tambíen.
ay mi cabeza jajaja siempre es complejo pero con práctica lo harémos. Que tal mi version Dark side of the force?
Así va quedando el mío
Totalmente engorroso :(
Pero hermoso
Este curso ya tiene bastante tiempo y al leer los comentarios sobre esta clase veo que muchos se quejaron por dar tanta vuelta solo para agregar los iconos. Mencionan que con la libreria lo agregaban mucho mas facil y rapido. Pero la verdad es que la clase es muy buena para saber como implementar nuestra propia librería de iconos y que esta sea dinámica, entonces es una muy buena clase.
En un futuro, tú elegirás que camino seguir dependiendo de los requerimientos del lugar donde trabajes y la realidad es que en la mayoría de empresas usan su propia librería de iconos entonces aplicaras mas lo visto en clase.
Te equivocas en una letra y se rompe Q DESESPERACIÓN!!!! JAJAJJA
Tuve que leer mi código varias veces para corregirlo y que funcione
Me costo entenderlo pero lo entendí asi:
Recordemos que en react parte de su filosofía es reutilizar componentes.
DeleteIcon y CompleteIcon estan reutilizando TodoICon. El resultado es diferente para cada uno ya que dependen de las propiedades que están mandando cada uno a TodoIcon y estas propiedades las recibe el objeto iconTypes que tiene 2 propiedades "check" y "delete" estas son funciones que devuelven el tipo de svg (que están importados al inico) y su color con su atributo fill (atributo para definir el relleno del svg).
Que bueno que el profesor nos muestre los dos caminos a elegir para implementar íconos. Si bien se hace tedioso implementarlos de manera personalizada, suele ser solicitada en proyectos o por los clientes, de esta maner ya conoces como hacerlo :D.
Me encanta el estilacho de Juan... definitivamente!
En esta sección, nos enfocaremos en mejorar la presentación y funcionalidad de nuestra aplicación mediante la implementación de íconos y eventos en React.
Íconos Personalizados con TodoIcon Library
Hemos creado una biblioteca de íconos personalizados llamada TodoIcon.
Cada ícono, como completeIcon y deleteIcon, se ha convertido en un componente React dentro de esta librería.
La librería permite enviar propiedades dinámicas, como color, a los íconos para personalizar su apariencia.
Estilos y Separación de Responsabilidades
Hemos separado los estilos relacionados con los íconos en un archivo dedicado llamado todoitem.css para mejorar la organización.
Utilizamos clases como icon-container y icon-svg para aplicar estilos a los contenedores y los elementos SVG de los íconos, respectivamente.
Manejo de Eventos y Prop Drilling
Hemos abordado el desafío del "prop drilling" al pasar eventos a través de varios niveles de componentes.
Cada ícono ahora traduce sus eventos a una propiedad onClick para facilitar su manipulación en componentes superiores.
Interactividad Mejorada
La aplicación ahora permite completar y eliminar tareas con éxito.
Implementamos la lógica para cambiar dinámicamente los colores de los íconos según el estado de la tarea.
Próximos Pasos y Consideraciones
Aunque hemos logrado una interactividad significativa, aún quedan aspectos por abordar, como la creación de nuevas tareas.
También anticipamos el desafío de escalar la aplicación a medida que crece, lo que requerirá la adopción de prácticas y conceptos más avanzados en React.
En la próxima clase y módulo, exploraremos la creación de nuevas tareas y abordaremos estrategias avanzadas para manejar proyectos React más grandes y complejos. ¡Sigue aprendiendo y mejorando tus habilidades de desarrollo con React!
el todoIcon como sabe si el evento onclik se debe dar con el oncomplete o el ondelete
Hola, Marlon.
Bueno, eso realmente lo defines en cada uno de los componentes, es decir, fíjate que el profesor creó un componente padre que a su vez tenía dos componentes dentro como hijos y dependiendo de cada uno se le daba una propiedad, entonces el hijo con el nombre complete recibe toda la lógica que debe llevar el completar una tarea: tachado, color verde el check, etc., y recuerda que a los elementos de HTML se les pueden pasar eventos y uno de ellos fue el onClick que llame a una función y esa función tiene que aplicar algo en específico que en este caso era aplicar estilos.
El TodoIcon simplemente ejecuta la funcion que le pasamos como prop en el evento onClick.
Somos nosotros quienes al pasarle la funcion onComplete u onDelete como parametro estamos diciendole cual ejecutar y esta es la forma en la que sabe cual de las dos ejecutar.
Por ejemplo si en el evento onDelete, el cual se ve asi
Pese a que en la interfaz muestre el icono de la X y se vea rojo cuando hacemos hover, no va a eliminar nada, pues va a ejecutar la funcion onComplete cuando deberia ser la funcion onDelete
Buenas noches! Me da un error en el archivo TodoIcon.js y me dice que "type" no esta definida, pero la definí en CompleteIcon y DeleteIcon 😓