Lección 11 de 20 · Lectura y práctica
Configura stores para estado global en SvelteKit
Concepto claveLos stores en SvelteKit son contenedores reactivos que permiten compartir estado entre componentes sin necesidad de pasar props manualmente. Piensa en ellos como una caja fuerte compartida en una oficina: cualquier.
Del concepto a la práctica
Taller de esta lección
Un store es útil cuando dos componentes necesitan observar el mismo estado del cliente, por ejemplo el filtro elegido en la lista y el resumen visible en el encabezado. No debe sustituir a la fuente persistente ni almacenar secretos. Define una forma pequeña y actualízala mediante operaciones explícitas.
Ejemplo resuelto
Un filtro inicial y una actualización inmutable pueden expresarse así:
import { writable } from 'svelte/store';
export function createTaskFilter() {
const store = writable('all');
return { subscribe: store.subscribe,
select(value) { store.set(value === 'done' ? 'done' : 'all'); }
};
}Si llega “unknown”, el store vuelve al valor permitido all.
Crea createTaskFilter() una vez dentro de la instancia del layout y compártelo mediante setContext/getContext, no como variable global mutable importada por server load. Así dos árboles SSR independientes no intercambian preferencias. En el navegador también puedes usar un store de cliente, pero nunca escribas estado de usuario en un singleton que sirva todas las solicitudes. writable conserva valores primitivos; aquí no hay un objeto que necesite actualización inmutable.
Pruébalo
Suscribe la lista y el resumen al mismo store.
Cambia entre all y done.
Envía un valor no permitido.
Verifica que ambos componentes muestran el mismo filtro.
Comprueba tu resultado
Error frecuente: modificar directamente el valor recibido por una suscripción; corrígelo usando el método select de esta fábrica, que llama a set internamente.
Ejercicio: aplica la secuencia all, done, unknown. Resultado esperado: ambos componentes observan all, después done y finalmente all.

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 ↗Concepto clave
Los stores en SvelteKit son contenedores reactivos que permiten compartir estado entre componentes sin necesidad de pasar props manualmente. Piensa en ellos como una caja fuerte compartida en una oficina: cualquier miembro del equipo puede acceder a lo que hay dentro, y cuando alguien cambia su contenido, todos los que estén observando reciben una notificación automática.
A diferencia del estado local de un componente, que vive y muere con él, los stores persisten más allá del ciclo de vida de componentes individuales. Esto es crucial para datos como el usuario autenticado, preferencias de la aplicación o carritos de compra. En aplicaciones full-stack con Server Actions, los stores te permiten sincronizar estado entre cliente y servidor de manera eficiente.
Cómo funciona en la práctica
Imagina que estás construyendo un dashboard con SvelteKit. Necesitas que el nombre del usuario esté disponible en múltiples componentes: barra de navegación, perfil y configuración. Sin stores, tendrías que pasar el nombre como prop a través de varios niveles de componentes (prop drilling). Con stores, creas un store de usuario una vez y lo importas donde lo necesites.
Paso a paso: primero, defines un store en un archivo separado (ej. stores.js). Luego, en cualquier componente, importas el store y usas el prefijo $ para acceder a su valor reactivamente. Cuando actualizas el store con set o update, todos los componentes suscritos se re-renderizan automáticamente. Esto elimina complejidad y mejora el mantenimiento.
Código en acción
Veamos cómo crear y usar un store para el tema de la aplicación (claro/oscuro):
// stores/theme.js
import { writable } from 'svelte/store';
// Crear store writable con valor inicial
const theme = writable('light');
// Exportar para usar en componentes
export default theme;Ahora, usemos este store en un componente:
<script>
import theme from './stores/theme';
function toggleTheme() {
// Actualizar el store
theme.update(current => current === 'light' ? 'dark' : 'light');
}
</script>
<button on:click={toggleTheme}>
Cambiar tema
</button>
<p>Tema actual: {$theme}</p>Errores comunes
- Mutación directa del valor del store: Nunca modifiques
$storedirectamente. Usa siemprestore.set()ostore.update()para garantizar la reactividad. - Olvidar el prefijo $ en componentes: Para leer el valor reactivamente, debes usar
$store, no solostore. Sin el $, obtienes el objeto store, no su valor. - Crear stores innecesarios: No uses stores para estado que solo vive en un componente. Usa variables reactivas locales (
letcon$:) en su lugar. - No limpiar suscripciones manuales: Si usas
store.subscribe()directamente (raro), asegúrate de llamar a la función de limpieza para evitar memory leaks. - Store demasiado grande: Evita almacenar todo en un solo store. Divide en stores específicos (usuario, UI, datos) para mejor organización.
Checklist de dominio
- Puedo crear un store writable, readable o derived según la necesidad
- Sé importar y usar stores en componentes con la sintaxis
$store - Actualizo stores correctamente usando
set()oupdate() - Comprendo cuándo usar store vs estado local del componente
- Puedo estructurar múltiples stores en una arquitectura escalable
- Sé sincronizar stores con Server Actions para datos persistentes
- Puedo debuggear problemas de reactividad en stores
Implementa un store de carrito de compras
En esta práctica, crearás un store para manejar un carrito de compras en una aplicación e-commerce. Sigue estos pasos:
- Crea un archivo
src/stores/cart.jsque exporte un store writable. El valor inicial debe ser un array vacío. - Define funciones helper en el mismo archivo:
addToCart(product),removeFromCart(productId)yclearCart()que actualicen el store. - En un componente
Product.svelte, importa el store y la funciónaddToCart. Agrega un botón que añada el producto actual al carrito. - Crea un componente
CartSummary.svelteque muestre el número de items en el carrito usando$cart.lengthy un botón para vaciar el carrito. - Verifica que al añadir productos desde diferentes componentes, el
CartSummaryse actualice automáticamente.
Pistas
- Recuerda que el store debe contener objetos de producto con al menos un id y nombre
- Usa update() para modificar el array del carrito manteniendo inmutabilidad
- Considera usar structuredClone() o spread operator para evitar mutaciones accidentales
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.