Primeros Pasos en JavaScript
Primeros Pasos en JavaScript
1. Librería
Ejemplos:
Lodash: Ofrece utilidades para trabajar con arrays, objetos y otras estructuras de datos.
2. Biblioteca
Ejemplos:
React: Aunque a veces se llama librería, es una biblioteca para construir interfaces de
usuario.
3. Script
Ejemplos:
Un script para validar formularios: Un archivo JavaScript que valida la entrada del
usuario en un formulario.
Un script para realizar animaciones: Código JavaScript que anima elementos en una
página web.
Características:
Tamaño y Complejidad: Los scripts pueden variar en tamaño desde unas pocas líneas
hasta archivos grandes con múltiples funciones.
Diferencias
Librería: Conjunto de funcionalidades y herramientas reutilizables. Ejemplo: jQuery,
Lodash.
Biblioteca: Término similar a librería, a menudo usado para describir un conjunto más
completo de recursos y módulos. Ejemplo: React, D3.js.
Script: Archivo con código JavaScript que puede realizar una variedad de tareas.
Ejemplo: Un archivo que gestiona la lógica de un formulario.
Vite
-- --template react: Aquí es donde se especifica el tipo de plantilla que quieres usar.
react indica que deseas configurar un proyecto que usa React como librería de interfaz
de usuario.
React Js empezará a crear todos los ficheros que necesita para poder ser ejecutada,
razón por la cual tarda unos minutos.
2. Ingresamos al proyecto
cd fundamentos-react
Las dependencias son recursos que se usan, como, como librerías externas que se
pueden encontrar en el archivo package.json y con la ayuda de npm se instalan con el
fin de tener acceso a ellas en toda la aplicación.
npm install
Luego de creada la aplicación se corre el comando npm run dev para verificar su
funcionamiento en el servidor local:
Para comprobar que todo esté correcto, se abre en el navegador favorito (Chrome
preferiblemente) la siguiente url: http://localhost:5173/
Para abrir el proyecto en Visual Studio Code, se elige, en la página principal, la opción “Start” en
este caso deseamos dar en “Open”
4. Rutas
Para este proyecto se usará React Router que consiste en una librería que permite navegar
entre páginas y rutas que se han creado en la aplicación de React.
a. Para la instalación se abre una nueva terminal en Visual Studio Code, se detiene el
servicio que estaba corriendo con las teclas ctrl + c y se procede a instalar la librería:
npm install react-router-dom
b. Se vuelve a correr la aplicación con el siguiente comando:
e. Luego se crea una función llamada router a la cual se le agregan las rutas
necesarias para el proyecto, en este caso la ruta inicial path: "/" y una segunda
ruta path: "welcome".
f. Ahora para hacer uso de esta función router se pasa como parámetro a la
dependencia RouterProvider importada:
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<RouterProvider router={router}/>
</React.StrictMode>
)
Nota:
a. Se crea una carpeta dando click en la parte superior izquierda de Visual Studio. Aparece un
icono con una carpeta y la opción de agregar un nombre a la carpeta, la cual se llamará pages.
Es importante que la primera letra del nombre de la función esté en mayúscula, como en el ejemplo:
Welcome.
c. Abrimos el archivo main.jsx y (En lugar de tener <h1> en el main.jsx se puede importar la
página creada)
Primero se importa la página Welcome: para ello, insertamos la siguiente línea de código
Luego se usa en el element de la ruta <Welcome /> y de esta forma si se dirige a nuestra
ruta: http://127.0.0.?:517?/welcome, se tendrá el mensaje Welcome del div que se ha creado:
Probamos en el navegador que esté funcionando correctamente
6. Componentes
Los componentes son parte esencial de React Js. porque son la base para construir las
interfaces dinámicas para los usuarios finales.
Con las etiquetas de Html se pueden crear secciones estructuradas para darle contenido
a la página tales como: <section>, <h1>, <table>, <p>, <img> entre muchas otras
etiquetas que se pueden usar.
Para llevar esta sección de Html a React se crea una carpeta para los componentes
llamada components
<p>Shoulder drumstick leberkas velit ad ground round. Jowl voluptate pork chop ham hock veniam reprehenderit pork
loin minim.</p>
<button>Compartir</button>
</div>
)
}
<p>Shoulder drumstick leberkas velit ad ground round. Jowl voluptate pork chop ham hock
veniam reprehenderit pork loin minim.</p>
<button>Compartir</button>
</div>
)
}
Pero aún no se puede ver reflejada esta información, porque es necesario ir a la página
Welcome.jsx para importar el componente ya creado.
Quedaría así
7. Estilos
En una aplicación de React, hay varias formas de agregar estilos a los componentes. Cada
método tiene sus propias ventajas y casos de uso. Principales formas de aplicar estilos en React:
Puedes usar archivos CSS tradicionales para estilizar tus componentes. Los estilos se definen en
archivos .css y se importan en los componentes.
Ventajas:
Cómo hacerlo:
Los CSS Modules permiten que los estilos sean locales a un componente, evitando problemas de
colisión de nombres.
Ventajas:
Cómo hacerlo:
Styled Components es una librería que permite escribir estilos en JavaScript usando una sintaxis
similar a CSS. Los estilos se definen como componentes React.
Ventajas:
Cómo hacerlo:
1. Instala styled-components:
Emotion es otra librería CSS-in-JS que permite escribir estilos en JavaScript con soporte
para temas y estilos dinámicos.
Ventajas:
Alta performance.
Soporte para temas y estilos dinámicos.
Cómo hacerlo:
Inline Styles
Ventajas:
Tailwind CSS
Tailwind CSS es un framework de utilidades que proporciona clases CSS predefinidas para
construir diseños sin necesidad de escribir CSS personalizado.
Ventajas:
Cómo hacerlo:
En conclusión:
CSS Clásico: Usar archivos .css para aplicar estilos globales o locales.
CSS Modules: Encapsula estilos en componentes para evitar conflictos.
Styled Components y Emotion: Permiten escribir estilos en JavaScript con soporte para
temas y dinámicas.
Inline Styles: Aplicar estilos directamente en el atributo style de JSX.
Tailwind CSS: Utiliza clases de utilidades para construir estilos rápidos y responsivos.
Cada enfoque tiene sus ventajas, y la elección del método depende de tus necesidades
específicas y preferencias de desarrollo.
Vamos a utilizar framework de código abierto Tailwind CSS, herramienta que ofrece clases de
estilos predefinidas, en la que se puede estimar botones, formularios, secciones, hasta crear
componentes de mayor complejidad que con Tailwind, lo cual puede ser más sencillo y eficiente.
Configuración:
1. Se eliminan los archivos que por defecto vienen con la instalación de Vite + React
Para evitar un error al momento de correr la aplicación se abre el archivo App.jsx y se elimina la línea:
import './App.css' porque se estaría importando un archivo css que no existe.
Instalación de Tailwind
Se inicializa
Se inicializa el proyecto con Tailwind CSS y así crear los archivos de configuración
necesarios para su uso. Para ello en la consola ejecutamos el siguiente comando:
npx: Es una herramienta que viene con Node.js y que permite ejecutar paquetes de npm sin
necesidad de instalarlos globalmente en tu sistema. Es útil para ejecutar comandos de
herramientas que no necesitas instalar permanentemente.
tailwindcss: Es el nombre del paquete de Tailwind CSS. Al usar npx, estás diciendo que quieres
ejecutar el paquete de Tailwind CSS.
init: Es el comando que indica a Tailwind CSS que genere archivos de configuración
predeterminados.
-p: Es una opción que se utiliza para crear un archivo postcss.config.js junto con el archivo
tailwind.config.js. El archivo postcss.config.js se utiliza para configurar PostCSS, una
herramienta de procesamiento de CSS que puede utilizarse para agregar características
adicionales a tu CSS.
Cuando ejecutas npx tailwindcss init -p, se crean dos archivos en tu proyecto:
Estos archivos te permiten personalizar y configurar Tailwind CSS según las necesidades de tu proyecto.
@tailwind base;
@tailwind components;
@tailwind utilities;
Quedaría así
En React Js las clases de los elementos cambian a className y en este ejemplo se observa
cómo con 3 tipos de clases se agregan al elemento h1.
.title: {
font-weight: 700;
font-size: 1.875rem;
line-height: 2.25rem;
text-decoration-line: underline;
}
Se inicia creando una etiqueta <div> que encierre todo el contenido, de la siguiente forma:
A la etiqueta <div> se le agregan clases de tailwind para crear un diseño del componente
Profile.
Con esas clases se está creando un máximo del ancho, redondeando las esquinas superiores e
inferiores del elemento y agregando sombras alrededor del div.
Ahora dentro del div se agrega una imagen con el máximo de ancho del elemento <div>
Dentro de la imagen se crea otro <div> agregando padding para darle espacio a los
elementos.
Así vamos
Dentro del <div> que acabamos de crear se adicionan dos párrafos como título y subtítulo.
Por último, se agrega otro <div> con márgenes para darle espacio al botón.
Así quedaría
Guardamos y visualizamos en el navegador como vamos:
Los componentes permiten separar toda la interfaz de usuario en elementos que son
reutilizables y con los props se logra que cada una de estas piezas tengan un contenido
diferente y dinámico. Los props son una forma de pasar datos de un componente a otro en
React.
A cada componente se le asigna una propiedad llamada image y se envía a cada una la url de la
imagen que se desea cambiar. A cada componente Profile se propiedad llamada image.
return (
<div className='flex gap-4 justify-center mt-6'>
<Profile image="https://cdn.pixabay.com/photo/2023/01/19/10/24/castle-7728772_1280.jpg" />
<Profile image="https://cdn.pixabay.com/photo/2023/01/22/15/16/ocean-7736669_1280.jpg" />
<Profile image="https://cdn.pixabay.com/photo/2023/01/25/18/14/landscape-7744216_1280.jpg" />
</div>
)
}
Asignamos como parámetro recibir unos props y se ponen en un console.log para ver que
contiene esta propiedad:
Se inspecciona la página y para ver que en props se tiene un objeto de tipo { image: “https:
…” } con la url de la imagen.
src={props.image}
Observamos que ahora el componente tiene imágenes diferentes
PRIMER RETO:
Formulario
En la vista Welcome.jsx se cambian los estilos del primer div para dividir la vista en dos
columnas y tener en un apartado la tarjeta y en el otro apartado un formulario.
<div className='w-1/3'>
</div>
Para la creación del formulario se usa la etiqueta form de html para encerrar los inputs que se
van a manejar.
<form className='px-8 py-4 border rounded-md'> a este form se le agregan clases para tener
un border y darles un espacio a los elementos del interior.
Dentro del formulario se usa la etiqueta <span> para indicarle al usuario que información exacta
va a ingresar.
Después de la etiqueta <span> se usa la etiqueta <input> de Html para crear campos de texto
en los que el usuario puede ingresar su información.
</form>
<div className='mt-8'>
<button className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold
text-gray-700 mr-2 mb-2">Save</button>
</div>
¡Como resultado se obtiene una tarjeta con un formulario en el que se puede empezar a darle
vida a la aplicación!
8. Eventos de JavaScript
JavaScript dispone de una gran cantidad de eventos que se pueden usar para llevar el control de
la aplicación, como, por ejemplo:
● onClick: este evento se activa cuando un usuario hace click sobre alguna etiqueta como
un botón, un anchor, una imagen o un div para ejecutar una función en la que se obtenga
un resultado.
● onSubmit: su principal uso está en los formularios al momento de ingresar todos los
datos necesarios y activar el botón de enviar para que los datos sean ingresados a una
base de datos o realizar alguna otra funcionalidad.
En este ejemplo al dar click en alguna parte exterior del input el borde azul desaparece:
SEGUNDO RETO:
Abrimos Profile.jsx y aspignamos el evento a la imagen, para que cuando se pase el mouse
sobre ella aparezca un mensaje
Los Hooks son funciones que permiten “enganchar” el estado de React y el ciclo de vida
desde componentes de función (es.reactjs.org/, s.f. p. 9).
Un Hook en React es una función especial que te permite "enganchar" (de ahí el
nombre "hook") características de React, como el estado y el ciclo de vida, en
componentes funcionales. Antes de los Hooks, estas características solo estaban
disponibles en componentes de clase. Los Hooks permiten usar estas funcionalidades en
componentes funcionales, que son generalmente más concisos y fáciles de entender.
1. useState
Este hook permite agregar estados a una aplicación con el fin de modificar textos, arreglos,
datos lógicos (booleanos), objetos, entre otros.
Para hacer uso del hook se crea una constante y dentro de un arreglo, como primer elemento,
se tiene el valor que va a ser modificado y como segundo elemento la función que va a modificar
el primer valor, seguido de la igualdad, para lo cual se usa el hook de react useState(false)
donde se inicia el valor en falso const [showStudent, setShowStudent] = useState(false);
return (
<div className='m-10'>
<button
type="button"
className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700 mr-2 mb-2"
onClick={() => setIsStudent(true)}
>
Show text
</button>
{
isStudent && <p>Welcome 😃</p>
}
</div>
);
}
import React, { useState } from 'react'; Primero se importa la librería React y el hook
useState. useState es un hook que permite añadir estado a los componentes funcionales en
React.
· useState(false) inicializa una variable de estado isStudent con un valor inicial de false.
· isStudent es la variable que guarda el estado actual.
· <button>: Un botón con estilo, que al ser clicado ejecuta la función onClick.
· {isStudent && <p>Welcome 😃</p>}: Esta es una expresión condicional en JSX. Si isStudent
es true, se renderiza el párrafo <p>Welcome 😃</p>. Si isStudent es false, el párrafo no se
renderiza.
Este componente muestra un botón y, cuando se hace clic en él, cambia el estado isStudent a
true. Al hacerlo, se muestra el mensaje "Welcome 😃" debajo del botón. La lógica principal aquí
está en el uso del hook useState para manejar el estado del componente y en la renderización
condicional del mensaje basado en ese estado.
Creamos una nueva ruta llamada excer para acceder a la pagina creada.
Primero la importamos
{
path: “excer”,
Element:<Excer/>
Otro tipo de Hook que ermite ejecutar efectos secundarios en componentes funcionales, como fetch de datos,
suscripciones o manipulación del DOM.
Cómo Se Usa: Acepta una función que se ejecuta después de que el componente se
renderiza.
3.useContext
4. useReducer
Es una alternativa a useState para manejar estados más complejos, donde el siguiente estado
depende del anterior.
Cómo Se Usa: Usa un reductor (una función que recibe el estado actual y una acción y
devuelve el nuevo estado) para actualizar el estado.
5. useMemo
Memoriza el resultado de una función para evitar cálculos innecesarios si las dependencias no
cambian.
6. useCallback
Memoriza una función para evitar que se cree una nueva instancia de la función en cada
renderizado.
Los Hooks más comunes son useState, useEffect, useContext, useReducer, useMemo y
useCallback.
Los Hooks permiten escribir componentes más simples y reutilizables al evitar la complejidad de
las clases.
TERCER RETO:
useEffect
El hook useEffect se ejecuta después del primer renderizado de la aplicación y por lo tanto se
pueden crear acciones, requeridas en primera instancia, sin necesidad de hacer click en botones
o esperar a llamar una acción para poder ser ejecutada.
y el método recibe una función en la que se puede crear la lógica para cambiar estados y
llamadas a servicios externos.
useEffect(() => {
// code here
console.log('Me ejecuto despues del primer render de la aplicación');
}, [])
return (
<div className='m-10'>
<button
type="button"
className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold text-gray-700
mr-2 mb-2"
onClick={() => setIsStudent(true)}
>
Show text
</button>
{
isStudent && <p>Welcome 😃</p>
}
</div>
);
}
useEffect(() => {
let timer;
if (isStudent) {
return (
<div className='m-10'>
<button
type="button"
>
Show text
</button>
<button
type="button"
>
Hide text
</button>
</div>
);
Después de darle una revisada a algunos conceptos de React se puede darle vida al formulario y
a la tarjeta para que interactúen en conjunto
Se crea una función handleChange para obtener la información que el usuario va escribiendo en
cada uno de los campos, esta función recibe como parámetro un evento con todas las acciones
que el usuario ha ingresado.
Al dirigirse a la aplicación e inspeccionar el elemento, cada vez que se ingresa una letra aparece
por consola un objeto.
Al abrir el objeto se tienen diferentes propiedades que se pueden usar en el momento que sean
requeridas, la que es importante en este caso es target
setName(event.target.value);
return (
<div className="flex justify-center mt-6">
<div className='w-1/3'>
<Profile image="https://cdn.pixabay.com/photo/2023/01/19/10/24/castle-7728772_1280.jpg"
name={name} />
</div>
<div className='w-1/3'>
<form className='px-8 py-4 border rounded-md'>
<div className='mt-8'>
<button className="inline-block bg-gray-200 rounded-full px-3 py-1 text-sm font-semibold
text-gray-700 mr-2 mb-2">Save</button>
</div>
</form>
</div>
</div>
)
}
return (
<div className="max-w-sm rounded-md shadow-lg">
<img className="w-full h-72" src={image} alt="profile" />
CUARTO RETO:
Quedaria así
setName(event.target.value);
};
setDescription(event.target.value);
};
<Profile image="https://cdn.pixabay.com/photo/2023/01/19/10/24/castle-7728772_1280.jpg"
name={name} description={description} />
};
setDescription(event.target.value);
};
return (
<div className='w-1/3'>
<Profile image="https://cdn.pixabay.com/photo/2023/01/19/10/24/castle-7728772_1280.jpg"
name={name} description={description} />
</div>
<div className='w-1/3'>
<div className='mt-8'>
</div>
</form>
</div>
</div>
return (
</div>
</div>
</div>
}
export default Profile;
4. La imagen debe ser dinámica para que se pueda subir una foto desde el computador y verse
reflejada en la tarjeta.
La dinamiza es igual a como la hemos venido trabajando para modificar los campos anteriores,
debemos realizar el siguiente procedimiento:
En el archivo Welcome.jsx
if (file) {
reader.onloadend = () => {
};
reader.readAsDataURL(file);
};
3. Pasar la URL de la imagen al componente Profile.
<div className='w-1/3'>
</div>
setName(event.target.value);
};
setDescription(event.target.value);
};
if (file) {
reader.onloadend = () => {
};
reader.readAsDataURL(file);
}
};
return (
<div className='w-1/3'>
</div>
<div className='w-1/3'>
/>
<div className='mt-8'>
Compartir
</button>
</div>
</form>
</div>
</div>
);
};
Profile.jsx
return (
</div>
</div>
</div>
La creación de componentes reutilizables para los diferentes tipos de inputs, permite evitar la
repetición de código y mantener tus componentes más limpios.
// src/components/TextInput.js
<div className="mb-6">
<input
</div>
);
// src/components/FileInput.js
<div className="mb-6">
</div>
);
// src/components/RangeInput.js
<div className="mb-6">
/>
</div>
);
Modificamos cada uno de los elementos de los formularios teniendo en cuenta los componentes.
<form className='px-8 py-4 border rounded-md'>
setName(event.target.value);
};
setDescription(event.target.value);
};
if (file) {
const reader = new FileReader();
reader.onloadend = () => {
setImage(reader.result);
};
reader.readAsDataURL(file);
};
return (
<div className='w-1/3'>
</div>
<div className='w-1/3'>
<div className='mt-8'>
Enviar
</button>
</div>
</form>
</div>
</div>
);
};
En conclusión se han creado componentes TextInput, FileInput y RangeInput para manejar los
diferentes tipos de inputs. Estos componentes encapsulan la lógica y el estilo de los inputs,
haciendo que el código sea más limpio y fácil de mantener.
Uso en Welcome: En lugar de repetir el código para cada tipo de input, ahora se utilizan los
componentes reutilizables. Esto simplifica el componente Welcome y mejora su legibilidad.
Con esta estructura, se pueden agregar fácilmente nuevos tipos de inputs o modificar los
existentes sin tener que cambiar el código en varios lugares. Además, si en el futuro se requiere
cambiar el estilo o el comportamiento de los inputs, solo tendremos que hacerlo en un solo
lugar.
4. Crear la funcionalidad que desee con el botón “Save” y el evento onSubmit de JavaScript.
Para agregar la funcionalidad al botón "Save" utilizando el evento onSubmit, se requiere hacer
algunos ajustes en el componente Welcome y en el formulario.
Sugerencias:
Actualizar el botón a tipo submit (Puedes seguir los siguientes pasos para realizar el reto)
1. Cambia el botón dentro del formulario para que sea un botón de tipo submit en lugar de un
botón estándar.
2. Agregar el controlador de eventos onSubmit. Añade un controlador de eventos onSubmit al
formulario para manejar el envío de datos.
3. Funcionalidades Adicionales. Si deseas agregar funcionalidades adicionales, como mostrar un
mensaje de éxito o error después del envío, o resetear el formulario, puedes hacerlo dentro del
manejador handleSubmit.
¡ÉXITOS!