Skip to main content

Ejemplos Completos de Web Storage

Estos ejemplos muestran cómo usar localStorage y sessionStorage en aplicaciones reales.

Ejemplos del Proyecto

localStorage - Datos Persistentes

const LS_USER_KEY = "demoUser";
const LS_EMAIL_KEY = "demoEmail";

const btnLsShow = document.getElementById("ls-show");
const btnLsCreate = document.getElementById("ls-create");
const btnLsUpdate = document.getElementById("ls-update");
const btnLsDelete = document.getElementById("ls-delete");

// Mostrar datos
btnLsShow.addEventListener("click", function () {
  var user = localStorage.getItem(LS_USER_KEY);
  var email = localStorage.getItem(LS_EMAIL_KEY);
  console.log("[LS] user: " + user + ", email: " + email);
});

// Crear datos
btnLsCreate.addEventListener("click", function () {
  localStorage.setItem(LS_USER_KEY, "rick");
  localStorage.setItem(LS_EMAIL_KEY, "[email protected]");
  console.log("[LS] creado: { user: rick, email: [email protected] }");
});

// Actualizar datos
btnLsUpdate.addEventListener("click", function () {
  localStorage.setItem(LS_USER_KEY, "morty");
  localStorage.setItem(LS_EMAIL_KEY, "[email protected]");
  console.log("[LS] modificado: { user: morty, email: [email protected] }");
});

// Eliminar datos
btnLsDelete.addEventListener("click", function () {
  localStorage.removeItem(LS_USER_KEY);
  localStorage.removeItem(LS_EMAIL_KEY);
  console.log("[LS] eliminado: demoUser/demoEmail borrados");
});

sessionStorage - Datos Temporales

const SS_USER_KEY = "demoUserSS";
const SS_EMAIL_KEY = "demoEmailSS";

const btnSsShow = document.getElementById("ss-show");
const btnSsCreate = document.getElementById("ss-create");
const btnSsUpdate = document.getElementById("ss-update");
const btnSsDelete = document.getElementById("ss-delete");

// Mostrar datos
btnSsShow.addEventListener("click", function () {
  var user = sessionStorage.getItem(SS_USER_KEY);
  var email = sessionStorage.getItem(SS_EMAIL_KEY);
  console.log("[SS] user: " + user + ", email: " + email);
});

// Crear datos
btnSsCreate.addEventListener("click", function () {
  sessionStorage.setItem(SS_USER_KEY, "summer");
  sessionStorage.setItem(SS_EMAIL_KEY, "[email protected]");
  console.log("[SS] creado: { user: summer, email: [email protected] }");
});

// Actualizar datos
btnSsUpdate.addEventListener("click", function () {
  var user = sessionStorage.getItem(SS_USER_KEY);
  var email = sessionStorage.getItem(SS_EMAIL_KEY);
  if (user === null && email === null) {
    console.log("[SS] Nada que actualizar. Primero crea los datos.");
    return;
  }
  sessionStorage.setItem(SS_USER_KEY, "beth");
  sessionStorage.setItem(SS_EMAIL_KEY, "[email protected]");
  console.log("[SS] modificado: { user: beth, email: [email protected] }");
});

// Eliminar datos
btnSsDelete.addEventListener("click", function () {
  sessionStorage.removeItem(SS_USER_KEY);
  sessionStorage.removeItem(SS_EMAIL_KEY);
  console.log("[SS] eliminado: demoUserSS/demoEmailSS borrados");
});

Ejemplo: Sistema de Preferencias de Usuario

// Preferencias por defecto
const PREFERENCIAS_DEFAULT = {
  tema: 'claro',
  idioma: 'es',
  notificaciones: true,
  tamanoFuente: 'medio'
};

// Cargar preferencias (con fallback a defaults)
function cargarPreferencias() {
  const guardadas = localStorage.getItem('preferencias');
  
  if (guardadas) {
    try {
      return { ...PREFERENCIAS_DEFAULT, ...JSON.parse(guardadas) };
    } catch (error) {
      console.error('Error al parsear preferencias:', error);
      return PREFERENCIAS_DEFAULT;
    }
  }
  
  return PREFERENCIAS_DEFAULT;
}

