javascript - 为什么 Todo 项目在两次点击提交按钮时只保存到 localStorage?
问题描述
我用 react 制作了简单的 Todo 应用程序,可以将项目保存在 localStorage 上,但我必须点击两次提交按钮才能保存到 localStorage。那么如果我们提交输入'Hello',然后提交'World',将保存到localStorage的就是文本'Hello',如何让按钮只点击1次呢?
import React, { useState, useEffect } from "react";
import "./Todo.css";
const Todo = () => {
const [text, setText] = useState("");
const [check, setCheck] = useState(false);
const [todo, setTodo] = useState([]);
useEffect(() => {
getTodo();
}, []);
const updateText = e => {
setText(e.target.value);
console.log(text);
};
const getTodo = () => {
let todoLocal = JSON.parse(localStorage.getItem("todo")) || [];
setTodo(todoLocal);
};
const saveTodo = (todo = {}) => {
localStorage.setItem("todo", JSON.stringify(todo));
};
const fillTodo = e => {
e.preventDefault();
setTodo(prevTodo => [
...prevTodo,
{
text: text
}
]);
//localStorage.removeItem('todo');
console.log(todo);
saveTodo(todo);
};
return (
<div className="box">
<div className="title row">To-Do List</div>
<div className="list">
{todo.map((todoItem, index) => (
<div className="row" key={index}>
<input type="checkbox" data-index={index} />
<p>{todoItem.text}</p>
</div>
))}
</div>
<form className="title row" onSubmit={fillTodo}>
<input
id="todo-input"
type="text"
value={text}
placeholder="New Todo"
onChange={updateText}
/>
<button className="todo-submit">+ Todo</button>
</form>
</div>
);
};
export default Todo;
解决方案
如果您认为存储在本地存储中是一个副作用,那不是更好吗
// syncs localStorage with the current todo value
React.useEffect(() => {
localStorage.setItem("todo", JSON.stringify(todo));
}, [todo])
推荐阅读
- graph - 如何在 Neo4J/Cypher 中对匹配的结果进行分组
- css - 如何使用 CSS sprites 制作图片链接
- python-3.x - Pandas groupby,执行操作,将结果添加到所述 groupby 数据框中的列
- javascript - 返回索引处第一项的内容
- swift - 尝试在闭包中使用泛型类型时出现意外的编译器错误
- c# - 无需手动读取即可访问 `runtimeconfig.json` 内容
- batch-file - 如何创建脚本(.bat)以从 D 驱动器打开文本文件(Windows 10)
- graphql - 使用 TypeORM getManyWithCount 如何为分页生成 PageInfo
- javascript - 没有id时如何获取列表活动元素的索引
- loops - NIFI 迭代日期