Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

[Proyecto] Apartado en el LocalStorage

Así quedó el localstorage en un primer intento que no me funcionaba:

import React, { useState, useEffect } from "react";

import Header from "./Components/Header";
import Container from "./Components/Container";
import GlobalStyle from "./GlobalStyle";
import { ThemeProvider } from "styled-components";
import { temaClaro, temaOscuro } from './Components/UI/temas';
import { BtnTema } from "./Components/UI";
import SwitcherTema from "./Components/SwitcherTema";

function App() {
  // Estado para el tema
  const [tema, setTema] = useState(true);

  // Almacena el estado del tema en el localStorage cuando cambia
  useEffect(() => {
    localStorage.setItem("tema", tema ? "claro" : "oscuro");
  }, [tema]);

  // Recupera el estado del tema del localStorage al cargar la página
  useEffect(() => {
    const temaGuardado = localStorage.getItem("tema");
    setTema(temaGuardado === "claro");
  }, []);

  const toggleTema = () => {
    setTema((tema) => !tema);
  };

  return (
    <ThemeProvider theme={tema ? temaClaro : temaOscuro}>
      <GlobalStyle />
      <BtnTema onClick={toggleTema}>
        <SwitcherTema tema={tema} />
      </BtnTema>
      <Header />
      <Container />
    </ThemeProvider>
  );
}

export default App;

Una modificación que tampoco funcionaba:

// ...

useEffect(() => {
  const temaGuardado = localStorage.getItem("tema");
  if (temaGuardado === "claro") {
    setTema(true);
  } else if (temaGuardado === "oscuro") {
    setTema(false);
  }
}, []);

// ...

Y ya que esta alteración ya quedó funcionando:

function App() {
  const [tema, setTema] = useState(() => {
    const temaGuardado = localStorage.getItem("tema");
    return temaGuardado ? JSON.parse(temaGuardado) : true; 
 });

  useEffect(() => {
    localStorage.setItem("tema", JSON.stringify(tema));
  }, [tema]);

  const toggleTema = () => {
    setTema((prevState) => !prevState);
  };

// Resto del código...
}

Recalco que no sé nada de localstorage, pero buscando e investigando me topaba con estos códigos y los adaptaba y viendo que no funcionaba, pedía ayuda y encontré con la solución, aunque sigo sin comprender el porque no funcionaba con los anteriores código y veo que con este último que me funcionó veo que en el usestate se le puede meter una función, también está el tema del json y sus métodos, en fin les comparto esta experiencia que tuve al hacer el localstogare del cambio de tema jeje

2 respuestas

Hola Edwin,

Gracias por compartir tu experiencia con el uso de localStorage en tu proyecto de cambio de tema. Es genial que hayas encontrado una solución que funcione para ti.

En cuanto a tus preguntas sobre por qué los códigos anteriores no funcionaban, puedo darte algunas explicaciones. En el primer código que compartiste, parece que estabas guardando el valor del tema en localStorage correctamente, pero no estabas recuperándolo correctamente al cargar la página. Esto se debe a que estabas usando temaGuardado === "claro" en lugar de temaGuardado === "true" para verificar si el tema guardado era claro.

En el segundo código que compartiste, estabas recuperando el tema guardado correctamente, pero no estabas actualizando el estado del tema en consecuencia. Esto se debe a que estabas usando setTema(true) y setTema(false) en lugar de setTema(temaGuardado === "claro") y setTema(temaGuardado === "oscuro") respectivamente.

En el último código que compartiste, estás utilizando una función en useState para inicializar el estado del tema. Esto te permite obtener el valor del tema guardado en localStorage y parsearlo como un valor booleano. Luego, estás guardando el estado del tema en localStorage cada vez que cambia utilizando JSON.stringify.

En resumen, el último código que compartiste es una solución más completa y correcta para guardar y recuperar el estado del tema utilizando localStorage.

Espero que esto aclare tus dudas. Si tienes alguna otra pregunta, no dudes en hacerla.

¡Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios! :)
solución!

Muchas gracias Rafaela, ahora lo entiendo un poco