1
resposta

[Sugestão] Varios erros

Tive vários erros ao longo desse curso, eu acabei desistindo esses dias, mas hoje resolvi rever ele para entender melhor o que estava acontecendo em cada linha de código, então meu código esta cheio de anotações que eu fiz agora para não me perder, mas quando vou testar, ainda não funciona. Sei que meu código ainda tem algumas coisas diferentes do professor, mas não sei dizer o que exatamente gera o não funcionamento do projeto.

Me ajudem a identificar os erros por favor

const form = document.getElementById("novoItem")  // informacoes passadas pelo usuario
const listaHTML = document.getElementById("lista") // lista dos itens
const itens = JSON.parse(localStorage.getItem("itens")) || []  // lista dos elementos do LS ||(ou) lista vasia([])
//JSON.parse transforma a string (guardada no LS) para obj

itens.forEach( (elemento) => {
  criaElemento(elemento)
} )
// passa pela constante "itens" e a da vez vira parametro de criaElemento()

form.addEventListener("submit", (evento) => {
  evento.preventDefault() // impede o comportamento padrao

  const nome = evento.target.elements['nome'] 
  const quantidade = evento.target.elements['quantidade']
  // o elements pega o atributo for="" do elemento HTML acessado

  const existe = itens.find( elemento => elemento.nome === nome.value)
  // elemento aqui sao todos os objetos de itens existentes ate o momento
  // o find procura que existe um nome dentro de algum objeto que seja igual ao valor de nome passado pelo usuario no input

  const itemAtual = {
    "nome": nome.value,
    "quantidade": quantidade.value
  }//cria um objeto com os valores que o usuario passar como nome e quantidade

  if (existe) {
    itemAtual.id = existe.id  //item em questao tem seu id igual ao id do item existente

    atualizaElemento(itemAtual)

    itens[existe.id] = itemAtual
  }else {
    itemAtual.id = itens.length  //[itens.length] + 1 ? itens[itens.length].id : 0 --- n fez sentido pra mim, mas estava no curso
    criaElemento(itemAtual)

    itens.push(itemAtual)
    // adciona novo obj de item na lista de objetos itens
  }

  localStorage.setItem("itens", JSON.stringify(itens))
  nome.value = ""
  quantidade.value = ""
  // finaliza limpando os inputs para a proxima adicao de item
})

function criaElemento(item) { // chamada duas vezes
  const novoItem = document.createElement("li")
  novoItem.classList.add("item")

  const numeroItem = document.createElement("strong")
  numeroItem.dataset.id = item.id // iguala o atributo id no numero item com a key do obj item
  novoItem.appendChild(numeroItem) //afilia numeroItem a novoItem
  numeroItem.innerHTML = item.quantidade // add a qtd passada

  novoItem.innerHTML = item.nome

  novoItem.appendChild(botaoDeleta(item.id))
  listaHTML.appendChild(novoItem) // add tudo criado nessa funcao na ul ja existente no HTML
}

function atualizaElemento(item) {
  document.querySelector("[data-id='"+item.id+"']").innerHTML = item.quantidade
  // [data-id='id do elemento']
  // atualiza a quantidade se o elemento for existente
}


function botaoDeleta(id){
  const elementoBotao = document.createElement('button')
  elementoBotao.innerText = "X"

  elementoBotao.addEventListener('click', function() {
    deletaElemento(this.parentNode, id)
  })

  return elementoBotao
}

function deletaElemento(elemento, id){
  elemento.remove()
  item.splice(itens.findIndex(elemento => elemento.id == id), 1)
  localStorage.setItem("itens", JSON.stringify(itens))
}
1 resposta

Opa Helena, tudo bem?

Primeiramente peço desculpas pela demora em obter um retorno.

Gostaria de dizer que sinto muito que você tenha passado por tantas frustrações ao longo do projeto. Saiba que você não está sozinha. Esses momentos de cansaço são bastante frequentes durante o aprendizado de tecnologia. Fiquei bastante feliz em saber que você finalizou o curso! Parabéns por sua dedicação.

Você está no caminho certo! Analisando se código pude perceber duas alteraçõezinhas que podemos fazer para que o código funcione adequadamente.

A primeira é na função de criar elementos, falta o sinal de positivo no momento de atribuição do novoItem:

novoItem.innerHTML = item.nome;

Adicionando o sinal funcionará adequadamente:

novoItem.innerHTML += item.nome;

A segunda é na função de deletar elementos, onde é usado “item” no singular para se referenciar a constante **itens:**

function deletaElemento(elemento, id){
  elemento.remove()
  item.splice(itens.findIndex(elemento => elemento.id == id), 1)
  localStorage.setItem("itens", JSON.stringify(itens))
}

Substituindo item por itens funcionará normalmente.

Caso tenha dúvidas, fico à disposição para tirar dúvidas.

Desejo um bom dia e bons estudos.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!