Falta pouco!

0 dias

0 horas

0 min

0 seg

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

Criei minha própria list e cheguei até a enviar para LocolStorage, mas não consigo trazer por meio do Json.parse

//parte do HTML//

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lista de Tarefas</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <h1>Lista de Tarefas</h1>
        
            <form class="form">
                <div class="input-area">
                    <input type="text" id="tarefa-input" placeholder="Digite uma tarefa...">
                    <button id="adicionar-btn">Adicionar</button>
                </div>
                        
                        <ul id="lista-tarefas" class="lista-tarefas" style="display: none;">
                
                <li class="tarefa">
                    <span class="tarefa-texto"></span>
                    <button class="concluir-btn">Concluir</button>
                    <button class="remover-btn">Remover</button>
                </li>
                        </ul>
                    </div>
            </form>
   
    <script src="script.js"></script>
</body>
</html>

//Parte do JS//


const entrada = document.querySelector('#tarefa-input')
const adicionar = document.querySelector('#adicionar-btn')
let tarefa_texto_resultado = document.querySelector('.tarefa-texto')
const container = document.querySelector('.container')
const li = document.querySelector('.tarefa')
const concluir_btn = document.querySelector('.concluir-btn')
const remover_btn = document.getElementsByTagName('button')
formulario = document.querySelector('.form')
const lista_tarefas_armazenadas = []
const get_list = JSON.parse(localStorage.getItem('tarefas') ) || []
console.log(get_list)

adicionar.addEventListener('click',lista_de_tarefas)

                 //Inicio do formulário//
formulario.addEventListener('submit',(e)=>{
e.preventDefault()

lista_de_tarefas()//All the list

localStorage.setItem('tarefas',JSON.stringify(lista_tarefas_armazenadas))


})             //fim formulário (submit)

               //Início da função//
function lista_de_tarefas() {
if (entrada.value.trim() === '') return alert('Digite uma tarefa')

lista_tarefas_armazenadas.push(entrada.value)

const my_ul = document.createElement('ul')
my_ul.classList.add('lista-tarefas')
container.appendChild(my_ul)
const  nova_li = document.createElement('li')
nova_li.classList.add('tarefa') 
my_ul.appendChild(nova_li)

let nova_tarefa_texto_resultado = document.createElement('span')
nova_tarefa_texto_resultado.classList.add('tarefa-texto')
nova_tarefa_texto_resultado.textContent =  get_list

nova_li.appendChild(nova_tarefa_texto_resultado)

const button1 = document.createElement('button')
button1.classList.add('concluir-btn')
button1.textContent = 'Concluir'
nova_li.appendChild(button1)
button1.addEventListener('click', () => {
  
})

const button2 = document.createElement('button')
button2.classList.add('remover-btn')
button2.textContent = 'Remover'
nova_li.appendChild(button2)
button2.addEventListener('click', ()=>{
my_ul.remove()

}) 

entrada.value = '' 
}
2 respostas
solução!

Oi, Reinaldo! Como vai?

Pelo que você explicou, o problema está em como a lista e o localStorage estão sendo usados. O que mudar no seu código:

1️⃣ Usar um único <ul id="lista-tarefas"> do HTML

  • Você está criando um <ul> novo em cada inclusão. Mantenha apenas o <ul> já existente e remova o <li> de exemplo do HTML (deixe o UL vazio).
  • Controle a visibilidade usando style.display.

2️⃣ Carregar e salvar corretamente no localStorage

  • Em vez de lista_tarefas_armazenadas começar vazio, inicialize a partir do localStorage:
    let tarefas = JSON.parse(localStorage.getItem('tarefas') || '[]')
  • Sempre que alterar a lista, salve com:
    localStorage.setItem('tarefas', JSON.stringify(tarefas))

3️⃣ Renderizar a lista a partir do array

  • Não faça span.textContent = get_list (isso é um array). Adicione cada tarefa como string em um <li>.
  • Crie uma função render() que limpa o UL e recria os itens com base no array tarefas.

4️⃣ Evitar eventos duplicados

  • Use apenas o submit do form. Coloque type="submit" no botão e remova o listener de click do botão.
  • Faça e.preventDefault() no submit e trate tudo ali.

5️⃣ Delegação de evento na lista

  • Em vez de adicionar click em cada botão, ouça cliques no <ul> e descubra se o alvo é "Concluir" ou "Remover". Fica mais simples e evita vazamento de eventos.

HTML ajustado:

<!-- HTML (ajustes) -->
<form class="form">
  <div class="input-area">
    <input type="text" id="tarefa-input" placeholder="Digite uma tarefa..." />
    <button id="adicionar-btn" type="submit">Adicionar</button>
  </div>
  <ul id="lista-tarefas" class="lista-tarefas" style="display: none;"></ul> <!-- UL vazio -->
</form>

JS completo:

<script>
// Seletores
const form = document.querySelector('.form')
const input = document.querySelector('#tarefa-input')
const ul = document.querySelector('#lista-tarefas')

// Estado (carrega do localStorage)
let tarefas = JSON.parse(localStorage.getItem('tarefas') || '[]')

// Persistência
function salvar() {
  localStorage.setItem('tarefas', JSON.stringify(tarefas))
}

// Cria um <li> para uma tarefa
function criarItem(tarefa, index) {
  const li = document.createElement('li')
  li.classList.add('tarefa')
  li.dataset.index = index

  const span = document.createElement('span')
  span.classList.add('tarefa-texto')
  span.textContent = tarefa
  li.appendChild(span)

  const btnOk = document.createElement('button')
  btnOk.classList.add('concluir-btn')
  btnOk.textContent = 'Concluir'
  li.appendChild(btnOk)

  const btnRm = document.createElement('button')
  btnRm.classList.add('remover-btn')
  btnRm.textContent = 'Remover'
  li.appendChild(btnRm)

  return li
}

// Re-renderiza a lista no DOM
function render() {
  ul.innerHTML = ''
  if (tarefas.length > 0) {
    ul.style.display = 'block'
  } else {
    ul.style.display = 'none'
  }
  tarefas.forEach((t, i) => ul.appendChild(criarItem(t, i)))
}

// Submit do formulário (úNICO ponto de entrada)
form.addEventListener('submit', (e) => {
  e.preventDefault()
  const texto = input.value.trim()
  if (!texto) return alert('Digite uma tarefa')
  tarefas.push(texto)
  salvar()
  render()
  input.value = ''
  input.focus()
})

// Delegação: concluir / remover
ul.addEventListener('click', (e) => {
  const li = e.target.closest('li.tarefa')
  if (!li) return
  const idx = Number(li.dataset.index)

  if (e.target.classList.contains('concluir-btn')) {
    li.classList.toggle('feito') // estilize .feito no CSS (riscar, por ex.)
  }

  if (e.target.classList.contains('remover-btn')) {
    tarefas.splice(idx, 1)
    salvar()
    render()
  }
})

// Inicializa a tela a partir do localStorage
render()
</script>

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado

Obrigado pela disposição em ajudar, desculpa a demora em responder, é porque fico melhorando minha lógica de programação com projetos pessoais, acredito que com os cursos da Alura e com muita prática de projetos de lógica vou melhorar bastante. thanks^^. próximo desafio entender o seu código kkk