javascript - 通过 .map 循环创建按钮时出现问题

标签 javascript loops dictionary button

我正在尝试用 JavaScript 创建一个基本 list 。我想将项目添加到一个数组中,该数组将是玩家库存。库存数组中的内容将显示在多个 div 上(每个项目一个)。我已经开始体验并让基础知识发挥作用,但我想详细说明并为项目列表中的每个项目创建按钮,以便稍后使用按钮将项目添加到库存。

我首先选择我的 HTML div 并创建一个基本的 itemList 数组和一个 playerInv 空数组:

const container = document.querySelector('.container');
const inventory = document.querySelector('.inventory');
const invItem = document.querySelectorAll('.grid-item');

const itemList = [{
    id: 1,
    name: "Coke Bottle",
    quality: "usable"
  },
  {
    id: 6,
    name: "Pair of Jeans",
    quality: "pants"
  }
]

// Player inventory, is by default empty.
const playerInv = []

const itemBtnContainer = document.createElement("div");
itemBtnContainer.classList.add("item-add-btn-ctn");
container.appendChild(itemBtnContainer);

let itemBtn;

function addItemBtn() {
  itemList.map((item) => {
    itemBtn = document.createElement("button");
    itemBtn.classList.add("item-add-btn");
    itemBtnContainer.appendChild(itemBtn);
    itemBtn.innerText += item.name;
  })
}
addItemBtn();
<div class="container">
  CONT
  <div class="inventory">
    <div class="inventory-left">
      <div class="inventory-left-title">Your inventory</div>
      <div class="inventory-left-grid">
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
        <div class="grid-item"></div>
      </div>
    </div>
    <div class="inventory-right"></div>
  </div>
</div>

因此,为了创建我的按钮,我的想法是使用 map 循环遍历我的 itemList 数组。每个 itemList 项目都会创建一个类为“item-add-btn”的按钮,按钮内会显示项目的名称。

从视觉上看,它是有效的。由于 6 个 itemList 项,我有 6 个按钮,但是因为我在循环中创建了按钮,所以我无法在循环外访问它们。实际上,如果我使用 console.log(itemBtn) 它会返回“undefined”,因此我无法使用 addEventListener 创建 onClick 函数以便稍后编写我的 addItemToInv() 函数。 我明白为什么它不起作用,但我真的不知道我还能做些什么来获得相同的结果并能够使用我的按钮。

我什至不知道我还能尝试什么,因为这是一个非常具体的需求。

最佳答案

首先,您应该使用 for .. ofArray.prototype.forEach 因为 .map 构建了一个您要丢弃的新数组.

其次,制作一个返回按钮的 createButton 函数,以便您可以将其存储到一个值中 -

function createButton(item) {
  const itemBtn = document.createElement("button")
  itemBtn.type = "button"
  itemBtn.classList.add("item-add-btn")
  itemBtn.innerText += item.name
  return itemBtn
}

现在你可以循环了-

for (const item of itemList) {
  // create button reference
  const button = createButton(item)

  // add click handler
  button.addEventListener("click", ...)

  // append button to container
  itemBtnContainer.appendChild(button)
}

这是一个完整的工作演示 -

const inventory = []

const itemList = [{id:1,name: "Coke Bottle",quality: "usable"},{id: 6,name: "Pair of Jeans",quality: "pants"}]

function renderInventory() {
  document
  .querySelector("#inventory")
  .textContent = `inventory: ${JSON.stringify(inventory, null, 2)}`
}

function createButton(text, onClick) {
  const e = document.createElement("button")
  e.type = "button"
  e.textContent = text
  e.addEventListener("click", onClick)
  return e
}

function addToInv(item) {
  return event => {
    inventory.push(item)
    renderInventory()
  }
}

renderInventory()

for (const item of itemList)
  document.body.appendChild(createButton(item.name, addToInv(item)))
#inventory {
  padding: 1rem;
  background-color: #eee;
  font-family: monospace;
}
<pre id="inventory"></pre>

关于javascript - 通过 .map 循环创建按钮时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70669162/

相关文章:

javascript - X-可编辑简单数据库更新不更新

MySQL:如何在 SQL 查询中为每个结果插入一条记录?

java - 如何根据某些特定值对 map 中的值进行分组?

java - 我想在位置 2 处插入一个新元素并将其他元素向下移动一步?是否可以

Python:错误库后继续

python - 将值添加到同一字典中的键

javascript - 在 Chrome 中重新显示 html 输入范围拇指

javascript - 关于 JavaScript 和 PHP 赋值运算符 : Why the different results?

javascript - 如何将文字数组转换为 json

javascript - 动态 Javascript 树结构