Tutorial do Velo: como criar um mega menu expansível

9 min de leitura
Visite o site do Velo by Wix para começar e continuar aprendendo.
Este artigo descreve como você pode criar um mega menu expansível com base nas seleções dos visitantes. Ao longo deste artigo vamos explicar como configuramos o site de amostra e fornecer explicações e dicas para ajudar você a entender o código.

Visão geral

Neste exemplo, criamos um menu que se ramifica em submenus. As escolhas disponíveis em cada submenu são personalizadas com base nas seleções anteriores feitas pelos visitantes. No último submenu (Submenu 2), cada botão do menu leva a uma página com listagens de produtos.
Nosso site inclui o seguinte:
  • Três níveis de menu: Menu principal, Submenu 1 e Submenu 2. Utilizamos repetidores para criar os menus.
  • Duas coleções para armazenar o conteúdo dos links e das etiquetas dos menus.
Então adicionamos o código para fazer o seguinte:
  1. Identificar a escolha dos visitantes para cada menu.
  2. Filtrar os dados da coleção para o próximo submenu, com base na escolha dos visitantes.
  3. Carregar as etiquetas dos botões do repetidor do submenu com os dados da coleção filtrada; no menu final, carregar também os botões do repetidor com links para as páginas de listagem de produtos.
Importante
Inserimos o código em masterPage.js na seção da Página do Código da barra lateral, e não na aba da Página do painel de código. Assim é possível adicionar o menu a qualquer página do seu site.

Adicionar coleções

Adicionamos as seguintes coleções ao nosso site:

Coleção menu

A coleção menu contém os dados do menu Principal e inclui os seguintes campos:
  • rootTitles: Escolhas para o menu Principal (Homem, Mulher)

Coleção subTitles

A coleção subTitles contém os dados dos submenus e inclui os seguintes campos:
  • subTitles: Etiquetas para o Submenu 1
  • menu: Faz referência à coleção do menu Principal; este campo é usado para filtrar os dados da coleção de acordo com a escolha dos visitantes no menu Principal
  • img1: Imagem exibida no Submenu 2
  • subSubItems1: Dados para o repetidor Comprar por Produto do Submenu 2
  • subSubItems2: Dados para o repetidor Comprar por Marca do Submenu 2

Os campos de subSubItems contêm arrays de objetos JSON armazenados como texto. Eles definem a etiqueta do botão e o link para cada botão no Submenu 2.
Dica
Você pode vincular seus botões do menu final a páginas dinâmicas ou a páginas de produtos de Lojas, que exibem seus produtos, eventos, serviços etc. Cole os URLs nos objetos JSON nos campos de subSubItems.

Configurar a página inicial

Na página inicial, adicionamos o seguinte:
  • Menu principal: um repetidor com botões
  • Submenu 1: um repetidor com botões, hidden on load, e um elemento de texto que mostra a seleção do menu Principal (Homem ou Mulher).
  • Submenu 2: uma caixa contêiner, oculta ao carregar, contendo os seguintes elementos:
    • Um repetidor Comprar por Produto com um botão para cada escolha
    • Um repetidor Comprar por Marca com um botão para cada escolha
    • Imagem

Adicionar código

Use os comentários, notas e explicações das seções abaixo para entender melhor o código deste exemplo.

Etapa 1: importações e variáveis globais

1//-------------Importações-------------//
2import wixData from 'wix-data';
3
4//-------------Variáveis Globais-------------//
5
6//Número de repetidores do Submenu 2.
7const subLevel2RepeaterCount = 2;
8
9//Objeto que contém todos os dados do menu da coleção do banco de dados de subTitles.
10let menuData;

A variável subLevel2RepeaterCount representa o número de repetidores no Submenu 2. Vamos usar essa variável depois (Etapa 2), quando processarmos os repetidores para preenchê-los com os dados.

Etapa 2: quando a página carrega

1$w.onReady(async () => {
2  //Obtém os dados do menu da coleção.
3  menuData = await wixData.query("subTitles").find().then(result => result.items);
4
5  //Configura cada repetidor do Submenu 2 assim que são carregados.
6  for (let i = 1; i <= subLevel2RepeaterCount; i++) {
7    $w(`#repeaterSubSub${i}`).onItemReady(($item, itemData, index) => {
8      //Obtém o botão do repetidor de seu ID.
9      const repeaterButton = $item(`#buttonSubLevelTwo${i}`)
10      //Define a etiqueta do item.
11      repeaterButton.label = itemData.label;
12      //Define o link do item.
13      repeaterButton.link = itemData.url;
14    });
15  }
16});

Quando a página carrega, obtemos todos os dados necessários para contruir os submenus a partir da coleção subTitles. Depois filtraremos esses dados de acordo com as escolhas de menu feitas pelos visitantes.

Nota sobre o preenchimento de repetidores
Preencher um repetidor com dados é um processo de duas etapas:

  1. Configure os dados do repetidor utilizando .data. Isso aciona a segunda etapa para todos os itens com um novo ID na array data.
  2. Preencha o repetidor com os dados dos novos itens utilizando a função onItemReady.

Neste exemplo, carregamos os repetidores com dados usando dois métodos diferentes:

  • Submenu 1: utilizamos o método mais simples de ligar um manipulador de eventos onItemReady ao repetidor utilizando o painel de Propriedades (nas Etapas 3 e 6).
  • Submenu 2: como há mais de um repetidor, vamos preenchê-lo utilizando um loop e chamamos onItemReady para dentro de nosso loop (veja a Linha 7 acima). Observe que, apesar de esse código estar na função onReady, ele só é acionado posteriormente, quando os dados dos repetidores do Submenu 2 são configurados (Etapa 8).

