javascript - 列表正在更新,但数据在 reactjs 中的 dom 上更新?
问题描述
这是我创建 TODO 列表的代码,问题是当我添加一个项目时,列表正在更新,但是当我删除一个项目时,列表没有得到更新。
import React, { useEffect, useState } from 'react';
import './App.css';
function App(){
const [item, setItem] = useState("");
const [list, updateList] = useState([]);
let todoList = <p>list is empty</p>
//creating a list
if(list.length!== 0){
todoList = list.map((res, index) =>{
return <li key={index} onClick={() => deleteItem(index)}>{res}</li>;
});
}
else{
// adding an item in todo list
todoList = <p>list is empty</p>
}
function incre(){
let addItem = [];
if(list){
addItem = list;
addItem.push(item);
}
else{
addItem = item;
}
updateList(addItem);
setItem("");
}
// deleting item from todo list
function deleteItem(item){
let updatedList = list;
updatedList.splice(item, 1);
console.log(list);
updateList(updatedList);
}
// input query
let query = (event) =>{
const { value } = event.target;
setItem(value);
}
return (
<div className="App">
<input
onChange={(e) => {query(e)}}
value={item} />
<button onClick={incre}>
click me
</button>
<p>{item}</p>
<ul>
{todoList}
</ul>
</div>
);
}
export default App;
解决方案
现在你正在改变你的状态。创建新变量并设置为您的状态不会创建新变量。如果你改变它,你也会改变原来的那个。所以,你应该避免这样做。
此外,push
andsplice
方法会改变原始数组。同样,您应该避免使用这些方法。相反,您可以使用其他不会改变原始数组的方法。
要添加,您可以使用传播语法:
function incre(){
updateList(prev => [...prev, item]);
setItem("");
}
要删除,您可以使用filter:
function deleteItem(itemIndex){
const updatedList = list.filter((_, index) => itemIndex !== index)
updateList(updatedList);
}
推荐阅读
- javascript - 反应映射意外行为
- c++ - Qt 连接新信号槽语法失败
- uiimagepickercontroller - 无法获取文件名 Uning UIImagePickerController
- c - 使用 for 循环在 C 中反转字符串(句子)时出错(将其分配给另一个字符串。)
- typescript - Sequelize.js:Model.build 返回一个空白对象
- asp.net-core - 使用类的方法而不在启动时注入?
- css - 定制器中的附加 CSS 和编辑 style.css 文件有什么区别?
- swift - Swift:静态字符串评估为空
- sqoop - Sqoop 导入以将特定列中具有空值的记录路由到另一个表中
- python - 如何让python输出一个文件?