Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Problema na hora de atualizar o valor da quantidade

Bom, basicamente eu estou tendo problema na hora de atualizar o valor da quantidade, eu consigo colocar primeiramente o nosso valor inicial, porém para substituir a quantidade do item, ocorre um erro que ele meio que reescreve acima do nosso item em HTML e meio que para de adicionar outros itens e meio que tira os elementos da página deixando somente o número

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mochila de viagem</title>
    <link rel="stylesheet" href="css/style.css">

    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet"> 
</head>
<body>
    <main class="conteudo">
        <div class="principal">
            <div class="mochila"></div>
            <form action="" class="adicionar" id="novoItem">
                <label for="item">Nome</label>
                <input type="text" name="nome" id="nome">
                <label for="item">Quantidade</label>
                <input type="number" name="quantidade" id="quantidade">
                <input type="submit" value="Adicionar" class="cadastrar">
            </form>
        </div>
        
        <ul class="lista" id="lista" data-id="0"> </ul>
    </main>

    <script src="js/main.js"></script>
</body>
</html>

JS

const form = document.getElementById("novoItem");
const lista = document.getElementById("lista");
const itens = JSON.parse(localStorage.getItem(["itens"])) || []



itens.forEach((elemento) => {
  criaElemento(elemento)

})

form.addEventListener("submit", (evento) => {
  evento.preventDefault();

  const nome = evento.target.elements['nome'];
  const quantidade = evento.target.elements['quantidade'];

  const existe = itens.find(elemento => elemento.nome === nome.value)

  const itemAtual = {
    "nome": nome.value,
    "quantidade": quantidade.value

  }

  if (existe) {
    itemAtual.id = existe.id

    atualizaElemento(itemAtual)

  } else {
    itemAtual.id = itens.length

    criaElemento(itemAtual);

    itens.push(itemAtual)
  }

  localStorage.setItem("itens", JSON.stringify(itens))



  nome.value = "";
  quantidade.value = "";


})

function criaElemento(item) {

  //<li class="item"><strong>7</strong>Camisas</li>
  const novoItem = document.createElement('li');
  novoItem.classList.add("item");

  const numeroItem = document.createElement('strong');
  numeroItem.innerHTML = item.quantidade;
  numeroItem.dataset.id = item.id
  novoItem.appendChild(numeroItem);
  
  novoItem.innerHTML += item.nome;

  lista.appendChild(novoItem);


}

function atualizaElemento(item){
 document.querySelector("[data-id='"+item.id+"']").innerHTML = item.quantidade
}
2 respostas
solução!

Olá! Tudo bem? O problema está acontecendo porque a tag ul da lista está com o atributo data-id="0" no seu arquivo HTML, por conta disso, sempre que você atualiza a quantidade do primeiro item da lista, ao invés de atualizar sua quantidade, atualiza a lista inteira para a quantidade, assim eliminando todos os elementos da página. O primeiro elemento adicionado sempre fica com o id 0, já que o id é baseado no comprimento da lista. Para resolver o problema, basta remover o data-id="0" da ul no seu arquivo html:

<!-- Removendo o id da ul -->
<ul class="lista" id="lista"></ul>

Caso você queira sempre aumentar a quantidade do item da lista ao invés de substituir o valor da quantidade, você pode fazer também a seguinte alteração no seu arquivo js:

if (existe) {
    itemAtual.id = existe.id
    // Temos que transformar a quantidade em números antes de somar para não obtermos resultados como 2 + 2 = 22
    itemAtual.quantidade = parseInt(itemAtual.quantidade) + parseInt(existe.quantidade);
    atualizaElemento(itemAtual);

  } else {
      // Resto do código

Espero ter ajudado!

Muito obrigado, porém tenho mais alguma dúvida, quando utilizando mesmo o HTML com o data-id="0" document.querySelector("[data-id='"+item.id+"']").innerHTML = item.quantidade Se eu adicionar um strong na frente de data, o mesmo código com a presença do data no HTML continua funcionando, por que será isso? Se da pelo fato que o nosso strong é basicamente o nosso elemento quantidade?