Etapa 3: botão do menu principal clicado

1//Define as ações que ocorrem quando o botão do menu principal é clicado.
2export function buttonMainMenu_click(event) {
3    $w("#title").show();
4    $w("#title").text = event.target.label
5 $w("#boxSubSubMenu").hide();
6 //Obtém o ID do botão que foi clicado no menu principal.
7 const selectedMainMenuId = event.context.itemId;
8 //Obtém todos os dados do Submenu 1 referentes à seleção do menu principal.
9 const repeaterData = menuData.filter(item => item.menu === selectedMainMenuId);
10 //Define os dados do repetidor do Submenu 1.
11 $w('#repeaterSubLevelOne').data = repeaterData;
12 //Mostra o repetidor do Submenu 1.
13 $w('#repeaterSubLevelOne').show();
14}

Neste manipulador de eventos, usamos event.target e event.context para obter e usar informações com base na seleção dos visitantes no menu Principal.

Então usamos a função filter do JavaScript para filtrar o objeto menuData com base no ID do botão clicado. menuData contém todos os dados da coleção subTitles.

Utilizamos os dados filtrados para carregar as etiquetas do Submenu 1. Observe que, ao configurar os dados do repetidor na Linha 11, acionamos o manipulador de eventos onItemReady na (Etapa 6)

Etapa 4: passe o mouse sobre o botão do Submenu 1

1//Define uma ação que ocorre quando o ponteiro do mouse passa sobre um botão do Submenu 1.
2export function buttonSub_mouseIn(event) {
3 //Obtém o ID do botão do Submenu 1 sobre o qual o ponteiro do mouse passa.
4 const selectedRootId = event.context.itemId;
5 //Obtém todos os dados do Submenu 2 referentes ao Submenu 1.
6 const repeaterData = menuData.filter(item => item._id === selectedRootId)[0];
7 //Configura o elemento de caixa que corresponde ao botão selecionado no Submenu 2.
8 setSubSubMenu(repeaterData); 
9 //Mostra a caixa do Submenu 2.
10 $w('#boxSubSubMenu').show();
11    }

Aqui executamos um código similar ao da Etapa 3. A diferença é que, como há dois repetidores no Submenu 2, é necessário executar um loop para carregar os repetidores com os dados. Para fazer isso, chamamos a função setSubSubMenufunction (Etapa 8).

Etapa 5: oculte o Submenu 2 quando o mouse se afasta

1//Define uma ação que ocorre quando o ponteiro do mouse se afasta da caixa do Submenu 2.
2
3export function boxSubSubMenu_mouseOut(event) {
4 $w('#boxSubSubMenu').hide();
5}
Quando o visitante afasta o mouse da caixa contêiner do Submenu 2, o submenu fica oculto.

Etapa 6: preencha o repetidor do Submenu 1

1//Configura cada item no repetidor do Submenu 1 assim que são carregados.
2export function repeaterSubLevelOne_itemReady($item, itemData, index) {
3 $item('#buttonSub').label = itemData.subTitles;
4}

Este manipulador de eventos onItemReady é acionado quando os dados do repetidor do Submenu 1 são configurados na Etapa 3.

Etapa 7: crie um ID único para os itens do repetidor do Submenu 2

1//-------------Funções de Utilidade para Configuração de Repetidores-------------//
2
3function createUniqueId() {
4 //Criar um ID único para cada sub-item do menu obtendo o milissegundo atual e adicionando um número aleatório de 1 a 1.000.
5 let id = String(+new Date() + Math.floor(Math.random() * 1000))
6 return id;
7}

Ao carregar os dados em um repetidor, os itens repetidos são criados somente para os objetos com um valor _id ainda não presente na atual array de objetos data. Como somente os itens com IDs podem preencher os repetidores, utilizamos as funções Date e Math do JavaScript para criar um ID único para cada item do Submenu 2. Essa função é utilizada na Etapa 8.

Etapa 8: configure o Submenu 2

1function setSubSubMenu(repeaterData) {
2 //Define a imagem do Submenu 1.
3 $w('#image1').src = repeaterData.img1;
4 for (let i = 1; i <= subLevel2RepeaterCount; i++) {
5  //Converte a string do Submenu 2 em um objeto Javascript.
6  const dataSubSub = JSON.parse(repeaterData[`subSubItems${i}`]);
7  //Define um ID único para cada item.
8  dataSubSub.forEach(subSubItem => {
9   subSubItem._id = createUniqueId();
10  })
11  //Define os dados do Submenu 2 no repetidor.
12  $w(`#repeaterSubSub${i}`).data = dataSubSub;
13 }
14}

Agora vamos configurar o submenu final.

Essa função considera repeaterData como um parâmetro, que são os dados da coleção subTitles que foram filtrados de acordo com as duas seleções anteriores do visitante.

A função faz o seguinte:

  1. Configura a imagem do Submenu 2.
  2. Executa um loop para converter os objetos subSubItems JSON em objetos JavaScript para que possam ser usados no código.
  3. Chama a função createUniqueId (Etapa 7) para criar um ID único para cada item no Submenu 2.
  4. Configura os dados dos repetidores do Submenu 2. Isso aciona a função onItemReady na Etapa 2 e então os repetidores do Submenu 2 são preenchidos.

Saiba mais

  • Veja um exemplo parecido que inclui um template de site com código: Mega menu
  • Veja as seguintes seções de Referência de API do Velo:

Esse artigo foi útil?

|