2
respostas

[Dúvida] Criar elemento tarefa

Fiquei na dúvida do por que as tarefas quando submetidas, não ficam duplicadas., uma vez que a função criarElementoTarefa() é chamada duas vezes no código (formAdicionarTarefa e tarefas.forEach) para a lista ulTarefas por meio do método .append().

const btnAdicionarTarefa = document.querySelector('.app__button--add-task')
const formAdicionarTarefa = document.querySelector('.app__form-add-task')
const textarea = document.querySelector('.app__form-textarea')
const ulTarefas = document.querySelector('.app__section-task-list')

const tarefas = JSON.parse(localStorage.getItem('tarefas')) || []

function criarElementoTarefa(tarefa) {
    const li = document.createElement('li')
    li.classList.add('app__section-task-list-item')

    const svg = document.createElement('svg')
    svg.innerHTML = `
        <svg class="app__section-task-icon-status" width="24" height="24" viewBox="0 0 24 24" fill="none"
            xmlns="http://www.w3.org/2000/svg">
            <circle cx="12" cy="12" r="12" fill="#FFF"></circle>
            <path d="M9 16.1719L19.5938 5.57812L21 6.98438L9 18.9844L3.42188 13.4062L4.82812 12L9 16.1719Z"
                fill="#01080E"></path>
        </svg>
    `
    const paragrafo = document.createElement('p')
    paragrafo.textContent = tarefa.descricao
    paragrafo.classList.add('app__section-task-list-item-description')

    const botao = document.createElement('button')
    botao.classList.add('app_button-edit')

    const imagemBotao = document.createElement('img')
    imagemBotao.setAttribute('src', '/imagens/edit.png')
    botao.append(imagemBotao)

    li.append(svg)
    li.append(paragrafo)
    li.append(botao)

    return li
}   

btnAdicionarTarefa.addEventListener('click', () => {
    formAdicionarTarefa.classList.toggle('hidden')
})

formAdicionarTarefa.addEventListener('submit', (evento) => {
    evento.preventDefault();
    const tarefa = {
        descricao: textarea.value
    }
    tarefas.push(tarefa)
    const elementoTarefa = criarElementoTarefa(tarefa)
    ulTarefas.append(elementoTarefa)
    localStorage.setItem('tarefas', JSON.stringify(tarefas))
    textarea.value = ''
    formAdicionarTarefa.classList.add('hidden')
})

tarefas.forEach(tarefa => {
    const elementoTarefa = criarElementoTarefa(tarefa)
    ulTarefas.append(elementoTarefa)
});
2 respostas

Oii Gabriel, tudo bem?

A função criarElementoTarefa(tarefa) é chamada duas vezes, mas para propósitos diferentes.

Na primeira vez, ela é chamada dentro do evento submit do formulário. Nesse caso, a função é usada para criar um elemento de tarefa com base no que o usuário digitou no campo de texto e, em seguida, adicionar essa tarefa à lista ulTarefas na página.

Na segunda vez, a função é chamada dentro do forEach que percorre a lista de tarefas armazenadas no localStorage. Aqui, a função é usada para criar um elemento de tarefa para cada tarefa armazenada no localStorage e, em seguida, adicionar essas tarefas à lista ulTarefas na página.

Em ambos os casos, a função criarElementoTarefa(tarefa) está criando um novo elemento de tarefa e adicionando-o à lista ulTarefas. No entanto, ela não está duplicando tarefas. Cada vez que a função é chamada, ela está criando um novo elemento de tarefa com base em uma tarefa diferente - seja a tarefa que o usuário acabou de digitar ou uma tarefa armazenada no localStorage.

Espero ter te ajudado.

Um abraço e bons estudos.

Certo. Tinha entendido que ao chamar a função criarElementoTarefa() dentro do evento submit do formulário e logo em seguida no código ser chamada dentro do forEach, criaria uma duplicata, pois em ambas as vezes, elas armazenam o resultado à ulTarefas.