javascript - 刷新时所有待办事项都不会出现在前端,而所有输入的待办事项都存储在本地存储中
问题描述
只有单个待办事项出现在前端,只有键,没有任何价值。我也在使用useEffect Hook但问题没有解决。请在这里帮助我,我在这段代码中遗漏了一些东西。
import './App.css';
import Header from "./my-components/header.js";
import Todos from "./my-components/todos";
import Footer from "./my-components/footer";
import { Addtodo } from "./my-components/addtodo";
import React, { useState, useEffect } from 'react';
function App() {
let inittodos;
if (localStorage.getItem("todoslist") === null) {
inittodos = [];
}
else {
inittodos = JSON.parse(localStorage.getItem("todoslist"));
}
const addtodo = (task, task_name, members) => {
let newtodo = {
task: task,
task_name: task_name,
members: members
};
settodos([...todoslist, newtodo]);
}
const [todoslist, settodos] = useState([inittodos]);
useEffect(() => {
localStorage.setItem("todoslist", JSON.stringify(todoslist));
}, [todoslist]);
return (
<>
<Header title="Learnig-React" search_bar={true} />
<Addtodo addtodo={addtodo} />
<Todos todos={todoslist} ondelete={ondelete} />
<Footer />
</>
);
}
export default App;
Add_todo 组件 只有单个待办事项出现在前端,只有键,没有任何值。我也在使用 useEffect Hook 但问题没有解决。请在这里帮助我,我在这段代码中遗漏了一些东西。
This is Add_todo component code
import React, { useState } from 'react'
export const Add_todo = ({ addtodo }) => {
const [task, settask] = useState("");
const [task_name, settask_name] = useState("");
const [members, setmembers] = useState("");
//submit function for storing contents onclick on submit button
const submit = (e) => {
e.preventDefault();
if (!task || !task_name || !members) {
alert("Plese fill all details");
}
else {
addtodo(task, task_name, members);
settask("");
settask_name("");
setmembers("")
}
}
return (
<div className="container">
<form onSubmit={submit}>
<div className="form-group">
<label htmlFor="task">Task</label>
<input type="text" id="task" className="form-control" aria-describedby="emailHelp" value={task} onChange={(e) => { settask(e.target.value) }} placeholder="Enter Task" />
<small id="" className="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div className="form-group">
<label htmlFor="task_name">Task-Name</label>
<input type="textl" id="task_name" className="form-control" aria-describedby="emailHelp" value={task_name} onChange={(e) => { settask_name(e.target.value) }} placeholder="Enter Task Name" />
<small id="" className="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div className="form-group">
<label htmlFor="members">Members</label>
<input type="number" id="members" className="form-control" aria-describedby="emailHelp" value={members} onChange={(e) => { setmembers(e.target.value) }} placeholder="Enter No. Members" />
<small id="" className="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<button type="submit" className="btn-sm btn-success my-3">Submit</button>
</form>
</div>
)
}
解决方案
您的使用inittodos
和useEffect
使用有问题。
我修改了您的 App 组件,但尚未经过测试。尝试这样的事情:
function App() {
const localTodos = localStorage.getItem("todoslist");
const [todoslist, settodos] = useState([]);
const addtodo = (task, task_name, members) => {
let newtodo = {
task: task,
task_name: task_name,
members: members
};
const newTodos = [...todoslist, newtodo];
settodos(newTodos);
// Side-effect when adding todo: save to localStorage.
localStorage.setItem("todoslist", JSON.stringify(newTodos));
}
// When component loaded, get from localStorage and save to App state.
useEffect(() => {
if (localTodos && localTodos !== null) {
settodos(JSON.parse(localTodos));
}
}, [])
return (
<>
<Header title="Learnig-React" search_bar={true} />
<Addtodo addtodo={addtodo} />
<Todos todos={todoslist} ondelete={ondelete} />
<Footer />
</>
);
}
提示:用于console.log
调试您的代码。这比仅仅猜测要好。
推荐阅读
- c# - MVC Core DbContext 设置在函数调用之间
- youtube - 如何通过 YouTube API 保存和检索自定义元数据字段
- bash - 使用 find 排除所有子目录的文件
- r - 在R中提取向量中的最后一个序列数
- c# - 如何使用 C# 在 google sheet 中查找或搜索内容
- kivy - 哪个是知道哪个按钮在 kivy 中引起回调的正确方法?
- runtime - 多项式时间内的实重量背包
- java - 如何修复 ScrollView 内的 ConstraintLayout 不滑动?
- python-3.x - 如何更新权重和偏差
- arrays - 合并数组时继承自定义方法