Sincronización de Estados en React con Local Storage

Clase 15 de 19Curso de React.js: Patrones de Render y Composición

Resumen

¿Cómo detectar cambios en el almacenamiento local de la aplicación?

Es clave mantener la sincronización entre las diferentes ventanas y pestañas cuando varios usuarios usan una misma aplicación. Un buen ejemplo es la funcionalidad implementada en Todo Machine para detectar cambios en el almacenamiento local del navegador. El objetivo aquí es ejecutar un código cuando el almacenamiento local cambie, lo que permite a los usuarios ver actualizaciones en tiempo real entre las pestañas.

¿Cómo manejar el evento de cambios en el almacenamiento?

Para detectar los cambios, puedes añadir un listener al objeto window, escuchando específicamente el evento de ‘storage’. Sigue estos pasos:

  1. Añadir el listener: Utiliza window.addEventListener para escuchar cambios en el almacenamiento local.
  2. Crear una función de callback: Esta función reaccionará a la información devuelta acerca del cambio, usando un objeto como change.
  3. Condicional para cambios específicos: Verifica si el cambio se produjo en la clave deseada, en este caso, toDosVersion1.
  4. Resetear el estado: Si hay un cambio, actualiza el estado, indicando a la aplicación que muestre una alerta visual.
window.addEventListener('storage', (change) => {
  if (change.key === 'toDosVersion1') {
    console.log('Hubo cambios en toDos-Versión1');
    // Actualiza el estado para mostrar la alerta
    setStorageChange(true);
  }
});

Es importante señalar que React requiere un elemento de retorno para cada componente, así que asegura un retorno de null cuando no se debe mostrar nada.

¿Cómo actualizar la interfaz cuando hay cambios?

Después de detectar cambios, se debe comunicar a los usuarios mediante una interfaz visual. Implementa los siguientes pasos para mejorar la experiencia de usuario:

¿Cómo presentar información de cambios?

  1. Incorporar un botón de refresco:

    • Añade un botón que permita al usuario recargar la información manualmente.
    • Este botón puede llamarse como “Refrescar” o “Actualizar”.
  2. Controlar eventos del botón:

    • Escucha los clics en el botón con un listener de eventos y llama a una función que actualice la visualización.
<div>
  <p>Hubo cambios</p>
  <button onClick={toggleShow}>Refrescar</button>
</div>

¿Cómo mantener la sincronización en múltiples pestañas?

Al trabajar con un Custom Hook como UseLocalStorage, aquí tienes cómo asegurar la sincronización:

  1. Crear nuevos estados para sincronización:
    • Introduce un estado que te permita saber si los datos están sincronizados.
  2. Disparar efectos al cambiar el estado:
    • Usa el nuevo estado en el array de dependencias de useEffect, permitiendo reejecutar el efecto.
const [synchronizeItem, setSynchronizeItem] = useState(true);

useEffect(() => {
  if (synchronizeItem) {
    // Cargar datos desde Local Storage...
    setLoading(true);
    // Actualización del estado cuando se complete la sincronización.
    setTimeout(() => {
      setLoading(false);
      setSynchronizeItem(true);
    }, 1000);
  }
}, [synchronizeItem]);

Además, comparte las funciones y los estados necesarios entre los componentes para una integración fluida.

¿Cómo mejorar la experiencia visual y funcional?

Después de que la funcionalidad básica esté implementada, añade mejoras estéticas y funcionales:

  1. Aplicar estilos CSS elegantes:
    • Mejora la presentación de las alertas visuales con CSS para hacerlas atractivas.
  2. Gestionar estados de carga:
    • Asegúrate de que los To Do's no aparezcan durante la sincronización, para lo cual puedes ajustar la lógica en componentes como ToDoList.

Estos pasos aseguran que tu aplicación no solo está técnicamente sólida, sino que también ofrece una experiencia de usuario de primera calidad. El compromiso con la interfaz y la funcionalidad hará que tu aplicación sobresalga. Continúa explorando, experimentando y optimizando para seguir aprendiendo y mejorando tus habilidades en el desarrollo de software. ¡El mundo del código es tuyo!