// Guardar preferencias
function guardarPreferencias(preferencias) {
  localStorage.setItem('preferencias', JSON.stringify(preferencias));
  console.log('Preferencias guardadas');
}

// Aplicar tema
function aplicarTema(tema) {
  document.body.className = `tema-${tema}`;
}

// Aplicar tamaño de fuente
function aplicarTamanoFuente(tamano) {
  const tamanos = {
    pequeño: '14px',
    medio: '16px',
    grande: '18px'
  };
  document.documentElement.style.fontSize = tamanos[tamano];
}

// Inicializar preferencias al cargar la página
window.addEventListener('DOMContentLoaded', () => {
  const prefs = cargarPreferencias();
  
  aplicarTema(prefs.tema);
  aplicarTamanoFuente(prefs.tamanoFuente);
  
  // Actualizar controles de UI
  document.getElementById('tema').value = prefs.tema;
  document.getElementById('idioma').value = prefs.idioma;
  document.getElementById('notificaciones').checked = prefs.notificaciones;
  document.getElementById('tamanoFuente').value = prefs.tamanoFuente;
});

// Manejar cambios en preferencias
document.getElementById('form-preferencias').addEventListener('submit', (e) => {
  e.preventDefault();
  
  const preferencias = {
    tema: document.getElementById('tema').value,
    idioma: document.getElementById('idioma').value,
    notificaciones: document.getElementById('notificaciones').checked,
    tamanoFuente: document.getElementById('tamanoFuente').value
  };
  
  guardarPreferencias(preferencias);
  aplicarTema(preferencias.tema);
  aplicarTamanoFuente(preferencias.tamanoFuente);
  
  alert('Preferencias guardadas');
});

Ejemplo: Formulario Multi-Paso con Autosave

const STORAGE_KEY = 'formulario_registro';
let pasoActual = 1;

// Guardar progreso automáticamente
function guardarProgreso() {
  const datos = {
    paso: pasoActual,
    nombre: document.getElementById('nombre')?.value || '',
    email: document.getElementById('email')?.value || '',
    telefono: document.getElementById('telefono')?.value || '',
    direccion: document.getElementById('direccion')?.value || ''
  };
  
  sessionStorage.setItem(STORAGE_KEY, JSON.stringify(datos));
  console.log('Progreso guardado');
}

// Cargar progreso guardado
function cargarProgreso() {
  const guardado = sessionStorage.getItem(STORAGE_KEY);
  
  if (!guardado) {
    return null;
  }
  
  try {
    return JSON.parse(guardado);
  } catch (error) {
    console.error('Error al cargar progreso:', error);
    return null;
  }
}

// Restaurar formulario
function restaurarFormulario() {
  const datos = cargarProgreso();
  
  if (!datos) {
    console.log('No hay progreso guardado');
    return;
  }
  
  // Preguntar al usuario
  const continuar = confirm('¿Quieres continuar donde lo dejaste?');
  
  if (continuar) {
    pasoActual = datos.paso;
    mostrarPaso(pasoActual);
    
    // Rellenar campos
    if (datos.nombre) document.getElementById('nombre').value = datos.nombre;
    if (datos.email) document.getElementById('email').value = datos.email;
    if (datos.telefono) document.getElementById('telefono').value = datos.telefono;
    if (datos.direccion) document.getElementById('direccion').value = datos.direccion;
    
    console.log('Progreso restaurado');
  } else {
    sessionStorage.removeItem(STORAGE_KEY);
  }
}

// Guardar en cada cambio
document.querySelectorAll('input, textarea').forEach(input => {
  input.addEventListener('input', guardarProgreso);
});

// Limpiar al enviar
document.getElementById('formulario').addEventListener('submit', (e) => {
  e.preventDefault();
  // ... enviar datos
  sessionStorage.removeItem(STORAGE_KEY);
  alert('Formulario enviado');
});

// Restaurar al cargar
window.addEventListener('DOMContentLoaded', restaurarFormulario);

Ejemplo: Lista de Tareas Persistente

const STORAGE_KEY = 'lista_tareas';
let tareas = [];

// Cargar tareas
function cargarTareas() {
  const guardadas = localStorage.getItem(STORAGE_KEY);
  return guardadas ? JSON.parse(guardadas) : [];
}

