Компонент AutoComplete в Naive UI предоставляет функционал автодополнения для ввода текста. Он позволяет пользователю получать подсказки на основе введённого значения и выбирать их из предложенного списка. Для начала необходимо импортировать компонент и подключить его в шаблоне:
import { NAutoComplete } from 'naive-ui'
export default {
components: {
NAutoComplete
},
setup() {
const options = [
{ label: 'JavaScript', value: 'js' },
{ label: 'TypeScript', value: 'ts' },
{ label: 'Vue.js', value: 'vue' },
{ label: 'React', value: 'react' }
]
return { options }
}
}
В шаблоне компонент используется следующим образом:
<n-auto-complete
v-model:value="selected"
:options="options"
placeholder="Выберите язык"
/>
Здесь v-model:value связывает выбранное значение с
переменной selected, а options задаёт
список предложений.
Для реализации динамической фильтрации подсказок используется свойство filter. Оно принимает функцию, которая проверяет, подходит ли конкретный вариант под введённое значение:
const filterOptions = (pattern, option) => {
return option.label.toLowerCase().includes(pattern.toLowerCase())
}
<n-auto-complete
v-model:value="selected"
:options="options"
:filter="filterOptions"
placeholder="Начните ввод"
/>
С помощью такой функции можно контролировать логику поиска, например, игнорировать регистр или использовать более сложные алгоритмы сопоставления.
AutoComplete позволяет работать с удалёнными источниками данных. Для этого используется событие on-update:value, которое срабатывает при изменении ввода, и обновление списка options через реактивную переменную:
import { ref, watch } from 'vue'
const query = ref('')
const options = ref([])
watch(query, async (newValue) => {
if (!newValue) {
options.value = []
return
}
const response = await fetch(`https://api.example.com/search?q=${newValue}`)
const data = await response.json()
options.value = data.map(item => ({ label: item.name, value: item.id }))
})
<n-auto-complete
v-model:value="query"
:options="options"
placeholder="Поиск"
/>
Такой подход позволяет реализовать автодополнение с серверной фильтрацией и подгрузкой данных по мере ввода.
С помощью слота label можно кастомизировать отображение каждой подсказки:
<n-auto-complete v-model:value="selected" :options="options">
<template #label="{ option }">
<strong>{{ option.label }}</strong> — {{ option.value }}
</template>
</n-auto-complete>
Также можно использовать слот option для полной кастомизации элемента списка, включая добавление иконок или дополнительной информации.
Свойства компонента позволяют тонко настраивать поведение выпадающего списка:
top-start, bottom-end и т.д.).<n-auto-complete
v-model:value="selected"
:options="options"
placement="bottom-start"
:max-height="200"
:virtual-scroll="true"
/>
Использование виртуального скролла существенно повышает производительность при работе с тысячами элементов.
AutoComplete поддерживает полноценную навигацию с клавиатуры: стрелки вверх/вниз для выбора и Enter для подтверждения. Дополнительно доступны события:
const handleSelect = (option) => {
console.log('Выбрана опция:', option)
}
<n-auto-complete
v-model:value="selected"
:options="options"
@on-select="handleSelect"
/>
Если список опций содержит сложные объекты, нужно явно указать поля для отображения и значения:
const options = [
{ id: 1, name: 'JavaScript', category: 'frontend' },
{ id: 2, name: 'Node.js', category: 'backend' }
]
<n-auto-complete
v-model:value="selected"
:options="options"
label-key="name"
value-key="id"
/>
Свойства label-key и value-key позволяют использовать любые поля объектов для отображения и хранения значения.
AutoComplete полностью совместим с Naive UI Form. Можно использовать его как валидируемое поле формы:
<n-form>
<n-form-item label="Язык" path="language" :rule="{ required: true, message: 'Выберите язык' }">
<n-auto-complete v-model:value="selected" :options="options" />
</n-form-item>
</n-form>
Валидация срабатывает при попытке отправки формы, и пользователю показываются сообщения об ошибках.
Этот подход делает AutoComplete в Naive UI мощным инструментом для создания интерфейсов с динамическим поиском, фильтрацией и кастомизацией списка подсказок, обеспечивая гибкость как для простых, так и для сложных сценариев.