VxAutoSuggest
Campo de busca com dropdown de sugestões agrupadas. Suporta múltiplos grupos de resultados, navegação por teclado (↑↓ Enter Esc), seleção por mouse, limite de resultados e slots dinâmicos por grupo para renderização customizada de cada item. Utilizado exclusivamente no Bookmarks da navbar.
initalData (não initialData) e inputClassses (3 s's). Usar exatamente como documentado. @selected retorna { [groupName]: suggestion }, não o item diretamente.
Busca com Auto-Foco
Uso padrão na navbar — autoFocus=true foca o input ao montar. hideGroupTitle oculta o cabeçalho de grupo. Slot dinâmico v-slot:pages renderiza cada item com ícone Feather + título + estrela de bookmark.
Com Dados Iniciais (initalData)
initalData (typo intencional — sem segundo 'i') define itens exibidos quando o input está vazio, como starred pages. Mesmo formato do prop data: { groupName: [...] }.
Multi-grupo com Header Customizado
Múltiplos grupos no prop data. Slot group personaliza o cabeçalho de cada seção. Um slot dinâmico por grupo. Sem uso real — o admin usa apenas um grupo (pages).
Sem Resultados (slot noResult)
Slot noResult personaliza a mensagem quando o grupo não retorna resultados. Recebe group_name para mensagens contextuais.
API
<!-- data: { groupName: { key: 'fieldToSearch', data: [...] } } — estrutura obrigatória -->
<!-- Slot dinâmico: nome = chave do grupo. Recebe 'suggestion' (o objeto do item) -->
<vx-auto-suggest
:data="{ pages: { key: 'title', data: pagesList } }"
:initalData="{ pages: starredPages }"
:searchLimit="5"
:autoFocus="true"
:hideGroupTitle="false"
placeholder="Buscar..."
inputClassses="w-full"
@input="onQueryChange"
@selected="onSelect"
@closeSearchbar="onClose"
>
<template v-slot:pages="{ suggestion }">
<span>{{ suggestion.title }}</span>
</template>
</vx-auto-suggest>
Props
| Nome | Tipo | Default | Obrig. | Descrição |
|---|---|---|---|---|
data | Object | — | Sim | Dados para busca. { groupName: { key: 'campo', data: [...] } }. Cada grupo gera uma seção e requer slot com o mesmo nome. |
placeholder | String | "Search.." | — | Placeholder do input. |
initalData | Object | {} | — | Dados exibidos com input vazio (starred/pinned). Typo intencional: initalData (sem segundo 'i'). |
inputClassses | String|Object|Array | null | — | Classes CSS extras para o vs-input. Typo intencional: inputClassses (3 s's). |
autoFocus | Boolean | false | — | Foca o input ao montar. Quando muda para false, limpa o query. |
searchLimit | Number | 4 | — | Máximo de sugestões por grupo. Resultados startsWith aparecem antes dos indexOf. |
hideGroupTitle | Boolean | false | — | Oculta o cabeçalho de grupo. Útil com um único grupo. |
showPinned | Boolean | false | — | Declarada mas sem implementação — reservada para uso futuro. |
Slots
| Nome | Scope | Descrição |
|---|---|---|
group | { group_name } | Header de cada grupo (quando hideGroupTitle=false). |
[groupName] | { suggestion } | Slot dinâmico — nome = chave do grupo no data. Renderiza cada item. Obrigatório por grupo. |
noResult | { group_name } | Exibido quando grupo sem resultados. Default: "No Results Found." |
Eventos
| Nome | Payload | Descrição |
|---|---|---|
input | String | A cada caractere digitado — valor atual do query. |
selected | { [groupName]: suggestion } | Ao selecionar um item (click ou Enter). Payload: objeto com a chave do grupo e o item selecionado. |
closeSearchbar | — | Ao pressionar Esc — pai deve fechar/ocultar o componente. |
Navegação por teclado
| Tecla | Ação |
|---|---|
| ↓ | Próximo item (atravessa grupos) |
| ↑ | Item anterior (atravessa grupos) |
| Enter | Seleciona o item atual e fecha dropdown |
| Esc | Limpa query e emite closeSearchbar |
Onde é usado
- src/layouts/components/navbar/components/Bookmarks.vue