【发布时间】:2021-09-23 20:18:48
【问题描述】:
我正在尝试使用带有事件处理程序的“全部删除”按钮删除 API 中的所有数据,它调用异步函数将我的 items 设置为空数组。这样做时,我希望它每次单击按钮时更新我的页面并更新页面数据,而无需使用useEffect 刷新页面。但是,仅当我刷新页面时页面才会更新(行为类似于componentDidMount())。经过一番研究,我意识到在数组参数的useEffect 钩子中添加items 会告诉DOM 重新渲染,只有当items 被更改时。但是,经过一番调试,我意识到每次刷新页面时都会调用handleDelete函数,这是我不希望它做的事情。我已经搜索并发现了很多关于这个问题的问题,但没有答案可以解决我的问题。有没有办法绕过它?我希望页面仅在我单击删除按钮时更新,仅此而已。
这是我的代码
export default function Dashboard() {
const [items, setItems] = useState([]);
const fetchList = async () => {
await axios.get("/api/items").then((res) => {
setItems(res.data.reverse());
});
};
const handleDelete = () =>{
axios.delete("/api/items").then((res)=>{
setItems(res.data);
console.log('-- res.data --', res.data)
})
}
useEffect(() => {
fetchList();
console.log("fetchList activate")
}, []);
return (
<div className={styles.dashboard_container}>
<button className={styles.delete_all} onClick={handleDelete}>Delete All</button>
{items.map((item) => {
const { _id, name, phone, numberofpeople, time } = item;
return (
<div className={styles.waitlist_item} key={_id}>
<h4>{name}</h4>
<h5>{phone}</h5>
<h4>{numberofpeople}</h4>
<h5>{moment(time).format("MMM Do, h:mm:ss A ddd")}</h5>
</div>
);
...
这是我的后端路由器中处理删除请求的代码。
router.delete("/api/items", (req, res) => {
Item.deleteMany({}, (err) => {
if (err) {
res.status(500);
} else {
res.json({ success: true });
}
});
});
【问题讨论】:
-
您不需要在这里使用
useEffect,setItems应该可以完成这项工作。只需从后端返回一个空数组。res.json([])应该可以工作。 -
是的,这也可以,但是我想在单击按钮时更新我的页面。也许你的意思是
useEffect(() => { fetchList(); console.log("fetchList activate") }, [items]); -
这里是什么意思:“更新我的页面”?您的页面,正是您“可视化”项目的那部分,将自动更新而无需刷新页面。我错过了什么?
-
“更新我的页面”是指当我点击按钮时,我想直观地删除页面上的所有数据。现在,按钮虽然删除了数据库中的数据,但是除非我刷新页面,否则它不会立即反映在页面上。
-
好的,我们一起调试)你能不能在
handleDelete函数中使用console.log('-- res.data --', res.data)。并且请删除第二个useEffect(在更改项目后第二次删除项目)它不应该在这里
标签: javascript node.js reactjs react-hooks