Guia de Estudio - Programacion III - Vue - JS, Tailwind CSS y AG Grid
Guia de Estudio - Programacion III - Vue - JS, Tailwind CSS y AG Grid
SOLUCIÓN que aporta: JavaScript moderno (ES6+) introduce herramientas que hacen el código más
seguro, predecible y fácil de mantener.
📖 DEFINICIÓN DETALLADA:
🔸 VARIABLE:
● QUÉ ES: Un "contenedor" con nombre donde guardas información (números, texto, objetos)
● PARA QUÉ: Almacenar datos que tu programa puede usar y modificar
● EJEMPLO: let edad = 25 → creas una caja llamada "edad" que contiene el número 25
🔸 SCOPE (ÁMBITO):
● QUÉ ES: El "territorio" o zona del código donde una variable puede ser accedida
● PARA QUÉ: Controlar dónde y cuándo se pueden usar las variables
● TIPOS:
○ Scope de función: Variable existe en toda la función (peligroso)
○ Scope de bloque: Variable existe solo entre llaves {} (seguro)
🔸 VAR (método antiguo):
● QUÉ ES: Palabra clave para declarar variables con scope de función
● PROBLEMA: La variable puede "escaparse" del bloque donde la creaste
● POR QUÉ es malo: Causa bugs impredecibles
● EJEMPLO DEL PROBLEMA:
if (true) {
var mensaje = "Hola"; // Se declara dentro del if
}
console.log(mensaje); // ¡Funciona! Pero no debería (se escapó del if)
🔸 LET:
● QUÉ ES: Palabra clave moderna para variables que pueden cambiar
● PARA QUÉ: Declarar variables que van a ser modificadas después
● VENTAJA: Scope de bloque (se queda donde la pones)
● EJEMPLO:
🔸 CONST:
● QUÉ ES: Palabra clave para variables que NO deben cambiar de valor
● PARA QUÉ: Declarar valores que permanecen constantes
● IMPORTANTE: No se puede reasignar, pero el contenido de objetos SÍ se puede modificar
● EJEMPLO:
// ✅ Válido
❌ Error: no se puede cambiar
const PI = 3.1416;
// PI = 3.14; //
ANALOGÍA:
❌
// PROBLEMA CON VAR
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // Imprime: 3, 3, 3
}
✅
// SOLUCIÓN CON LET
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // Imprime: 0, 1, 2
}
❌
persona.nombre = "Luis"; // VÁLIDO - modifica contenido
persona = {nombre: "Carlos"}; // ERROR - no se puede reasignar
Funciones Flecha: Sintaxis y Contexto
🎯 RAZÓN DE SER:
● PROBLEMA: Las funciones tradicionales cambian su identidad (this) según dónde se ejecuten
● SOLUCIÓN: Las funciones flecha mantienen la identidad (this) de donde nacieron
● PARA QUÉ: Escribir menos código y evitar confusión con el contexto
ANALOGÍA:
🎯 RAZÓN DE SER:
● PROBLEMA: Manipular arrays con bucles tradicionales es verboso y propenso a errores
● SOLUCIÓN: Métodos especializados que expresan claramente la intención
● PARA QUÉ: Código más legible, menos bugs, y pensamiento funcional
● Inmutabilidad: No modifican el array original (como hacer fotocopias en lugar de escribir sobre
el original)
● Expresividad: El nombre del método dice exactamente qué hace
● Composición: Se pueden encadenar para operaciones complejas
const estudiantes = [
{nombre: "Ana", nota: 95},
{nombre: "Luis", nota: 70},
{nombre: "María", nota: 85}
];
✅
// SOLUCIÓN
const dobles = numeros.map(n => n * 2); // [2, 4, 6]
🎯 VUE.JS: FRAMEWORK REACTIVO
🤔 RAZÓN DE SER: ¿Por qué existe Vue.js?
PROBLEMA que resuelve: Manipular el DOM directamente (como jQuery) es tedioso, propenso a
errores, y difícil de mantener. Cada cambio en los datos requiere múltiples líneas de código para
actualizar la interfaz.
SOLUCIÓN que aporta: Vue.js hace que la interfaz se actualice automáticamente cuando cambian los
datos. Es declarativo: describes QUÉ quieres, no CÓMO lograrlo.
PARA QUÉ: Desarrollo más rápido, menos bugs, código más mantenible.
ANALOGÍA: Es como tener un asistente personal que actualiza toda tu casa automáticamente cuando
cambias de opinión, en lugar de que tengas que ir habitación por habitación haciendo cambios
manualmente.
Reactividad: El Superpoder de Vue
🎯 RAZÓN DE SER:
● PROBLEMA: En JavaScript vanilla, cuando cambias un dato tienes que manualmente actualizar
todos los lugares donde aparece en la interfaz
● SOLUCIÓN: Vue observa los datos y actualiza automáticamente todos los lugares donde se
usan
● PARA QUÉ: Eliminar la sincronización manual entre datos e interfaz
ANALOGÍA: Como un espejo mágico - cuando te mueves, automáticamente refleja todos tus
movimientos sin que tengas que decirle qué hacer.
<template>
<div>
<h1>{{ titulo }}</h1>
<button @click="contador++">
Clicks: {{ contador }}
</button>
</div>
</template>
<script>
export default {
data() {
return {
titulo: "Mi App Vue",
contador: 0
}
}
}
</script>
📖 DEFINICIÓN DETALLADA:
🔸 DIRECTIVA:
● QUÉ ES: Atributos especiales que empiezan con v- que le dan "superpoderes" al HTML
● PARA QUÉ: Conectar HTML estático con JavaScript dinámico
● CÓMO FUNCIONA: Vue las reconoce y ejecuta código JavaScript cuando las encuentra
● EJEMPLO: <p v-if="mostrar">Texto</p> → Vue evalúa la variable mostrar y decide si
mostrar el párrafo
<div v-if="usuario.esAdmin">
<p>Panel de administrador</p> <!-- Solo existe si es admin -->
</div>
🔸 v-show (RENDERIZADO CONDICIONAL - CSS):
● QUÉ ES: Directiva que oculta elementos con CSS (display: none)
● PARA QUÉ: Mostrar/ocultar contenido sin destruir el elemento
● IMPORTANTE: El elemento siempre existe en el DOM, solo se oculta
● CUÁNDO USAR: Para contenido que se muestra/oculta frecuentemente
● EJEMPLO:
<div v-show="menuAbierto">
<p>Contenido del menú</p> <!-- Siempre existe, solo se oculta -->
</div>
<ul>
<li v-for="producto in productos" :key="producto.id">
{{ producto.nombre }} - ${{ producto.precio }}
</li>
</ul>
<button @click="contador++">Incrementar</button>
<button @click="miFuncion">Ejecutar función</button>
🔸 :class y :style (ATRIBUTOS DINÁMICOS):
● QUÉ ES: Forma de hacer que las clases CSS y estilos cambien según los datos
● PARA QUÉ: Interfaces que reaccionan visualmente a los cambios de estado
● EJEMPLO:
🎯 RAZÓN DE SER:
● PROBLEMA: HTML estático no puede reaccionar a cambios de datos o eventos del usuario
● SOLUCIÓN: Las directivas conectan HTML con JavaScript de forma declarativa
● PARA QUÉ: Hacer que el HTML "cobre vida" y reaccione a los datos
ANALOGÍA: Como comandos mágicos que transforman HTML aburrido en una interfaz interactiva
v-show Cambiar visibilidad sin afectar rendimiento Ocultar sin destruir elemento
<template>
<!-- Enlace bidireccional -->
<input v-model="mensaje" placeholder="Escribe algo">
¿Por qué es importante :key? Sin key único, Vue no puede distinguir entre elementos cuando la lista
cambia. Es como intentar organizar personas idénticas en una fila.
📖 DEFINICIÓN DETALLADA:
🔸 COMPONENTE:
● QUÉ ES: Un bloque reutilizable de interfaz que incluye HTML, CSS y JavaScript juntos
● PARA QUÉ: Dividir aplicaciones grandes en piezas pequeñas y manejables
● CÓMO FUNCIONA: Como una "función" pero para interfaz de usuario
● EJEMPLO: Un componente <BotonPrimario> se puede usar en toda la aplicación
● VENTAJAS:
○ Reutilización: Escribes una vez, usas en muchos lugares
○ Mantenimiento: Cambias en un lugar, se actualiza en todos lados
○ Organización: Cada pieza tiene su responsabilidad específica
🔸 PROPS (PROPIEDADES):
● QUÉ ES: Datos que un componente padre envía a un componente hijo
● PARA QUÉ: Comunicar información de arriba hacia abajo en la jerarquía
● CÓMO FUNCIONA: Como parámetros de una función, pero para componentes
● IMPORTANTE: Son de solo lectura (inmutables) para el componente hijo
● EJEMPLO:
🔸 COMPONENTE PADRE:
● QUÉ ES: Componente que contiene y controla otros componentes
● RESPONSABILIDAD: Coordinar la comunicación entre componentes hijos
● ANALOGÍA: Como un director de orquesta que coordina a todos los músicos
🔸 COMPONENTE HIJO:
● QUÉ ES: Componente que está contenido dentro de otro componente
● RESPONSABILIDAD: Realizar una tarea específica con los datos que recibe
● ANALOGÍA: Como un músico especialista que toca su instrumento según las indicaciones
<script setup>
// Forma simple
const props = defineProps(['nombre', 'edad']);
<script setup>
const emit = defineEmits(['guardar', 'cancelar', 'actualizar']);
// Emitir un evento
emit('guardar', { id: 123, nombre: 'Juan' });
</script>
🎯 RAZÓN DE SER:
● PROBLEMA: Aplicaciones grandes se vuelven inmanejables si todo está en un solo archivo
● SOLUCIÓN: Dividir la interfaz en piezas pequeñas, reutilizables y especializadas
● PARA QUÉ: Código organizado, reutilizable y fácil de mantener en equipo
ANALOGÍA: Como una empresa bien organizada donde cada empleado tiene una especialidad
//✅ SOLUCIÓN
const incrementar = () => {
emit('incrementar'); // Reportar al jefe para que decida
};
🎯 TAILWIND CSS: DISEÑO UTILITARIO
🤔 RAZÓN DE SER: ¿Por qué existe Tailwind CSS?
PROBLEMA que resuelve:
● CSS tradicional genera archivos gigantes llenos de estilos que nunca se usan
● Crear nombres de clases CSS es difícil y causa inconsistencias
● Mantener estilos consistentes en equipos grandes es complicado
PARA QUÉ: Desarrollo más rápido, archivos más pequeños, diseños consistentes
ANALOGÍA: Como tener un kit de LEGO profesional donde cada pieza tiene un propósito específico y se
puede combinar infinitamente
Filosofía Utility-First
📖 DEFINICIÓN DETALLADA:
🔸 UTILITY-FIRST (UTILITARIO PRIMERO):
● QUÉ ES: Filosofía de diseño donde usas muchas clases pequeñas y específicas en lugar de
escribir CSS personalizado
● PARA QUÉ: Acelerar el desarrollo y garantizar consistencia
● CÓMO FUNCIONA: Cada clase hace UNA cosa específica (como p-4 = padding de 16px)
● EJEMPLO:
🔸 SISTEMA DE ESPACIADO:
● QUÉ ES: Escala predefinida de valores para márgenes y paddings
● PARA QUÉ: Garantizar espaciado consistente en toda la aplicación
● CÓMO FUNCIONA: Múltiplos de 4px (sistema de 8pt grid)
● EJEMPLOS:
○ p-1 = 4px
○ p-2 = 8px
○ p-4 = 16px
○ p-6 = 24px
○ p-8 = 32px
🔸 PALETA DE COLORES:
● QUÉ ES: Sistema organizado de colores con nombres consistentes
● PARA QUÉ: Usar colores coherentes sin inventar nuevos
● ESTRUCTURA: {color}-{intensidad}
● EJEMPLOS:
○ blue-100 → azul muy claro
○ blue-500 → azul medio (por defecto)
○ blue-900 → azul muy oscuro
🔸 MOBILE-FIRST:
● QUÉ ES: Enfoque donde diseñas primero para móvil, luego añades estilos para pantallas más
grandes
● PARA QUÉ: Garantizar que la aplicación funcione bien en móviles
● CÓMO FUNCIONA:
○ Clases sin prefijo → aplican a móvil y hacia arriba
○ Clases con prefijo → aplican solo a pantallas más grandes
● EJEMPLO:
🔸 TREE-SHAKING:
● QUÉ ES: Proceso que elimina automáticamente el CSS que no usas
● PARA QUÉ: Archivos finales más pequeños y páginas más rápidas
● CÓMO FUNCIONA: Tailwind escanea tu código y solo incluye las clases que realmente usas
ANALOGÍA: Como usar piezas de LEGO estándar en lugar de tallar cada pieza desde cero
¿Por qué es importante la consistencia? Con Tailwind no tienes que recordar si usaste margin:
12px o margin: 16px en otro lugar. El sistema garantiza consistencia.
Responsive Design
¿Cómo funciona mobile-first? Las clases sin prefijo aplican a móvil y hacia arriba. Los prefijos (md:,
lg:) aplican a pantallas más grandes.
ANALOGÍA: Como tener un bibliotecario súper eficiente que puede organizar, filtrar y presentar millones
de libros instantáneamente
Configuración Básica
📖 DEFINICIÓN DETALLADA:
🔸 columnDefs (DEFINICIONES DE COLUMNA):
● QUÉ ES: Array de objetos que define cómo se comporta cada columna de la tabla
● PARA QUÉ: Configurar qué datos mostrar y cómo mostrarlos
● ESTRUCTURA BÁSICA:
const columnDefs = [
{
headerName: 'País', // Título visible para el usuario
field: 'nombre', // Propiedad del objeto de datos
sortable: true, // Permite ordenar haciendo clic
filter: true, // Permite filtrar los datos
width: 200 // Ancho de la columna en pixels
}
];
🔸 field (CAMPO):
● QUÉ ES: Nombre de la propiedad del objeto que se mostrará en esa columna
● PARA QUÉ: Conectar los datos del array con las columnas de la tabla
● IMPORTANTE: Debe coincidir exactamente con el nombre de la propiedad
● EJEMPLO:
✅ Correcto
// El field debe ser:
{
field: 'poblacion',
valueFormatter: params => {
return params.value.toLocaleString(); // 47000000 → "47,000,000"
}
}
{
field: 'bandera',
cellRenderer: params => {
return `<img src="${params.value}" width="30" height="20">`;
}
}
const rowData = [
{ id: 1, nombre: 'España', poblacion: 47000000, bandera: 'spain.png' },
{ id: 2, nombre: 'Francia', poblacion: 67000000, bandera: 'france.png' }
];
const gridOptions = {
columnDefs: columnDefs, // Configuración de columnas
rowData: datos, // Los datos a mostrar
pagination: true, // Activar paginación
paginationPageSize: 20, // 20 filas por página
defaultColDef: { // Configuración por defecto para todas las columnas
sortable: true,
filter: true,
resizable: true
}
};
🔸 PAGINATION (PAGINACIÓN):
● QUÉ ES: Función que divide los datos en páginas más pequeñas
● PARA QUÉ: Manejar grandes cantidades de datos sin afectar el rendimiento
● VENTAJAS:
○ Mejora velocidad de carga
○ Mejor experiencia de usuario
○ Reduce uso de memoria
🔸 VIRTUALIZACIÓN:
● QUÉ ES: Técnica que solo renderiza las filas visibles en pantalla
● PARA QUÉ: Manejar millones de filas sin problemas de rendimiento
● CÓMO FUNCIONA: AG Grid crea/destruye elementos DOM según necesidad
● ANALOGÍA: Como una biblioteca infinita que solo materializa los libros que puedes ver
pagination Renderizar miles de filas causa lentitud Dividir datos para mejor rendimiento
virtualización DOM se vuelve lento con muchos Solo crear elementos visibles
elementos
POR QUÉ la configuración declarativa: En lugar de manipular la tabla con JavaScript imperativo,
describes CÓMO debe comportarse cada columnaName: 'País', // Lo que ve el usuario field: 'nombre', //
Propiedad del objeto sortable: true, // Se puede ordenar filter: true // Se puede filtrar }, { headerName:
'Población', field: 'poblacion', valueFormatter: params => params.value.toLocaleString() // Formato de
números } ];
const gridOptions = { columnDefs: columnDefs, rowData: paises, // Array de datos pagination: true, //
Dividir en páginas paginationPageSize: 20 // 20 filas por página };
🚨
** Error común:** Field no coincide con propiedad
❌
```javascript
// PROBLEMA
const columnDefs = [
{ field: 'nombre', headerName: 'País' } // Busca 'nombre'
];
const data = [{name: 'España'}]; // Pero se llama 'name'
// ✅ SOLUCIÓN
const columnDefs = [
{ field: 'name', headerName: 'País' } // Coincide con propiedad real
];
🎯 MANEJO DE APIs: COMUNICACIÓN EXTERNA
🤔 RAZÓN DE SER: ¿Por qué es crítico el manejo profesional de APIs?
PROBLEMA que resuelve:
ANALOGÍA: Como ser un diplomático experto que gestiona comunicación internacional con protocolos
claros, manejo de malentendidos, y planes de contingencia
Estados Esenciales
📖 DEFINICIÓN DETALLADA:
🔸 API (APPLICATION PROGRAMMING INTERFACE):
● QUÉ ES: Interfaz que permite que dos aplicaciones se comuniquen entre sí
● PARA QUÉ: Obtener datos de servicios externos (como bases de datos en otros servidores)
● ANALOGÍA: Como un mesero en un restaurante que toma tu pedido y te trae la comida, pero tú
no entras a la cocina
● EJEMPLO: Tu app pide datos de países a https://restcountries.com/v3.1/all
🔸 HTTP REQUEST (PETICIÓN HTTP):
● QUÉ ES: Mensaje que tu aplicación envía a un servidor pidiendo algo
● PARA QUÉ: Solicitar datos, enviar información, actualizar o eliminar datos
● TIPOS PRINCIPALES:
○ GET → Pedir datos (leer)
○ POST → Enviar datos nuevos (crear)
○ PUT → Actualizar datos existentes
○ DELETE → Eliminar datos
● EJEMPLO:
fetch('https://api.ejemplo.com/usuarios', {
method: 'GET', // Tipo de petición
headers: { 'Content-Type': 'application/json' }
})
{
"nombre": "España",
"poblacion": 47000000,
"capital": "Madrid",
"idiomas": ["español"]
}
🔸 ASYNC/AWAIT:
● QUÉ ES: Forma moderna de escribir código que espera respuestas sin bloquear la aplicación
● PARA QUÉ: Manejar operaciones que toman tiempo (como llamadas a APIs) de forma legible
● POR QUÉ es importante: Las peticiones de red toman tiempo impredecible
● EJEMPLO:
🔸 PROMISE (PROMESA):
● QUÉ ES: Objeto que representa una operación asíncrona que eventualmente se completará
● PARA QUÉ: Manejar operaciones que no sabemos cuándo terminarán
● ESTADOS:
○ Pending: En progreso
○ Resolved/Fulfilled: Completada exitosamente
○ Rejected: Falló con error
● ANALOGÍA: Como un ticket de reparación que te dan en el taller - es una "promesa" de que tu
auto estará listo en el futuro
🔸 TRY/CATCH/FINALLY:
● QUÉ ES: Estructura para manejar errores de forma controlada
● PARA QUÉ: Evitar que la aplicación se "rompa" cuando algo sale mal
● PARTES:
○ try: Intenta ejecutar código que puede fallar
○ catch: Maneja el error si ocurre
○ finally: Se ejecuta SIEMPRE (haya error o no)
● EJEMPLO:
try {
const resultado = await operacionPeligrosa();
console.log('Éxito:', resultado);
} catch (error) {
console.error('Error:', error.message);
mostrarErrorAlUsuario('Algo salió mal');
} finally {
ocultarSpinner(); // Se ejecuta siempre
}
🔸 TRANSFORMACIÓN DE DATOS:
● QUÉ ES: Proceso de convertir datos de la API al formato que necesita tu aplicación
● PARA QUÉ: Las APIs pueden cambiar, pero tu aplicación debe seguir funcionando
● EJEMPLO:
1. Loading - El usuario debe saber que algo está pasando (evita clics múltiples)
2. Success - Confirma que la operación funcionó (feedback positivo)
3. Error - Explica qué salió mal y qué puede hacer (experiencia de usuario digna)
const apiService = {
async obtenerPaises() {
try {
this.loading = true; // Mostrar spinner
this.error = null; // Limpiar errores previos
const respuesta = await fetch('https://api.com/paises');
if (!respuesta.ok) {
throw new Error(`Error HTTP: ${respuesta.status}`);
}
} catch (error) {
this.error = 'Error al cargar países';
throw error;
} finally {
this.loading = false; // Ocultar spinner siempre
}
}
};
//✅ SOLUCIÓN
const response = await fetch('/api/data');
if (!response.ok) {
throw new Error(`Error HTTP: ${response.status}`);
}
return response.json();
📚 GLOSARIO COMPLETO DE TÉRMINOS TÉCNICOS
📖 JAVASCRIPT MODERNO
🔸 ES6+ (ECMASCRIPT 6+):
● QUÉ ES: Versiones modernas del estándar JavaScript (desde 2015 en adelante)
● PARA QUÉ: Proporcionar herramientas más seguras y expresivas para programar
🔸 HOISTING:
● QUÉ ES: Comportamiento donde JavaScript "eleva" las declaraciones al inicio de su scope
● PARA QUÉ: Entender por qué algunas variables están disponibles antes de ser declaradas
● PROBLEMA: Con var puede causar comportamientos inesperados
🔸 LEXICAL SCOPE:
● QUÉ ES: El scope se determina por dónde está escrita la función en el código
● PARA QUÉ: Las funciones flecha heredan el this de donde fueron definidas
🔸 CLOSURE:
● QUÉ ES: Función que "recuerda" las variables de su scope exterior
● PARA QUÉ: Mantener acceso a variables incluso después de que la función exterior termine
🔸 INMUTABILIDAD:
● QUÉ ES: Principio de no modificar datos existentes, sino crear copias nuevas
● PARA QUÉ: Evitar efectos secundarios y hacer el código más predecible
📖 VUE.JS
🔸 FRAMEWORK:
● QUÉ ES: Conjunto de herramientas y reglas que facilitan crear aplicaciones
● PARA QUÉ: No tener que programar todo desde cero
🔸 PROGRESIVO:
● QUÉ ES: Se puede adoptar gradualmente en proyectos existentes
● PARA QUÉ: No necesitas reescribir todo tu proyecto para usar Vue
🔸 REACTIVO/REACTIVIDAD:
● QUÉ ES: Sistema que detecta cambios en datos y actualiza automáticamente la interfaz
● PARA QUÉ: Eliminar sincronización manual entre datos y vista
🔸 TEMPLATE:
● QUÉ ES: La parte visual del componente donde escribes HTML con superpoderes
● PARA QUÉ: Definir cómo se ve la interfaz de usuario
🔸 DECLARATIVO vs IMPERATIVO:
● DECLARATIVO: Describes QUÉ quieres (Vue style)
● IMPERATIVO: Describes CÓMO lograrlo paso a paso (jQuery style)
🔸 INTERPOLACIÓN:
● QUÉ ES: Sintaxis {{ }} para mostrar variables en el template
● PARA QUÉ: Insertar datos dinámicos en HTML
🔸 BINDING (ENLACE):
● QUÉ ES: Conectar datos de JavaScript con atributos HTML usando :
● PARA QUÉ: Hacer que atributos HTML sean dinámicos
🔸 EVENT LISTENER:
● QUÉ ES: Función que escucha eventos del usuario (clicks, teclas, etc.)
● PARA QUÉ: Reaccionar a acciones del usuario
📖 TAILWIND CSS
🔸 FRAMEWORK CSS:
● QUÉ ES: Conjunto de estilos CSS predefinidos y organizados
● PARA QUÉ: Acelerar el desarrollo de interfaces
🔸 ATOMIC CSS:
● QUÉ ES: Enfoque donde cada clase hace exactamente una cosa
● PARA QUÉ: Máxima reutilización y consistencia
🔸 DESIGN SYSTEM:
● QUÉ ES: Conjunto coherente de principios, componentes y patrones de diseño
● PARA QUÉ: Mantener consistencia visual en toda la aplicación
🔸 RESPONSIVE DESIGN:
● QUÉ ES: Diseño que se adapta a diferentes tamaños de pantalla
● PARA QUÉ: Una sola aplicación que funciona en móvil, tablet y desktop
🔸 CSS GRID:
● QUÉ ES: Sistema de layout bidimensional (filas y columnas)
● PARA QUÉ: Crear layouts complejos de forma sencilla
🔸 FLEXBOX:
● QUÉ ES: Sistema de layout unidimensional (horizontal o vertical)
● PARA QUÉ: Alinear y distribuir elementos en una dirección
📖 AG GRID
🔸 DATA GRID:
● QUÉ ES: Componente especializado para mostrar datos tabulares con funcionalidades
avanzadas
● PARA QUÉ: Crear interfaces de datos profesionales
🔸 SORTABLE:
● QUÉ ES: Capacidad de ordenar datos haciendo clic en cabeceras
● PARA QUÉ: Permitir al usuario organizar información como prefiera
🔸 FILTERABLE:
● QUÉ ES: Capacidad de filtrar datos según criterios específicos
● PARA QUÉ: Encontrar información específica en grandes conjuntos de datos
🔸 CELL:
● QUÉ ES: Cada celda individual de la tabla
● PARA QUÉ: Mostrar un dato específico de forma personalizada
🔸 ROW:
● QUÉ ES: Cada fila horizontal de la tabla (representa un registro)
● PARA QUÉ: Agrupar todos los datos relacionados de un elemento
🔸 COLUMN:
● QUÃ ES: Cada columna vertical de la tabla (representa un tipo de dato)
● PARA QUÉ: Agrupar datos del mismo tipo
📖 APIs Y COMUNICACIÓN
🔸 ENDPOINT:
● QUÉ ES: URL específica donde puedes hacer peticiones a una API
● PARA QUÉ: Punto de acceso para obtener o enviar datos específicos
🔸 PAYLOAD:
● QUÉ ES: Los datos que envías en una petición POST o PUT
● PARA QUÉ: Información que quieres crear o actualizar en el servidor
🔸 HEADERS:
● QUÉ ES: Información adicional que acompaña a peticiones y respuestas HTTP
● PARA QUÉ: Especificar tipo de contenido, autenticación, etc.
🔸 FETCH API:
● QUÉ ES: Función moderna de JavaScript para hacer peticiones HTTP
● PARA QUÉ: Comunicarse con APIs de forma estándar
🔸 AbortController:
● QUÉ ES: Objeto que permite cancelar peticiones HTTP en progreso
● PARA QUÉ: Evitar memory leaks cuando componentes se destruyen
📖 ARQUITECTURA Y ORGANIZACIÓN
🔸 SEPARATION OF CONCERNS:
● QUÉ ES: Principio donde cada parte del código tiene una responsabilidad específica
● PARA QUÉ: Código más organizado y fácil de mantener
🔸 SERVICE:
● QUÉ ES: Módulo que encapsula lógica de negocio o comunicación externa
● PARA QUÉ: Separar lógica de componentes de interfaz
🔸 STORE:
● QUÉ ES: Almacén centralizado del estado de la aplicación
● PARA QUÉ: Compartir datos entre componentes sin prop drilling
🔸 COMPOSABLE:
● QUÉ ES: Función reutilizable que encapsula lógica con estado reactivo
● PARA QUÉ: Reutilizar lógica entre diferentes componentes
🔸 UTILITY:
● QUÉ ES: Función auxiliar que no depende del framework
● PARA QUÉ: Lógica pura reutilizable en cualquier contexto
Pregunta 1: Variables
// ¿Qué imprime este código y por qué?
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
Respuesta: Imprime 3, 3, 3 porque var tiene scope de función y todas las iteraciones comparten la
misma variable.
const obj2 = {
name: "Vue",
greet() { return `Hello ${this.name}`; }
};
Respuesta: obj2 funciona correctamente porque las funciones tradicionales tienen su propio this.
Respuesta: Falta :key="user.id" para que Vue pueda distinguir entre elementos.
Pregunta 4: Tailwind
<!-- ¿Cuál es el enfoque correcto para mobile-first? -->
<div class="lg:text-lg text-base">Texto</div>
<div class="text-base lg:text-lg">Texto</div>
Vue.js ✅
● [ ] Comprendo qué es la reactividad
● [ ] Sé usar las directivas básicas (v-model, v-if, v-for)
● [ ] Entiendo la comunicación entre componentes (props y emits)
● [ ] Nunca manipulo el DOM directamente
Tailwind CSS ✅
● [ ] Entiendo la filosofía utility-first
● [ ] Sé aplicar diseño responsive mobile-first
● [ ] Uso el sistema de espaciado consistente
● [ ] Evito repetir clases creando componentes
AG Grid ✅
● [ ] Puedo configurar columnas básicas
● [ ] Entiendo la diferencia entre field y headerName
● [ ] Sé usar valueFormatter para formatear datos
● [ ] Valido que las propiedades coincidan con los datos
APIs ✅
● [ ] Siempre verifico response.ok
● [ ] Manejo los estados loading, success y error
● [ ] Uso try/catch/finally correctamente
● [ ] Transformo y valido datos antes de usarlos