javascript - 为每个按钮触发事件侦听器
问题描述
渲染我的待办事项
const renderTodos = data => {
data.forEach((todo) => {
const year = todo.date.slice(0, 4)
const month = todo.date.slice(5, 7)
const day = todo.date.slice(8, 10)
const newListItem = document.createElement('li')
newListItem.setAttribute('class', 'todoItem')
newListItem.innerHTML = `
<div id="${todo._id}">
<h3 style="display: block">${todo.title}</h3>
<p>${todo.description}</p>
<p>Date Due - <span>${day} / ${month} / ${year}</span></p>
<button class="editBtn" id="${todo._id}">Edit</button>
<button class="deleteBtn" id="${todo._id}">Delete</button>
</div>
`
todoContainer.appendChild(newListItem)
})
deleteTodo()
editTodo()
}
并编辑单个待办事项
const editTodo = () => {
let allEditBtns = document.querySelectorAll('.editBtn')
allEditBtns.forEach((btn) => {
btn.addEventListener('click', ({target}) => {
console.log(target)
editContainer.style.display = 'flex'
newTitleInput.value = target.parentElement.children[0].innerHTML
newDescriptionInput.value = target.parentElement.children[1].innerHTML
applyEditBtn.addEventListener('click', () => {
console.log(target)
fetch(`http://localhost:3000/todo/${target.id}`, {
method: 'PATCH',
body: JSON.stringify({
title: newTitleInput.value,
description: newDescriptionInput.value
}),
headers: {
'Content-Type': 'application/json'
}
}).then((data) => {
editContainer.style.display = 'none'
console.log(data)
return data.json()
}).then(() => {
getTodos()
}).catch((err) => {
console.log(err)
})
})
})
})
}
我的“editTodo”函数中的“applyEditBtn.addEventListener”块有问题。如果我编辑待办事项,它会起作用。当我编辑第二个或第三个待办事项等时会出现问题。发生的情况是,这个持有 fetch 查询的事件侦听器将触发的次数与它们实际上是“allEditBtns”的次数一样多。因此,如果我有 2 个待办事项(每个待办事项都有一个“编辑按钮”),我单击第一个,它编辑得很好,如果我单击编辑第二个待办事项,两个待办事项都将运行,但第一个待办事项数据被覆盖.. .所以我最终两个待办事项都持有相同的数据。我收集了它本质上发生的原因,因为 fetch 查询位于 foreach 方法中......但是当我将它移出这里时,我也无法让它工作。
我不太擅长解释,所以我希望有经验的人可以了解我的问题的要点或在提供的代码块中看到我的问题。
解决方案
推荐阅读
- javascript - 反应原生 - siganlR
- functional-programming - 如何在方案(N-queens)中从此函数中删除可变性
- python - 如何将用户的消息分配给 discord.py 中的变量?
- android - 有没有办法在兑换代码文本框android中以编程方式自动填充促销代码
- ruby-on-rails - 推送到 heroku 时出现“预编译资产失败”错误
- javascript - 使用 ajax 导入时如何访问较低级别的变量并连接它们
- discord.js - 从特定消息中删除特定成员的反应
- java - 在 Java 中发送 CSRF 身份验证 - Pusher
- r - 在 R 中绑定多个 csv 以输出到 ggplot2 中的图形
- authentication - 使用 GraphQL/HotChocolate 验证登录令牌