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

Minha solução

Como de costume, eu tento implementar a solução do meu jeito sem assistir o vídeo. Como eu não sabia que o instrutor iria alterar de const para let, eu fiz dessa forma:


const listaDeTarefas = JSON.parse(localStorage.getItem('tarefas')) || [];
...
function limparTarefasConcluidas() {
    const tarefasRemovidas = listaDeTarefas.filter((tarefa) => !tarefa.completa)  //filtra o array de tarefas para somente conter as tarefas nao concluidas
    listaDeTarefas.splice(0, listaDeTarefas.length, ...tarefasRemovidas); //substitui o conteúdo da lista de tarefas

    return listaDeTarefas;
}

function renderizaLista() { //talvez essa nao seja a forma mais correta de fazer, mas aqui eu limpo a lista e reconstruo com as tarefas que sobraram
    ulTarefas.innerHTML = '';
    listaDeTarefas.forEach((tarefa) => {
        ulTarefas.append(criarElementoListaDeTarefas(tarefa));
    })


btnApagarTarefasConcluidas.addEventListener('click', () => {
    limparTarefasConcluidas();
    atualizarTarefas();
    renderizaLista();
});

Assim eu nao alterei a declaração da variável e consegui ter o resultado esperado.
então o fluxo ficou
1- função que limpa as tarefas
2- atualiza a localStorage
3- Atualiza o dom

2 respostas

Olá, Bruno! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso de arrays para armazenar tarefas, utilizou muito bem o método filter para selecionar apenas as tarefas não concluídas e ainda compreendeu a importância de reconstruir a lista para manter a interface atualizada.

Uma dica interessante para o futuro é simplificar a lógica de remoção usando apenas o filter e atribuindo diretamente o resultado à lista. Assim:

function limparTarefasConcluidas() {
    listaDeTarefas = listaDeTarefas.filter((tarefa) => !tarefa.completa);
    return listaDeTarefas;
}

Isso faz com que o código fique mais legível e direto, sem necessidade de usar splice.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!
solução!

Salve, Bruno! Massa demais ver você tentando resolver antes de assistir o vídeo — esse é o caminho.

E olha, sua solução funciona perfeitamente. Isso é o mais importante. Na prática do dia a dia, a gente raramente tem uma única forma "certa" de resolver um problema. O que existe são tradeoffs diferentes, e faz parte do nosso trabalho entender esses tradeoffs pra escolher o que faz mais sentido em cada contexto.

O splice com spread operator pra substituir o conteúdo do array é uma técnica válida pra manter a mesma referência do array original. O ponto é que essa abordagem é menos comum, então alguém lendo seu código pode demorar um pouquinho mais pra entender o que tá acontecendo. Aquele splice(0, listaDeTarefas.length, ...tarefasRemovidas) exige que a pessoa pare e pense "peraí, ele tá removendo tudo e inserindo os novos itens no lugar". Não é errado, só é menos imediato que um listaDeTarefas = listaDeTarefas.filter(...).

Sobre o renderizaLista() que limpa e reconstrói a lista toda — você mesmo comentou que "talvez não seja a forma mais correta". Na real, é uma forma totalmente válida e bastante usada. Limpar e redesenhar é mais simples de entender e manter. A alternativa seria manipular o DOM cirurgicamente (removendo só os elementos específicos), que é o que eu fiz no curso. Mas pra listas pequenas, a diferença de performance é irrelevante. Só passaria a importar se você tivesse centenas ou milhares de itens.

O fluxo que você montou (1- limpa tarefas, 2- atualiza localStorage, 3- atualiza DOM) tá bem claro e fácil de seguir. Dá pra bater o olho no evento de click e entender exatamente o que acontece.

Continua tentando resolver por conta antes de ver a solução — é assim que a gente desenvolve esse repertório de "ah, isso aqui dá pra resolver de várias formas, qual faz mais sentido agora?".