// Guardar tareas
function guardarTareas() {
  localStorage.setItem(STORAGE_KEY, JSON.stringify(tareas));
}

// Agregar tarea
function agregarTarea(texto) {
  const tarea = {
    id: Date.now(),
    texto: texto,
    completada: false,
    fechaCreacion: new Date().toISOString()
  };
  
  tareas.push(tarea);
  guardarTareas();
  renderizarTareas();
}

// Toggle completada
function toggleTarea(id) {
  const tarea = tareas.find(t => t.id === id);
  if (tarea) {
    tarea.completada = !tarea.completada;
    guardarTareas();
    renderizarTareas();
  }
}

// Eliminar tarea
function eliminarTarea(id) {
  tareas = tareas.filter(t => t.id !== id);
  guardarTareas();
  renderizarTareas();
}

// Renderizar tareas
function renderizarTareas() {
  const lista = document.getElementById('lista-tareas');
  lista.innerHTML = '';
  
  if (tareas.length === 0) {
    lista.innerHTML = '<p class="vacio">No hay tareas. ¡Agrega una!</p>';
    return;
  }
  
  tareas.forEach(tarea => {
    const li = document.createElement('li');
    li.className = tarea.completada ? 'completada' : '';
    
    li.innerHTML = `
      <input type="checkbox" ${tarea.completada ? 'checked' : ''} 
             onchange="toggleTarea(${tarea.id})">
      <span class="texto">${tarea.texto}</span>
      <button onclick="eliminarTarea(${tarea.id})" class="btn-eliminar">Eliminar</button>
    `;
    
    lista.appendChild(li);
  });
  
  // Actualizar contador
  const completadas = tareas.filter(t => t.completada).length;
  document.getElementById('contador').textContent = 
    `${completadas} de ${tareas.length} completadas`;
}

// Event listeners
document.getElementById('form-tarea').addEventListener('submit', (e) => {
  e.preventDefault();
  const input = document.getElementById('input-tarea');
  const texto = input.value.trim();
  
  if (texto) {
    agregarTarea(texto);
    input.value = '';
  }
});

// Cargar al iniciar
window.addEventListener('DOMContentLoaded', () => {
  tareas = cargarTareas();
  renderizarTareas();
});

Ejemplo: Carrito de Compras

const CARRITO_KEY = 'carrito_compras';

// Obtener carrito
function obtenerCarrito() {
  const carrito = localStorage.getItem(CARRITO_KEY);
  return carrito ? JSON.parse(carrito) : [];
}

// Guardar carrito
function guardarCarrito(items) {
  localStorage.setItem(CARRITO_KEY, JSON.stringify(items));
}

// Agregar al carrito
function agregarAlCarrito(producto) {
  const carrito = obtenerCarrito();
  
  // Verificar si ya existe
  const existente = carrito.find(item => item.id === producto.id);
  
  if (existente) {
    existente.cantidad++;
  } else {
    carrito.push({
      ...producto,
      cantidad: 1
    });
  }
  
  guardarCarrito(carrito);
  actualizarUI();
  mostrarNotificacion(`${producto.nombre} agregado al carrito`);
}

// Remover del carrito
function removerDelCarrito(productoId) {
  let carrito = obtenerCarrito();
  carrito = carrito.filter(item => item.id !== productoId);
  guardarCarrito(carrito);
  actualizarUI();
}

// Actualizar cantidad
function actualizarCantidad(productoId, cantidad) {
  const carrito = obtenerCarrito();
  const item = carrito.find(item => item.id === productoId);
  
  if (item) {
    if (cantidad <= 0) {
      removerDelCarrito(productoId);
    } else {
      item.cantidad = cantidad;
      guardarCarrito(carrito);
      actualizarUI();
    }
  }
}

// Calcular total
function calcularTotal() {
  const carrito = obtenerCarrito();
  return carrito.reduce((total, item) => {
    return total + (item.precio * item.cantidad);
  }, 0);
}

// Vaciar carrito
function vaciarCarrito() {
  if (confirm('¿Seguro que quieres vaciar el carrito?')) {
    localStorage.removeItem(CARRITO_KEY);
    actualizarUI();
  }
}

