본문 바로가기
팀프로젝트_기록일지/React_이정환_감정일기장_프로젝트

(24).이정환_react.js강의_감정일기장_프로젝트_10강_ 웹스토리지 사용, 적용방법

by 코잼민 2025. 1. 28.

● 순서1_ 데이터를 수정 삭제 생성을 담당하는 reducer() 에 데이터가 수정될 때마다, 웹스토리지에도 반영되도록 코드 수정

function reducer(diaries, action) {
  let nextDiaries;

  switch (action.type) {
    case "CREATE": {
      nextDiaries = [action.data, ...diaries];
      break;
    }
    case "UPDATE": {
      nextDiaries = diaries.map((diary) =>
        diary.id === action.data.id ? action.data : diary
      );
      break;
    }
    case "DELETE": {
      nextDiaries = diaries.filter((diary) => diary.id !== action.data);
      break;
    }
  }

  localStorage.setItem("diary", JSON.stringify(nextDiaries));

  return nextDiaries;
}

● 순서2_ 데이터를 수정 삭제 생성을 담당하는 reducer() 에 데이터가 수정될 때마다, 웹스토리지에도 반영되도록 코드 수정


function reducer(diaries, action) {
  let nextDiaries;

  switch (action.type) {
    case "INIT":
      return action.data;
    case "CREATE": {
      nextDiaries = [action.data, ...diaries];
      break;
    }
    case "UPDATE": {
      nextDiaries = diaries.map((diary) =>
        diary.id === action.data.id ? action.data : diary
      );
      break;
    }
    case "DELETE": {
      nextDiaries = diaries.filter((diary) => diary.id !== action.data);
      break;
    }
  }

  localStorage.setItem("diary", JSON.stringify(nextDiaries));

  return nextDiaries;
}

function App(){
.
.
.
.


  const [isLoading, setIsLoading] = useState(true);
  const [diaries, dispatch] = useReducer(reducer, mockData);
  const idRef = useRef(mockData.length);

  useEffect(() => {
    const storedDiaries = localStorage.getItem("diary");

    if (!storedDiaries) {
      setIsLoading(false);
      return;
    }

    const parsedDiaries = JSON.parse(storedDiaries);

    if (Array.isArray(parsedDiaries)) {
      setIsLoading(false);
      return;
    }

    let maxId = 0;

    parsedDiaries.forEach((item) => {
      if (Number(item.id) > maxId) maxId = Number(item.id);
    });

    idRef.current = maxId;

    dispatch({
      type: "INIT",
      data: parsedDiaries,
    });
  }, []);




if (isLoading) return <div>데이터 로딩중...</div>;