Lección 3 de 20 · Lectura y práctica
Crea tu primer componente interactivo con Svelte
Tipo de lección: VideoConcepto claveEn Svelte, un componente es la unidad fundamental de construcción de interfaces. A diferencia de frameworks como React o Vue, Svelte compila tu código en JavaScript optimizado durante el build,.
Del concepto a la práctica
Taller de esta lección
Un componente interactivo debe tener un estado pequeño y una transición observable. En vez de construir un contador genérico, representa el estado de una tarea: pendiente o completada. La interfaz se deriva del estado y el evento modifica una sola fuente de verdad.
Ejemplo resuelto
Este componente mantiene una tarea local y alterna su estado:
<script>
let task = $state({ title: 'Revisar informe', done: false, priority: 'alta' });
function toggle() {
task = { ...task, done: !task.done };
}
</script>
<p>{task.title}: {task.done ? 'completada' : 'pendiente'}</p>
<button onclick={toggle}>Cambiar estado</button>Pruébalo
Sustituye el título por una tarea de prueba.
Haz clic una vez y registra el texto mostrado.
Haz clic de nuevo y verifica que vuelve al estado inicial.
Comprueba que la asignación crea un nuevo objeto.
Comprueba tu resultado
Error frecuente: usar un let ordinario esperando reactividad en modo runes; corrígelo con $state. Con este proxy también es reactivo task.done = !task.done; la reasignación con spread es una alternativa, no una obligación.
Ejercicio: muestra el campo priority ya inicializado con valor alta y no lo pierdas al alternar. Resultado esperado: el texto cambia dos veces y priority conserva alta después de cada cambio.

Mapa de prácticaEl servidor puede obtener datos y producir el HTML inicial. El navegador muestra el resultado y ejecuta las interacciones que necesitan estado local. Mantén las claves sensibles en el servidor y define qué parte se ejecuta en cada entorno.
Ver la infografía en tamaño completo ↗Tipo de lección: Video
Concepto clave
En Svelte, un componente es la unidad fundamental de construcción de interfaces. A diferencia de frameworks como React o Vue, Svelte compila tu código en JavaScript optimizado durante el build, eliminando la necesidad de una biblioteca runtime en producción. Imagina que estás construyendo con LEGO: cada pieza (componente) es independiente, reutilizable y sabe cómo actualizarse cuando cambian sus datos internos.
La reactividad en Svelte es declarativa y automática. Cuando declaras una variable y la usas en tu plantilla, Svelte automáticamente rastrea las dependencias y actualiza solo las partes afectadas del DOM. Es como tener un asistente que observa tus ingredientes en la cocina y ajusta automáticamente la receta cuando cambias uno, sin que tengas que decirle explícitamente qué hacer.
Cómo funciona en la práctica
Vamos a crear un componente de contador interactivo paso a paso. Primero, necesitas entender la estructura básica de un archivo .svelte:
- Sección <script>: Contiene la lógica JavaScript (variables, funciones)
- Sección HTML: La plantilla que define la interfaz
- Sección <style>: Estilos scoped al componente (opcional)
La magia ocurre cuando vinculas variables del script con la plantilla usando llaves {}. Cuando estas variables cambian, Svelte actualiza automáticamente el DOM.
Código en acción
Aquí está tu primer componente interactivo completo:
<script>
// Declaramos una variable reactiva
let count = 0;
// Función que incrementa el contador
function increment() {
count += 1;
}
// Función que reinicia el contador
function reset() {
count = 0;
}
</script>
<div class="counter-container">
<h3>Contador Interactivo</h3>
<p>Valor actual: <strong>{count}</strong></p>
<button on:click={increment}>
Incrementar (+1)
</button>
<button on:click={reset}>
Reiniciar
</button>
<p>El contador ha sido incrementado {count} {count === 1 ? 'vez' : 'veces'}</p>
</div>
<style>
.counter-container {
padding: 20px;
border: 2px solid #4CAF50;
border-radius: 8px;
max-width: 300px;
margin: 0 auto;
text-align: center;
}
button {
background-color: #4CAF50;
color: white;
padding: 10px 15px;
margin: 5px;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
</style>Ahora veamos cómo refactorizar para hacerlo más reutilizable. ANTES: Todo en un solo componente. DESPUÉS: Separamos la lógica del display:
<!-- CounterDisplay.svelte -->
<script>
export let count;
export let label = "Contador";
</script>
<div class="counter-display">
<h3>{label}</h3>
<p>Valor: <strong>{count}</strong></p>
</div>
<style>
.counter-display {
margin-bottom: 15px;
}
</style>Errores comunes
- Mutación directa sin reactividad: Modificar arrays u objetos sin reasignación. En Svelte, necesitas reasignar para trigger la reactividad:
array.push(item)no funciona, usaarray = [...array, item]. - Confundir on:click con onclick: En Svelte siempre usas
on:eventname, no el nativoonclick. El prefijo "on:" es específico de Svelte. - No usar export para props: Si quieres pasar datos a un componente hijo, debes declarar variables con
export leten el hijo. - Olvidar el scope de estilos: Los estilos en Svelte son scoped por defecto. Si necesitas estilos globales, usa
:global(). - Abusar de la reactividad con $:: El símbolo $: es para declaraciones reactivas derivadas. No lo uses para variables simples que no dependen de otras.
Checklist de dominio
- ✓ Puedo crear un componente .svelte con las tres secciones (script, template, style)
- ✓ Entiendo cómo declarar variables reactivas y funciones
- ✓ Sé vincular variables a la plantilla usando {}
- ✓ Puedo manejar eventos con on:click y otras directivas
- ✓ Comprendo la diferencia entre variables locales y props (export let)
- ✓ Sé aplicar estilos scoped a un componente
- ✓ Puedo refactorizar un componente para hacerlo reutilizable
Crea un componente de lista de tareas interactiva
Construye un componente Svelte que permita a los usuarios gestionar una lista de tareas. Este es un patrón común en aplicaciones reales que te prepara para componentes más complejos.
- Crea un nuevo archivo TodoList.svelte en tu proyecto SvelteKit
- Implementa las siguientes funcionalidades:
- Un campo de entrada para agregar nuevas tareas
- Una lista que muestre todas las tareas
- Botón para marcar tareas como completadas
- Botón para eliminar tareas de la lista
- Contador que muestre cuántas tareas quedan pendientes
- Asegúrate de que:
- Las tareas sean objetos con propiedades: id, text, completed
- Uses reactividad adecuada (reasignación de arrays)
- Los estilos estén scoped al componente
- Manejes correctamente los eventos de click
- Prueba tu componente importándolo en +page.svelte
Pistas
- Recuerda que para trigger reactividad con arrays debes reasignar, no solo mutar
- Usa
on:submitconpreventDefaulten el formulario para evitar recarga de página - Genera IDs únicos para cada tarea usando
Date.now()o una librería comonanoid
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con SvelteKit Full-Stack: Construye Aplicaciones Web Performantes con Server Actions
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.