我已经为用户创建了将他们最喜欢的食谱添加到列表中的功能,然后他们可以查看他们保存的食谱的列表,但是我正在try 将食谱数组保存到本地存储中,这样数据在刷新时就不会丢失.

我已经保存了数据,并try 将状态更新为本地存储中的状态,但数据不会持久存在

const [myRecipeState, dispatchMyRecipes] = useReducer(myRecipesReducer, {items: []});

const addItemHandler = (item) => {
    dispatchMyRecipes({val:'ADD', item: item});
  }

  const removeItemHandler = (id) => {
    dispatchMyRecipes({val:'REMOVE', id: id});
  }

const myRecipesReducer = (state, action) => {
  if (action.val === 'ADD') {
    let updatedItems;
    let updatedItem;
    const existingItemIndex = state.items.findIndex(item => item.id === action.item.id)
    const existingItem = state.items[existingItemIndex];
    const localRecipes = JSON.parse(localStorage.getItem('myRecipes'));

    if (existingItem) {
      updatedItems = [...state.items];
      updatedItem = existingItem;
      updatedItems[existingItemIndex] = updatedItem;
      console.log('item already exists');
      localStorage.setItem('myRecipes', JSON.stringify(updatedItems));
    }else {
      updatedItems = state.items.concat(action.item);
      console.log('item added for the first time');
      localStorage.setItem('myRecipes', JSON.stringify(updatedItems));
    }
    return {items: localRecipes || updatedItems}
  }

  if (action.val === 'REMOVE') {
    let updatedItems;
    const localRecipes = JSON.parse(localStorage.getItem('myRecipes'));
    updatedItems = [...state.items].filter(item => item.id !== action.id);
    localStorage.setItem('myRecipes', JSON.stringify(updatedItems));
    return {items: localRecipes || updatedItemsupdatedItems}
  }

  return {items: state.items}
}

推荐答案

您做错的第一件事就是总是从空数组开始.更改您的初始状态,以便 Select localStorage内的值(如果有),如果没有,则使用空数组:

const initialData = localStorage.getItem("myRecipes")
  ? JSON.parse(localStorage.getItem("myRecipes"))
  : [];
const [myRecipeState, dispatchMyRecipes] = useReducer(myRecipesReducer, { items: initialData });

那么你应该稍微改一下myRecipesReducer,因为你有的一些东西是不正确的,像这样localRecipes || updatedItems总是会挑localRecipes.

const myRecipesReducer = (state, action) => {
  if (action.val === "ADD") {
    const existingItemIndex = state.items.findIndex((item) => item.id === action.item.id);
    let updatedItems;

    if (existingItemIndex !== -1) {
      updatedItems = [...state.items];
      updatedItems[existingItemIndex] = action.item;
    } else {
      updatedItems = state.items.concat(action.item);
    }
    localStorage.setItem("myRecipes", JSON.stringify(updatedItems));
    return { items: updatedItems };
  }

  if (action.val === "REMOVE") {
    const updatedItems = state.items.filter((item) => item.id !== action.id);
    localStorage.setItem("myRecipes", JSON.stringify(updatedItems));
    return { items: updatedItems };
  }

  return { items: state.items };
};

Javascript相关问答推荐

创建私有JS出口

添加/删除时React图像上传重新渲染上传的图像

如何在angular中从JSON值添加动态路由保护?

如何禁用附加图标点击的v—自动完成事件

更改JSON中使用AJAX返回的图像的路径

setcallback是什么时候放到macrotask队列上的?

并不是所有的iframe都被更换

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

查询参数未在我的Next.js应用路由接口中定义

第二次更新文本输入字段后,Reaction崩溃

如何在Svelte中从一个codec函数中调用error()?

如何在Angular拖放组件中同步数组?

在使用REACT更改了CSS类之后,无法更改CSS样式

如何将zoom 变换应用到我的d3力有向图?

传递方法VS泛型对象VS事件特定对象

每次重新呈现时调用useState initialValue函数

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

是否可以在不更改组件标识的情况下换出Reaction组件定义(以维护状态/引用等)?如果是这样的话,是如何做到的呢?

JavaScript -复制到剪贴板在Windows计算机上无效

MongoDB通过数字或字符串过滤列表