В режиме `textfield` доступны только следующие варианты `view` : `default` , `warning` , `positive` и `negative` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `textfield` доступны только следующие варианты `view` : `default` , `warning` , `positive` и `negative` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `button` недоступны следующие пропсы: `contentLeft` , `label` , `labelPlacement` , `placeholder` и `helperText` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `textfield` доступны только следующие варианты `view` : `default` , `warning` , `positive` и `negative` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `button` недоступны следующие пропсы: `contentLeft` , `label` , `labelPlacement` , `placeholder` и `helperText` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Есть возможность задать значения по дефолту (главное, чтобы они находились в `items` ). Также можно управлять состоянием снаружи селекта. ```tsx import React from 'react'; import { Select, Button } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState(['brazil', 'north_america']); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Пропс `renderValue` для кастомной настройки `value` внутри таргета. Принимает коллбэк с двумя параметрами: `value` и `label` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const renderValue = (itemData): string => { if (!Array.isArray(itemData)) { return `${itemData.value} - ${itemData.label}`; } return ''; }; return (
); } ``` Пропс `renderValue` для кастомной настройки `value` внутри таргета. Принимает коллбэк с двумя параметрами: `value` и `label` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const renderValue = (itemData): string => { if (!Array.isArray(itemData)) { return `${itemData.value} - ${itemData.label}`; } return ''; }; return (
); } ``` В режиме `textfield` доступны только следующие варианты `view` : `default` , `warning` , `positive` и `negative` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `button` недоступны следующие пропсы: `contentLeft` , `label` , `labelPlacement` , `placeholder` и `helperText` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Есть возможность задать значения по дефолту (главное, чтобы они находились в `items` ). Также можно управлять состоянием снаружи селекта. ```tsx import React from 'react'; import { Select, Button } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState(['brazil', 'north_america']); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` `renderTarget` - для кастомной настройки таргета в Select. Принимает коллбэк с один параметром: `value` . Пропс `renderItem` для кастомной настройки айтема в выпадающем списке. Принимает коллбэк с двумя параметрами: `value` и `label` . В примере использован другой наш компонент - Cell. ```tsx import React from 'react'; import { Select, Cell } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', }, ]; const renderTarget = (itemData, opened) => { console.log(opened); if (Array.isArray(itemData)) { if (itemData.length === 0) { return (
); } const title = itemData.map((item) => item.label).join(', '); return (
); } } const renderItem = ({ value, label }) => ( } /> ) return (
); } ``` В режиме `textfield` доступны только следующие варианты `view` : `default` , `warning` , `positive` и `negative` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `button` недоступны следующие пропсы: `contentLeft` , `label` , `labelPlacement` , `placeholder` и `helperText` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Есть возможность задать значения по дефолту (главное, чтобы они находились в `items` ). Также можно управлять состоянием снаружи селекта. ```tsx import React from 'react'; import { Select, Button } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState(['brazil', 'north_america']); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` `renderTarget` - для кастомной настройки таргета в Select. Принимает коллбэк с один параметром: `value` . Пропс `renderItem` для кастомной настройки айтема в выпадающем списке. Принимает коллбэк с двумя параметрами: `value` и `label` . В примере использован другой наш компонент - Cell. ```tsx import React from 'react'; import { Select, Cell } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', }, ]; const renderTarget = (itemData, opened) => { console.log(opened); if (Array.isArray(itemData)) { if (itemData.length === 0) { return (
); } const title = itemData.map((item) => item.label).join(', '); return (
); } } const renderItem = ({ value, label }) => ( } /> ) return (
); } ``` `value` и `onChange` - опциональные параметры. Если вы хотите `uncontrolled` вариант компонента - их пробрасывать необязательно. ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Пропс `renderValue` для кастомной настройки `value` внутри таргета. Принимает коллбэк с двумя параметрами: `value` и `label` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const renderValue = (itemData): string => { if (!Array.isArray(itemData)) { return `${itemData.value} - ${itemData.label}`; } return ''; }; return (
); } ``` Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать. Для такой реализации имеется пропс `portal` , который принимает либо `ref` либо `id` html-тега. Также нужно прокинуть проп `listWidth` , чтобы явно задать ширину списку. Если этого не сделать, то будет взята ширина 100% от блока, на который ведет ссылка портала. ```tsx import React, { useRef } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [value, setValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const ref = useRef(null) return (
); } ``` Свойство `virtual` позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство `listMaxHeight` . Работает только в одноуровневых списках. ```tsx import React, { useState } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const items = Array(5000).fill(1).map((_, i) => ({ value: i.toString(), label: i.toString() })); return (
); } ``` Пропс `renderValue` для кастомной настройки `value` внутри таргета. Принимает коллбэк с двумя параметрами: `value` и `label` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const renderValue = (itemData): string => { if (!Array.isArray(itemData)) { return `${itemData.value} - ${itemData.label}`; } return ''; }; return (
); } ``` Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать. Для такой реализации имеется пропс `portal` , который принимает либо `ref` либо `id` html-тега. Также нужно прокинуть проп `listWidth` , чтобы явно задать ширину списку. Если этого не сделать, то будет взята ширина 100% от блока, на который ведет ссылка портала. ```tsx import React, { useRef } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [value, setValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const ref = useRef(null) return (
); } ``` Свойство `virtual` позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство `listMaxHeight` . Работает только в одноуровневых списках. ```tsx import React, { useState } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const items = Array(5000).fill(1).map((_, i) => ({ value: i.toString(), label: i.toString() })); return (
Загружаю... : undefined} />
); } ``` В режиме `textfield` доступны только следующие варианты `view` : `default` , `warning` , `positive` и `negative` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` В режиме `button` недоступны следующие пропсы: `contentLeft` , `label` , `labelPlacement` , `placeholder` и `helperText` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Есть возможность задать значения по дефолту (главное, чтобы они находились в `items` ). Также можно управлять состоянием снаружи селекта. ```tsx import React from 'react'; import { Select, Button } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState(['brazil', 'north_america']); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` `renderTarget` - для кастомной настройки таргета в Select. Принимает коллбэк с один параметром: `value` . Пропс `renderItem` для кастомной настройки айтема в выпадающем списке. Принимает коллбэк с двумя параметрами: `value` и `label` . В примере использован другой наш компонент - Cell. ```tsx import React from 'react'; import { Select, Cell } from '@salutejs/plasma-web'; export function App() { const [multipleValue, setMultipleValue] = useState([]); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', }, ]; const renderTarget = (itemData, opened) => { console.log(opened); if (Array.isArray(itemData)) { if (itemData.length === 0) { return (
); } const title = itemData.map((item) => item.label).join(', '); return (
); } } const renderItem = ({ value, label }) => ( } /> ) return (
); } ``` `value` и `onChange` - опциональные параметры. Если вы хотите `uncontrolled` вариант компонента - их пробрасывать необязательно. ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; return (
); } ``` Пример с бесконечной загрузкой элементов в списке. ```tsx import React, { useState } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { function getRandomData() { return Array(10) .fill(1) .map(() => { const n = Math.floor(Math.random() * 90000000) + 10000000; return { value: n.toString(), label: n.toString() }; }); }; const [items, setItems] = useState(getRandomData()); const [isInfiniteLoading, setIsInfiniteLoading] = useState(false); const getData = async () => { return new Promise((resolve) => { setTimeout(() => { resolve(getRandomData()); }, 1500); }); }; const handleScroll = async (e) => { if (isInfiniteLoading) return; if (e.target.scrollTop + e.target.offsetHeight + 10 > e.target.scrollHeight) { setIsInfiniteLoading(true); const res = await getData(); setItems([...items, ...res]); setIsInfiniteLoading(false); } }; return (
); } ``` Пропс `renderValue` для кастомной настройки `value` внутри таргета. Принимает коллбэк с двумя параметрами: `value` и `label` . ```tsx import React from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [singleValue, setSingleValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const renderValue = (itemData): string => { if (!Array.isArray(itemData)) { return `${itemData.value} - ${itemData.label}`; } return ''; }; return (
); } ``` Иногда возникает необходимость вынесения выпадающего списка на уровни выше в DOM. К примеру, когда у родительского блока имеется скролл, и список будет обрезаться, чего хотелось бы избежать. Для такой реализации имеется пропс `portal` , который принимает либо `ref` либо `id` html-тега. Также нужно прокинуть проп `listWidth` , чтобы явно задать ширину списку. Если этого не сделать, то будет взята ширина 100% от блока, на который ведет ссылка портала. ```tsx import React, { useRef } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const [value, setValue] = useState(''); const items = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'south_america', label: 'Южная Америка', items: [ { value: 'brazil', label: 'Бразилия', }, { value: 'argentina', label: 'Аргентина', }, ], }, ]; const ref = useRef(null) return (
); } ``` Свойство `virtual` позволяет виртуализировать выпадающий список. Для настройки высоты списка можно использовать свойство `listMaxHeight` . Работает только в одноуровневых списках. ```tsx import React, { useState } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const items = Array(5000).fill(1).map((_, i) => ({ value: i.toString(), label: i.toString() })); return (
Загружаю... : undefined} />
); } ``` Работа с кнопкой "Выбрать всё" осуществляется через свойство `selectAllOptions` только в режиме `multiselect` : ```tsx type SelectAllProps = { checked?: boolean; indeterminate?: boolean; label?: string; onClick?: () => void; sticky?: boolean; }; ``` Вся логика выбора элементов и взаимодействия с компонентом лежит на стороне пользователя. ```tsx import React, { useState } from 'react'; import { Select } from '@salutejs/plasma-web'; export function App() { const flatItems = [ { value: 'north_america', label: 'Северная Америка', }, { value: 'rio_de_janeiro', label: 'Рио-де-Жанейро', }, { value: 'sao_paulo', label: 'Сан-Паулу', }, { value: 'buenos_aires', label: 'Буэнос-Айрес', }, { value: 'cordoba', label: 'Кордова', }, { value: 'bogota', label: 'Богота', }, { value: 'medellin', label: 'Медельин', }, ]; const [value, setValue] = useState([]); const [checked, setChecked] = useState(false); const [indeterminate, setIndeterminate] = useState(false); const handleClick = () => { if (checked && !indeterminate) { setValue([]); } else { setValue(flatItems.map((item) => item.value)); } }; React.useEffect(() => { if (value.length === 0) { setChecked(false); setIndeterminate(false); } else if (value.length === flatItems.length) { setChecked(true); setIndeterminate(false); } else { setChecked(true); setIndeterminate(true); } }, [value]); return (
)} /> ( )} /> (