0

I've never worked with local storage in combination with React.

My goal is simple: When users complete a test, localstorage should store a value saying they've completed the test. If the completedTest State is true, show a ShowResultsComponent.

Showhow I feel as if I'm going about this the incorrect way.

// I'd like localStorage.complete to start as false. 

const [completedTest, setCompletedTest] = useState(localStorage.complete);

useEffect(() => {
localStorage.getItem('complete');
}, []);

const completeTest = () => {
localStorage.setItem('complete', true);
}


{completedTest ? 
<ShowResultsComponent />
: null }
AndrewLeonardi
  • 3,351
  • 9
  • 47
  • 100

2 Answers2

1

You want to set the state of completedTest in the useEffect() hook. Also, when conditionally rendering, you should use an empty React fragment <></> instead of null.

Example:

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

export default function SomeComponent() {
  const [completedTest, setCompletedTest] = useState(localStorage.complete);

  useEffect(() => {
    const c = localStorage.getItem("complete");
    setCompletedTest(c);
  }, []);

  const completeTest = () => {
    localStorage.setItem("complete", true);
    setCompletedTest(true);
  };

  return <div>{completedTest ? <div>render this if completed</div> : <></>}</div>;
}
Designly
  • 266
  • 1
  • 9
0

You can do like this, no need to listen the localstorage.

const isCompleted = localStorage.getItem("complete") === 'true';
const [completedTest, setCompletedTest] = useState(isCompleted);

const completeTest = () => {
   localStorage.setItem('complete', true);
   setCompletedTest(true)
}


return completedTest ? <ShowResultsComponent />: null;
Nisharg Shah
  • 16,638
  • 10
  • 62
  • 73