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.
- 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.