2
respostas

Fiquei com uma dúvida a respeito do "IIFE" e Componentes

Sobre o "IIFE" que encapsula todo o código, protegendo ele de ser exposto no navegador até aí entendi. A questão que não entendi, é sobre quando é ultilizado os "módulos" que encapsula somente os componetes BotaoConclui e BotaoDeleta e é tirado do código do arquivo main.js os códigos (() => Aqui o código completo })(); do "IIFE". Nesse caso todos os códigos do arquivo main.js ficam desprotegidos? E as funções concluirTarefa e deletarTarefa que não foram envolvidas nos módulos? Também ficam expostas no navegador? Qual seria a importância então de ultilizar o "IIFE" no código completo? E agora é protegido somente 2 componentes ao invés do código completo. Não entendi bem isso. E a minha dúvida acerca dos Componentes, é que eles só é usados quando trata-se de botões na aplicação? Ou é usados para fazer outra coisa também? E quais são como por exemplo? quando usa label? ou quando usa input? quais os exemplos que pode ser ultilizados os componentes?

Códigos do arquivo main.js

// Função de invocação imediata abaixo ==> Vamos utilizar a “IIFE”, ou Immediately Invoked Function Expression ou “Função de Invocação Imediata”. Faz com o que ninguém tenha acesso a nenhuma função de dentro do código, apenas tenha acesso a interação com a página
// (() => { Aqui o código completo })();

import BotaoConclui from "./componentes/concluiTarefa.js";
import BotaoDeleta from "./componentes/deletaTarefa.js";

    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 */
        tarefa.appendChild(BotaoDeleta());
        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);

Códigos do arquivo deletaTarefas.js

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)
}

export default BotaoConclui

/* Para exportar mais de uma função

export {
    concluiTarefa,
    deletaTarefa
}

*/

Códigos do arquivo concluiTarefas.js

const BotaoDeleta = () => { // inicia com letra maiúscula pelo motivo de ser um Componente
        const botaoDeleta = document.createElement('button');

        botaoDeleta.innerHTML = 'Deletar';
        botaoDeleta.addEventListener('click', deletarTarefa);

        return botaoDeleta;
}

const deletarTarefa = (evento) => {
    const botaoDeleta = evento.target;

    const tarefaCompleta = botaoDeleta.parentElement;

    tarefaCompleta.remove(); // método(função) que remove

    return botaoDeleta;
}

export default BotaoDeleta
2 respostas

Pelo que eu entendi da aula e vi na prática aqui testando Marcos, quando definimos um módulo, automaticamente não tem como acessar às variáveis ou funções do nosso código, pois eles não ficam em escopo global. Faça o teste e vá no seu arquivo HTML (index.html) e remova o type = "module" que está na tag <script type = "module"> importando o arquivo main.js depois apague os dois imports na sua linha de código no arquivo main.js, depois tente invocar a função criarTarefa() no console do seu navegador, provavelmente você conseguirá chama-lá, porém se adicionar o type = "module" ou só adicionar novamente os imports verá que ao invocar a função criarTarefa() do main.js retornará undefined. Com isso vemos que fica desnecessário utilizar o IIFE já que o módulo resolve o problema.

Espero que ajude na sua dúvida.

Ok, Marco! Vou fazer os tetstes e ver isso na prática e depois retorno aqui assim que ver o resultado. Por enquanto obrigado! E retornarei aqui em breve.