单击反应中的元素时如何更改存储在 LocalStorage 中的数据?

How to change the data stored in LocalStorage when clicking on element in react?

我正在 React 中创建待办事项应用程序,并将数据存储在本地存储中,当用户单击特定任务时它被标记为已完成,为此我为所有任务设置了“完成”布尔值 属性在 localStorage.now 中,我想更改那个 属性 那个特定任务的点击,如何实现这个?这是代码 link : https://github.com/Khatri-Jinal/react-app/tree/practical4

从本地存储中获取值并更新它,然后再次设置它 例如: let data=localStorage.getItem('tasks') //修改数据 localStorage.setItem("tasks", JSON.stringify(tasks));

我建议您为本地存储创建一个自定义挂钩(即 useLocalStorage)。这可确保当您更新本地存储中的值时,使用更新值的组件会自动 re-rendered.

你可以上网查一下,也可以用this youtube viode作为参考。第一个例子是 useLocalStorage。

编辑: 您的任务变量应该是一个对象数组。呈现任务时,在 onclick 函数上传递一个 id 或任务唯一的任何内容(在这个例子中,我将只使用任务名称,但我建议创建你自己的)。

// tasks hook
const [tasks, setTasks] = useState([
  {desc: 'jog', isComplete: true},
  {desc: 'walk', isComplete: false},
  {desc: 'read', isComplete: true},
]);

// rendering tasks
tasks.map(task => {
  <div key={task.desc} onClick={() => onClickTask(task.desc)}
    task.desc
  </div>
});

这是您的 onClickTask 函数

const onClickTask = (identifier) => {
  const index = tasks.findIndex(task => task.desc === identifier);
  const newTasks = [...tasks];
  newTasks[index].isComplete = true;

  setTasks(newTasks);
};

我做了这个解决方案,希望对您有所帮助。

  const [todoList, setTodoList] = useState([]);

  // Get todo list from localStorage when the component is mounted
  useEffect(() => {
    setTodoList(JSON.parse(localStorage.getItem('todoList')));
  }, [])

  function updateTodo(todoId, data) {
    const todoIndex = todoList.findIndex(todo => todo.id === todoId);
    // Get a copy of the todo
    let updatableTodo = { ...todoList[todoIndex] };

    // Update the todo here...
    updatableTodo.title = data.title;

    // Update the state and localStorage
    setTodoList(todoList => {
      const newTodoList = [...todoList];
      newTodoList[todoIndex] = updatableTodo;
      localStorage.setItem('todoList', JSON.stringify(newTodoList));
      return newTodoList;
    })
  }

  return (
    <div>
      {todoList.map((todo) => 
        <button onClick={() => updateTodo(todo.id, data)} key={todo.id}>Update</button>
      )}
    </div>
  );