¡Prueba de fuego!
Clase 13 de 15 • Curso de Creación de Librerías UI para React
Contenido del curso
Clase 13 de 15 • Curso de Creación de Librerías UI para React
Contenido del curso
Rubén Hernández Hernández
Gilbert Ardila
fabian.quintanilla03
Daniel Rodrigo Valdivieso Merino
Cesidio Antonio Di Benedetto Carri
Cesidio Antonio Di Benedetto Carri
Diego Vergara
Luis Eduardo Martínez Espinoza
Juan Camilo Lentino Villalba
En mi caso no me funcionaba porque faltaba la dependencia de prop-types(hice mi proyecto con Vite).
La solución fué poner prop-types como dependencia normal (no de desarrollo) en la librería:
"dependencies": { "@emotion/css": "^11.9.0", "prop-types": "^15.8.1" }, "devDependencies": { ... }
bueno y como la hiciste con vite ¿tuviste que hacer toda la configuración del inicio o no? me nació esa pregunta desde el principio
que pasa si quiero separar las cosas por carpetas, es decir supongamos que en la misma carpeta Buttons tengo dos componentes, Button y ButtonFlat y quiero poder importarlos de la siguiente manera
import {ButtonFlat} from 'basico-creacion-libreriasui/Button'
Como tendrian que estar exportando mis archivos index los componentes ?
Depende, de si se repite mucho código.
En programación tenemos en cuenta el principio DRY 'Don't Repeat Yourself'
Si vez que el código del componente se repite, así sea lógica, layout o estilos lo mejor posiblemente sea hacer un componente que por props sea modificado.
Ahora, si vez que te tardará mucho tiempo hacer un componente robusto y agnostico que se modifique por props tal vez es mejor hacer dos componentes.
Ten encuenta que debes tomar las desiciones de acuerdo a lo que crees que tu equipo necesita, velocidad o altísima calidad en los componentes.
Saludos 💚
Me manda error como si la libreria no existiria
ERROR in ./node_modules/green-design/src/index.js 1:0-45 Module not found: Error: Can't resolve './Button' in 'D:\cursos\material-UI-React\node_modules\green-design\src'
No me acordaba que habia creado una carpeta extra para separar componentes simples y complejos XD... corregi la ruta y funciono!
Yupi!!!
Ascribe la función para el botón before de esta manera para evitar que el ID sea menor a 1
const handleDecrease = () => { idChar > 1 ? setIdChar(idChar - 1) : setIdChar(1) }
yo le añadí 2 nuevos estados
const [back, setBack] = useState(true) const [next, setNext] = useState(false)
y se los di como valor de la propiedad disabled de los botones, y estos mismos estados los utilice como sentencia para un operador ternario para controlar el valor de la propiedad bgColorHover
<Button disabled={back} width="150px" height="40px" bgColorHover={back ? '' : 'red'} onClick={handleDecrement}>{'<Back'}</Button> <Button disabled={next} width="150px" height="40px" bgColorHover={next ? '' : 'green'} onClick={handleIncrement}>{'Next>'}</Button>
todo esto con el fin de limitar el valor de numCharacter, que nunca pueda ser menor a 1 o mayor a 826 (numero de personajes de la API), la interfaz no lo permitirá, y para eso utilice una función para controlar los estados de back y next
const handleDisabled = ()=> { if (numCharacter === 1){ setBack(true) } else { setBack(false) } if (numCharacter === 826){ setNext(true) } else { setNext(false) } }
esta función se ejecutara cada vez que el valor de numCharacter cambie
useEffect(()=> { gettinCharacter(numCharacter) handleDisabled() }, [numCharacter])
el código completo quedaría de esta manera src/App.js:
import { useEffect, useState } from 'react'; import { Button, ContainerFlex, MediaImg, Text } from 'curso-creacion-librerias-ui' import { gettinData } from './services'; function App() { const [back, setBack] = useState(true) const [next, setNext] = useState(false) const [numCharacter, setNumCharacter] = useState(1) const [characters, setCharacters] = useState({}) const gettinCharacter = async (character)=> { const response = await gettinData(character) setCharacters(response) console.log(response) } useEffect(()=> { gettinCharacter(numCharacter) handleDisabled() }, [numCharacter]) const handleDisabled = ()=> { if (numCharacter === 1){ setBack(true) } else { setBack(false) } if (numCharacter === 826){ setNext(true) } else { setNext(false) } } const handleIncrement = ()=> { setNumCharacter(numCharacter+1) } const handleDecrement = ()=> { setNumCharacter(numCharacter-1) } return ( <div className="App"> <ContainerFlex flexDirection="column" justifyContent="space-evenly" alignItems="center" height="100vh" gap="8px" > <MediaImg src={characters.image || ''} width="200px" height="200px" alt={characters.name || ''} /> <Text component="h3" fontSize="18px" lineHeight="10px">{characters.name}</Text> <Text component="p" fontSize="18px" lineHeight="10px">{characters.id}</Text> <Text component="p" fontSize="18px" lineHeight="10px">{characters.species}</Text> <Text component="p" fontSize="18px" lineHeight="10px">{characters.status}</Text> <ContainerFlex flexDirection="row" justifyContent="center" alignItems="center" gap="8px" > <Button disabled={back} width="150px" height="40px" bgColorHover={back ? '' : 'red'} onClick={handleDecrement}>{'<Back'}</Button> <Button disabled={next} width="150px" height="40px" bgColorHover={next ? '' : 'green'} onClick={handleIncrement}>{'Next>'}</Button> </ContainerFlex> </ContainerFlex> </div> ); } export default App;
src/services.js:
const urlFetch = 'https://rickandmortyapi.com/api/character/' export const gettinData = async (character)=> { const response = await fetch(`${urlFetch}${character}`, { method: 'GET' }) const payload = response.json() return payload }