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

classList.add VS classList.toggle

Resolvi fazer um pequeno teste trocando classList.add por classList.toggle e deu o mesmo resultado. Percebi segundo a explicação do professor que .add adciona uma classe que já existe no CSS e .toggle executa essa classe. Porque usar classList.add nesse caso e não classList.toggle? E porque adcionar uma classe, sabendo que ela já existe no CSS?

Aqui o trecho do código alterado

botaoConclui.classList.toggle('check-button'); // add => adiciona o nome da classe que está entre as aspas simples

Aqui o trecho do código Original

botaoConclui.classList.add('check-button'); // add => adiciona o nome da classe que está entre as aspas simples

Aqui o código completo

const criarTarefa = (evento) => {

    evento.preventDefault();

    const lista = document.querySelector('[data-list]');
    const input = document.querySelector('[data-form-input]');
    const valor = input.value;

    const tarefa = document.createElement('li'); /* Cria um novo elemento */
    tarefa.classList.add('task'); /* Adciona a classe na 'li' criada */
    const conteudo = `<p class="content">${valor}</p>`; /* “Template String” */

    tarefa.innerHTML = conteudo; /* Faz aparecer a tag 'p' com o seu valor dentro das chaves */

    tarefa.appendChild(BotaoConclui()); /* Cria o botão através da função, com escrita, estilo e evento de click */
    lista.appendChild(tarefa); /* Cria(anexa) o elemento filho dentro do elemento pai */
    input.value = " ";
}

const novaTarefa = document.querySelector('[data-form-button]');

novaTarefa.addEventListener('click', criarTarefa);

const BotaoConclui = () => {
    const botaoConclui = document.createElement('button');

    botaoConclui.classList.add('check-button'); // add => adiciona o nome da classe que está entre as aspas simples
    botaoConclui.innerText = 'concluir'; // Adciona o texto que está entre as aspas simples dentro do botão

    botaoConclui.addEventListener('click', concluirTarefa);

    return botaoConclui;
}

const concluirTarefa = (evento) => {
    const botaoConclui = evento.target; // sabe qual o alvo do evento, ou seja, em quem clicou ou qual elemento foi clicado

    const tarefaCompleta = botaoConclui.parentElement; // Sobe um nó na árvore, que é a 'li', ou seja, busca o pai do elemento que é pai do botão

    tarefaCompleta.classList.toggle('done'); // .toggle() => Método que executa o efeito de rabisco do CSS e é capturado a classe pelo 'classList'. o toggle faz um verdadeiro ou falso (booleano)
# }
2 respostas
solução!

Na verdade, o add vai atribuir uma classe que foi criada lá no css para o objeto. A diferença é que o toggle ele pode tanto adicionar quanto remover uma classe: Por exemplo se eu tenho um botão, e eu quero que quando o usuário clica nesse botão a cor de fundo dele muda, e quando o usuário clicar novamente, volta ao normal. Nesse caso, se eu utilizar o add, ele só vai mudar a cor de fundo quando eu clicar, mas se eu clicar de novo ele não volta ao normal. Já o toggle, caso o objeto não tenha a classe, ele adiciona, e caso o objeto já tenha a classe, ele remove, portanto ele permite retornar ao normal.

O add ele não adiciona uma nova classe, ele só atribui uma classe já existente no css a um objeto. Caso você coloque o add, e passe um classe que não foi criada, vai dar erro. Espero ter ajudado.

Muito Obrigado, Matheus Martins Pazinati! Entendi a sua colocação.