【问题标题】:Javascript - checkbox reading value from array of objectsJavascript - 从对象数组中读取值的复选框
【发布时间】:2020-07-20 11:27:42
【问题描述】:

如果任务完成与否,我需要从数组中的对象读取待办事项列表中的复选框。并在它们完成和未选中时保持选中状态。

const todos = [
  {
    id: 1,
    title: 'Nakupit',
    description: 'Mlieko, syr, vajcia',
    completed: false,
  },
  {
    id: 2,
    title: 'Umyt auto',
    description: '+ povysavat',
    completed: true,
  },
]

这是数组,我尝试了类似这样的复选框。和变化,无法让它工作并从数组制作复选框更改数组或值,检查,如果完成

 toDoCheckbox.addEventListener('click', () => {
      if (toDoCheckbox.checked = true) {
       return todos.completed === true
        
      } else {
       return todos.completed === false
      }
    });

有人可以帮忙吗?

【问题讨论】:

  • 使用监听函数的event参数(第一个参数)并访问event.currentTarget获取被点击的项目...
  • todos 是一个数组,它没有 .completed 属性。你的函数也返回一个值,但它实际上并没有任何事情。
  • toDoCheckbox 是什么?通常每个项目会有一个复选框。根据minimal reproducible example向我们展示更多代码
  • 另请注意,您使用= 进行比较,但这是一个赋值运算符
  • 这是我拥有的全部内容playcode.io/637457

标签: javascript checkbox checked unchecked


【解决方案1】:

您可以修改todos 状态,方法是通过id 查找它并翻转其completed 状态。

我添加了请求重新渲染的按钮。这将使用当前状态重新构建复选框。

const todos = [{
  id: 1,
  title: 'Nakupit',
  description: 'Mlieko, syr, vajcia',
  completed: false,
}, {
  id: 2,
  title: 'Umyt auto',
  description: '+ povysavat',
  completed: true,
}]

const main = () => {
  const btn = document.querySelector('.btn-render')
  btn.addEventListener('click', reRender)
  renderTodos()
}

const reRender = (e) => {
  renderTodos()
}

const onCheck = (e) => {
  const id = parseInt(e.currentTarget.dataset.id, 10)
  const found = todos.find(todo => todo.id === id)
  if (found) {
    found.completed = !found.completed // Flip status
  }
}

const renderTodos = () => {
  const container = document.querySelector('.container')

  container.innerHTML = '' // Clear

  todos.forEach(todo => {
    let wrapper = document.createElement('div')
    let label = document.createElement('label')
    let checkbox = document.createElement('input')

    wrapper.classList.add('checkbox-wrapper')
    label.textContent = todo.title
    checkbox.type = 'checkbox'
    checkbox.checked = todo.completed
    checkbox.dataset.id = todo.id
    checkbox.addEventListener('change', onCheck)

    wrapper.appendChild(label)
    wrapper.appendChild(checkbox)
    container.appendChild(wrapper)
  })
}

main()
.checkbox-wrapper label {
  display: inline-block;
  width: 6em;
}
<div class="container"></div>
<br />
<button class="btn-render">Re-render</button>

【讨论】:

  • 先生。 Polywhirl,我让它像这样工作。但它不能以其他方式工作。单击复选框时,我需要更改数组值。我在数组中更改值后不呈现复选框
  • @MiroslavValkovič 这确实改变了数组值的状态...请参阅:found.completed = !found.completed
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多