Задать вопрос
@KleshneCrab
student

Почему при добавлении новых элементов в массив, цикл их не видит?

Есть готовый массив. Перебираю его циклом и вывожу в браузер, всё работает. Создаю с нуля инпуты и кнопку для добавления новых элементов массива, добавляю, но цикл их не видит и не выводит в окно.

let goods = [
  { item: "umbrella", price: 3, index: 01 },
  { item: "gloves", price: 5, index: 02 },
  { item: "glasses", price: 6, index: 03 },
];

let input1 = document.createElement("input");
let input2 = document.createElement("input");
let input3 = document.createElement("input");
body.appendChild(input1);
body.appendChild(input2);
body.appendChild(input3);
let but = document.createElement("button");
but.textContent = "Add new goods";
body.appendChild(but);

let ul = document.createElement("ul");
for (let elem of goods) {
  let li = document.createElement("li");
  let content = `${elem.item}, цена ${elem.price}, номер ${elem.index}`;
  li.textContent = content;
  ul.appendChild(li);
  body.appendChild(ul);
}

but.addEventListener("click", function () {
  goods.push({
    item: input1.value,
    price: input2.value,
    index: input3.value,
  });
 });
  • Вопрос задан
  • 89 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
mizutsune
@mizutsune
I will live forever in the flame of your eyes.
Создаю с нуля инпуты и кнопку для добавления новых элементов массива, добавляю, но цикл их не видит и не выводит в окно.


Потому что после добавления новых элементов в массив, нужно вызвать повторно функцию render, точнее выполнить эту часть кода:

let li = document.createElement("li");
let content = `${elem.item}, цена ${elem.price}, номер ${elem.index}`;
li.textContent = content;
ul.appendChild(li);


Но указав новые данные для: item, price, index.

Первый вариант

but.addEventListener("click", () => {
    goods.push({
        item: input1.value,
        price: input2.value,
        index: input3.value,
    });

    ul.innerHTML = goods.map(({ item, price, index }) => {
        return `<li>${item}, цена ${price}, номер ${index}</li>`
    }).join("");
});



Или:

Второй вариант

but.addEventListener("click", () => {
    goods.push({
        item: input1.value,
        price: input2.value,
        index: input3.value,
    });

    const { item, price, index } = goods[goods.length - 1];

    let li = document.createElement("li");
    let content = `${item}, цена ${price}, номер ${index}`;
    li.textContent = content;
    ul.append(li);
});

Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы