Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Repetições de código

Nesta aula, eu tive a impressão de que uma boa parte do código JS foi repetido, e eu fiquei em dúvida se é possivel refatorar para ter menos repetições, mas mantendo as funcionalidades funcionando do jeito que deve ser. Eu estou programando há um pouco mais de 1 ano, então ainda fico insegura em refatorar códigos com receio de bagunçar tudo, mas gostaria de saber se no caso dos códigos desse curso seria uma boa fazer isso. Segue o código JS até aqui:

function alternarModal(modalId, abrir) {
  const modal = document.getElementById(`${modalId}`);

  if (abrir) {
    modal.style.display = "block";
  } else {
    modal.style.display = "none";
  }

  document.body.style.overflow = abrir ? "hidden" : "auto";
}

document.addEventListener("keydown", (evento) => {
  if (evento.key === "Escape") {
    // fechar o modal de inscrição com esc:
    alternarModal("ver-modal-inscrito", false);

    // fechar o submenu com esc:
    document.querySelectorAll(".cabecalho__lista-item").forEach((item) => {
      alternarSubmenu(item, false);
    });
  }
});

function alternarSubmenu(item, mostrar) {
  const submenu = item.querySelector(".submenu");

  if (submenu) {
    submenu.style.display = mostrar ? "block" : "none";
    menuItem = item.querySelector(".cabecalho__lista-item a");
    menuItem.setAttribute("aria-expanded", mostrar ? "true" : "false");

    const dropDownExpandedIcon = item.querySelector(
      ".material-symbols-outlined.icone"
    );
    dropDownExpandedIcon.classList.toggle("active", mostrar);
  }
}

document.querySelectorAll(".cabecalho__lista-item").forEach((item) => {
  item.addEventListener("mouseover", () => alternarSubmenu(item, true));
  item.addEventListener("mouseout", () => alternarSubmenu(item, false));

  item.addEventListener("click", () => {
    const submenu = item.querySelector(".submenu");
    const isDisplayed = submenu.style.display === "block";

    alternarSubmenu(item, !isDisplayed);
  });
});

// Acordeão:
const botoesAcordeao = document.querySelectorAll(".botao-acordeao");

botoesAcordeao.forEach((botao) => {
  botao.addEventListener("click", () => alternarAcordeao(botao));
});

function alternarAcordeao(botao) {
  const jaEstaAberto = botao.getAttribute("aria-expanded") === "true";

  botoesAcordeao.forEach((btn) => {
    btn.setAttribute("aria-expanded", "false");
    const conteudo = btn.nextElementSibling;
    conteudo.classList.remove("expandido");
    conteudo.setAttribute("aria-hidden", "true");
  });

  if (!jaEstaAberto) {
    botao.setAttribute("aria-expanded", "true");

    const conteudo = botao.nextElementSibling;
    conteudo.classList.add("expandido");
    conteudo.setAttribute("aria-hidden", "false");
  };
};
1 resposta
solução!

Oi, Mylena! Como vai?

Você está certíssima em observar as repetições no seu código. Refatorar é uma ótima prática para melhorar a legibilidade e a manutenção do código. Por exemplo:


function alternarElemento(elemento, mostrar) {
  elemento.style.display = mostrar ? "block" : "none";
}

function alternarModal(modalId, abrir) {
  const modal = document.getElementById(modalId);
  alternarElemento(modal, abrir);
  document.body.style.overflow = abrir ? "hidden" : "auto";
}

document.addEventListener("keydown", (evento) => {
  if (evento.key === "Escape") {
    alternarModal("ver-modal-inscrito", false);
    document.querySelectorAll(".cabecalho__lista-item").forEach((item) => {
      alternarSubmenu(item, false);
    });
  }
});

function alternarSubmenu(item, mostrar) {
  const submenu = item.querySelector(".submenu");
  if (submenu) {
    alternarElemento(submenu, mostrar);
    const menuItem = item.querySelector(".cabecalho__lista-item a");
    menuItem.setAttribute("aria-expanded", mostrar ? "true" : "false");
    const dropDownExpandedIcon = item.querySelector(".material-symbols-outlined.icone");
    dropDownExpandedIcon.classList.toggle("active", mostrar);
  }
}

Neste exemplo, eu criei a função alternarElemento para lidar com a exibição de elementos. Isso reduz a repetição de código, pois agora você pode usar essa função sempre que precisar alternar a visibilidade de um elemento. Isso torna o código mais limpo e facilita a manutenção, pois se você precisar mudar a lógica de exibição, só precisará fazer isso em um lugar.

Para melhorar seu senso de refatoração, considere as seguintes dicas:

  1. Identifique padrões: Sempre que você notar que está escrevendo o mesmo código várias vezes, pense em como pode generalizar essa lógica em uma função.
  2. Mantenha funções pequenas: Funções devem ter uma única responsabilidade. Isso facilita a leitura e a reutilização.
  3. Teste após refatorar: Sempre teste seu código após fazer alterações para garantir que tudo ainda funcione como esperado.

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