```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе).
```tsx
import React from 'react';
import { Autocomplete, Cell, Spinner } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async (data, page, pageSize = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
}, 1500)
})
}
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
const onScroll = async (e) => {
if (isInfiniteLoading) return
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
setIsInfiniteLoading(true)
const res = await getData(mockData, suggestions.page + 1, 10)
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
setIsInfiniteLoading(false)
}
};
return (
| } title="Загрузка" stretching="auto" /> : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе). ```tsx
import React from 'react';
import { Autocomplete, Cell, Spinner } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async (data, page, pageSize = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
}, 1500)
})
}
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
const onScroll = async (e) => {
if (isInfiniteLoading) return
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
setIsInfiniteLoading(true)
const res = await getData(mockData, suggestions.page + 1, 10)
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
setIsInfiniteLoading(false)
}
};
return (
| } title="Загрузка" stretching="auto" /> : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Пример кастомной фильтрации на бекенде. Не забываем отключить дефолтную фильтрацию.
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState(mockData)
const getData = async (value) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData.filter(({ label }) => label.toLowerCase().includes(value.toString().toLowerCase())))
}, 200)
})
}
useEffect(() => {
getData(value).then(setSuggestions)
}, [value])
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
filter={() => true} // Отключаем дефолтную фильтрацию
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе). ```tsx
import React from 'react';
import { Autocomplete, Cell, Spinner } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async (data, page, pageSize = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
}, 1500)
})
}
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
const onScroll = async (e) => {
if (isInfiniteLoading) return
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
setIsInfiniteLoading(true)
const res = await getData(mockData, suggestions.page + 1, 10)
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
setIsInfiniteLoading(false)
}
};
return (
| } title="Загрузка" stretching="auto" /> : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Пример кастомной фильтрации на бекенде. Не забываем отключить дефолтную фильтрацию. ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState(mockData)
const getData = async (value) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData.filter(({ label }) => label.toLowerCase().includes(value.toString().toLowerCase())))
}, 200)
})
}
useEffect(() => {
getData(value).then(setSuggestions)
}, [value])
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
filter={() => true} // Отключаем дефолтную фильтрацию
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Если произошла ошибка, или же к примеру нужно показать некую информацию пользователю, то для этой цели можно использовать компонент `EmptyState` .
```tsx
import React from 'react';
import { Autocomplete, EmptyState, Spinner } from '@salutejs/plasma-web';
import { IconRefresh } from '@salutejs/plasma-icons';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData)
}, 1500)
})
}
const [isError, setIsError] = useState(true)
const [isLoading, setIsLoading] = useState(false)
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState([])
const handleGetData = async () => {
setIsLoading(true)
const res = await getData()
setIsLoading(false)
setIsError(false)
setSuggestions(res)
}
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
renderList={isError ? () => } description="Произошла ошибка. Попробуйте обновить." buttonText="Обновить" buttonAction={handleGetData} /> : undefined}
contentRight={isLoading ? : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе). ```tsx
import React from 'react';
import { Autocomplete, Cell, Spinner } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async (data, page, pageSize = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
}, 1500)
})
}
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
const onScroll = async (e) => {
if (isInfiniteLoading) return
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
setIsInfiniteLoading(true)
const res = await getData(mockData, suggestions.page + 1, 10)
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
setIsInfiniteLoading(false)
}
};
return (
| } title="Загрузка" stretching="auto" /> : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Пример кастомной фильтрации на бекенде. Не забываем отключить дефолтную фильтрацию. ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState(mockData)
const getData = async (value) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData.filter(({ label }) => label.toLowerCase().includes(value.toString().toLowerCase())))
}, 200)
})
}
useEffect(() => {
getData(value).then(setSuggestions)
}, [value])
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
filter={() => true} // Отключаем дефолтную фильтрацию
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Если произошла ошибка, или же к примеру нужно показать некую информацию пользователю, то для этой цели можно использовать компонент `EmptyState` . ```tsx
import React from 'react';
import { Autocomplete, EmptyState, Spinner } from '@salutejs/plasma-web';
import { IconRefresh } from '@salutejs/plasma-icons';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData)
}, 1500)
})
}
const [isError, setIsError] = useState(true)
const [isLoading, setIsLoading] = useState(false)
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState([])
const handleGetData = async () => {
setIsLoading(true)
const res = await getData()
setIsLoading(false)
setIsError(false)
setSuggestions(res)
}
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
renderList={isError ? () => } description="Произошла ошибка. Попробуйте обновить." buttonText="Обновить" buttonAction={handleGetData} /> : undefined}
contentRight={isLoading ? : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать. Для такой реализации имеется пропс `portal` , который принимает либо `ref` либо `id` html-тега.
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const ref = useRef(null);
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе). ```tsx
import React from 'react';
import { Autocomplete, Cell, Spinner } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async (data, page, pageSize = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
}, 1500)
})
}
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
const onScroll = async (e) => {
if (isInfiniteLoading) return
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
setIsInfiniteLoading(true)
const res = await getData(mockData, suggestions.page + 1, 10)
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
setIsInfiniteLoading(false)
}
};
return (
| } title="Загрузка" stretching="auto" /> : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Пример кастомной фильтрации на бекенде. Не забываем отключить дефолтную фильтрацию. ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState(mockData)
const getData = async (value) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData.filter(({ label }) => label.toLowerCase().includes(value.toString().toLowerCase())))
}, 200)
})
}
useEffect(() => {
getData(value).then(setSuggestions)
}, [value])
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
filter={() => true} // Отключаем дефолтную фильтрацию
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Если произошла ошибка, или же к примеру нужно показать некую информацию пользователю, то для этой цели можно использовать компонент `EmptyState` . ```tsx
import React from 'react';
import { Autocomplete, EmptyState, Spinner } from '@salutejs/plasma-web';
import { IconRefresh } from '@salutejs/plasma-icons';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData)
}, 1500)
})
}
const [isError, setIsError] = useState(true)
const [isLoading, setIsLoading] = useState(false)
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState([])
const handleGetData = async () => {
setIsLoading(true)
const res = await getData()
setIsLoading(false)
setIsError(false)
setSuggestions(res)
}
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
renderList={isError ? () => } description="Произошла ошибка. Попробуйте обновить." buttonText="Обновить" buttonAction={handleGetData} /> : undefined}
contentRight={isLoading ? : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать. Для такой реализации имеется пропс `portal` , который принимает либо `ref` либо `id` html-тега. ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const ref = useRef(null);
return (
);
}
```
Свойство `virtual` позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство `listMaxHeight` .
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const items = Array(10000).fill(1).map((_, i) => ({ label: i.toString() }));
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
return (
);
}
```
```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
return (
setValue(e.target.value)} onSuggestionSelect={(e) => setValue(e.label)} suggestions={mockData} listMaxHeight="250px" label="Label" placeholder="Placeholder" leftHelper="Введите имя Алексей" />
);
}
```
Это пример с бесконечным лоадингом подсказок в списке. Для удобства порог для открытия списка подсказок понижен до 0 (открываться будет сразу при фокусе). ```tsx
import React from 'react';
import { Autocomplete, Cell, Spinner } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async (data, page, pageSize = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({page, data: data.slice(page * pageSize - 1, page * pageSize - 1 + pageSize)})
}, 1500)
})
}
const [suggestions, setSuggestions] = useState({ page: 1, data: mockData.slice(0, 10) })
const [isInfiniteLoading, setIsInfiniteLoading] = useState(false)
const onScroll = async (e) => {
if (isInfiniteLoading) return
if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) {
setIsInfiniteLoading(true)
const res = await getData(mockData, suggestions.page + 1, 10)
setSuggestions({page: res.page, data: [...suggestions.data, ...res.data]})
setIsInfiniteLoading(false)
}
};
return (
| } title="Загрузка" stretching="auto" /> : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Пример кастомной фильтрации на бекенде. Не забываем отключить дефолтную фильтрацию. ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState(mockData)
const getData = async (value) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData.filter(({ label }) => label.toLowerCase().includes(value.toString().toLowerCase())))
}, 200)
})
}
useEffect(() => {
getData(value).then(setSuggestions)
}, [value])
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
filter={() => true} // Отключаем дефолтную фильтрацию
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Если произошла ошибка, или же к примеру нужно показать некую информацию пользователю, то для этой цели можно использовать компонент `EmptyState` . ```tsx
import React from 'react';
import { Autocomplete, EmptyState, Spinner } from '@salutejs/plasma-web';
import { IconRefresh } from '@salutejs/plasma-icons';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const getData = async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockData)
}, 1500)
})
}
const [isError, setIsError] = useState(true)
const [isLoading, setIsLoading] = useState(false)
const [value, setValue] = useState('')
const [suggestions, setSuggestions] = useState([])
const handleGetData = async () => {
setIsLoading(true)
const res = await getData()
setIsLoading(false)
setIsError(false)
setSuggestions(res)
}
return (
setValue(e.target.value)}
onSuggestionSelect={(e) => setValue(e.label)}
suggestions={suggestions}
listMaxHeight="250px"
renderList={isError ? () => } description="Произошла ошибка. Попробуйте обновить." buttonText="Обновить" buttonAction={handleGetData} /> : undefined}
contentRight={isLoading ? : undefined}
label="Label"
placeholder="Placeholder"
leftHelper="Введите имя Алексей"
/>
);
}
```
Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать. Для такой реализации имеется пропс `portal` , который принимает либо `ref` либо `id` html-тега. ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const mockData = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
{ label: 'Дмитрий Петров' },
{ label: 'Ольга Васильева' },
{ label: 'Сергей Сидоров' },
{ label: 'Мария Кузнецова' },
{ label: 'Андрей Попов' },
{ label: 'Анна Николаева' },
{ label: 'Иван Федоров' },
{ label: 'Наталья Морозова' },
{ label: 'Михаил Павлов' },
{ label: 'Елена Романова' },
{ label: 'Владимир Киселев' },
{ label: 'Татьяна Захарова' },
{ label: 'Николай Семенов' },
{ label: 'Юлия Белова' },
{ label: 'Александр Гусев' },
{ label: 'Оксана Яковлева' },
{ label: 'Игорь Егорова' },
{ label: 'Вера Тихомирова' },
{ label: 'Артем Григорьев' },
{ label: 'Евгения Козлова' },
{ label: 'Максим Лебедев' },
{ label: 'Виктория Калашникова' },
{ label: 'Константин Абрамов' },
{ label: 'Светлана Новикова' },
{ label: 'Юрий Волков' },
{ label: 'Валентина Воробьева' },
{ label: 'Павел Сергеев' },
{ label: 'Людмила Виноградова' },
{ label: 'Антон Соловьев' },
{ label: 'Маргарита Цветкова' },
{ label: 'Роман Трофимов' },
{ label: 'Лариса Зайцева' },
{ label: 'Евгений Никитин' },
{ label: 'Галина Михайлова' },
{ label: 'Владислав Антонов' },
{ label: 'Дарья Филатова' },
{ label: 'Олег Буров' },
{ label: 'Инна Медведева' },
{ label: 'Вячеслав Крылов' },
{ label: 'Тамара Беляева' },
{ label: 'Кирилл Марков' },
{ label: 'Марина Пономарева' },
{ label: 'Борис Захаров' },
{ label: 'Жанна Савельева' },
{ label: 'Федор Жуков' },
{ label: 'Елизавета Логинова' },
{ label: 'Виктор Рыбаков' },
{ label: 'Лилия Макарова' },
];
const ref = useRef(null);
return (
);
}
```
Свойство `virtual` позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство `listMaxHeight` . ```tsx
import React from 'react';
import { Autocomplete } from '@salutejs/plasma-web';
export function App() {
const items = Array(10000).fill(1).map((_, i) => ({ label: i.toString() }));
return (
);
}
```
Пропс `renderItem` для кастомной настройки элемента в выпадающем списке. Принимает коллбэк с одним параметром: `item` .
В примере использован другой наш компонент - Cell.
```tsx
import React from 'react';
import { Select, Cell } from '@salutejs/plasma-web';
export function App() {
const items = [
{ label: 'Алексей Смирнов' },
{ label: 'Екатерина Иванова' },
];
const renderItem = ({ label }) => (
| }
/>
)
return (
);
}
```