// Actualizar UI
function actualizarUI() {
  const carrito = obtenerCarrito();
  const contenedor = document.getElementById('carrito');
  const badge = document.getElementById('carrito-badge');
  
  // Actualizar badge con cantidad total
  const cantidadTotal = carrito.reduce((sum, item) => sum + item.cantidad, 0);
  badge.textContent = cantidadTotal;
  badge.style.display = cantidadTotal > 0 ? 'block' : 'none';
  
  // Renderizar items
  if (carrito.length === 0) {
    contenedor.innerHTML = '<p>Carrito vacío</p>';
    return;
  }
  
  contenedor.innerHTML = carrito.map(item => `
    <div class="carrito-item">
      <img src="${item.imagen}" alt="${item.nombre}">
      <div>
        <h4>${item.nombre}</h4>
        <p>$${item.precio}</p>
      </div>
      <input type="number" value="${item.cantidad}" min="1" 
             onchange="actualizarCantidad(${item.id}, this.value)">
      <button onclick="removerDelCarrito(${item.id})">Eliminar</button>
    </div>
  `).join('');
  
  // Mostrar total
  document.getElementById('total').textContent = `Total: $${calcularTotal().toFixed(2)}`;
}

// Inicializar
window.addEventListener('DOMContentLoaded', actualizarUI);

Ejemplo: Caché de Datos con Expiración

function guardarConExpiracion(clave, datos, minutos) {
  const item = {
    datos: datos,
    expira: Date.now() + (minutos * 60 * 1000)
  };
  
  localStorage.setItem(clave, JSON.stringify(item));
}

function obtenerConExpiracion(clave) {
  const itemStr = localStorage.getItem(clave);
  
  if (!itemStr) {
    return null;
  }
  
  const item = JSON.parse(itemStr);
  
  // Verificar si expiró
  if (Date.now() > item.expira) {
    localStorage.removeItem(clave);
    return null;
  }
  
  return item.datos;
}

// Uso con fetch
async function obtenerUsuariosConCache() {
  const CACHE_KEY = 'usuarios';
  const CACHE_MINUTOS = 5;
  
  // Intentar obtener del cache
  const cached = obtenerConExpiracion(CACHE_KEY);
  
  if (cached) {
    console.log('Usando cache');
    return cached;
  }
  
  // Si no hay cache, obtener del servidor
  console.log('Obteniendo del servidor');
  const response = await fetch('https://jsonplaceholder.typicode.com/users');
  const datos = await response.json();
  
  // Guardar en cache por 5 minutos
  guardarConExpiracion(CACHE_KEY, datos, CACHE_MINUTOS);
  
  return datos;
}

Helpers Reutilizables

// Helper para localStorage
const storage = {
  get(key, defaultValue = null) {
    const item = localStorage.getItem(key);
    if (!item) return defaultValue;
    
    try {
      return JSON.parse(item);
    } catch {
      return item;
    }
  },
  
  set(key, value) {
    localStorage.setItem(key, JSON.stringify(value));
  },
  
  remove(key) {
    localStorage.removeItem(key);
  },
  
  clear() {
    localStorage.clear();
  },
  
  has(key) {
    return localStorage.getItem(key) !== null;
  }
};

// Helper para sessionStorage
const session = {
  get(key, defaultValue = null) {
    const item = sessionStorage.getItem(key);
    if (!item) return defaultValue;
    
    try {
      return JSON.parse(item);
    } catch {
      return item;
    }
  },
  
  set(key, value) {
    sessionStorage.setItem(key, JSON.stringify(value));
  },
  
  remove(key) {
    sessionStorage.removeItem(key);
  },
  
  clear() {
    sessionStorage.clear();
  },
  
  has(key) {
    return sessionStorage.getItem(key) !== null;
  }
};

// Uso
storage.set('usuario', { nombre: 'Juan', edad: 25 });
const usuario = storage.get('usuario');
console.log(usuario.nombre); // 'Juan'

Próximos Pasos

localStorage

Repasa los fundamentos de localStorage

sessionStorage

Aprende más sobre sessionStorage

Build docs developers (and LLMs) love