Select

Mantenedor:
korvin89
GitHub
size
pin
placeholder
label
multiple
filterable
disabled
hasClear
import {Select} from '@gravity-ui/uikit';

Select es un control que proporciona una lista de opciones que un usuario puede seleccionar.

Opciones

Opciones para seleccionar.

Definir opciones

Puede definir las opciones como una matriz de objetos o como elementos secundarios de un componente. El primer enfoque es útil para los casos en que las opciones requieren una preparación compleja y, posiblemente, la memorización. El segundo es conveniente cuando hay pocas opciones y su configuración no requiere cálculos complejos.

Lista plana

Array of objects

Child nodes

<Select
  placeholder="value"
  options={[
    {value: 'val_1', content: 'Value 1'},
    {value: 'val_2', content: 'Value 2'},
    {value: 'val_3', content: 'Value 3'},
    {value: 'val_4', content: 'Value 4'},
  ]}
/>
<Select placeholder="value">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Lista agrupada

Array of objects

Child nodes

<Select
  placeholder="value"
  options={[
    {
      label: 'Group 1',
      options: [
        {value: 'val_1', content: 'Value 1'},
        {value: 'val_2', content: 'Value 2'},
      ],
    },
    {
      label: 'Group 2',
      options: [
        {value: 'val_3', content: 'Value 3'},
        {value: 'val_4', content: 'Value 4'},
      ],
    },
  ]}
/>
<Select placeholder="value">
  <Select.OptionGroup label="Group 1">
    <Select.Option value="val_1" content="Value 1" />
    <Select.Option value="val_2" content="Value 2" />
  </Select.OptionGroup>
  <Select.OptionGroup label="Group 2">
    <Select.Option value="val_3" content="Value 3" />
    <Select.Option value="val_4" content="Value 4" />
  </Select.OptionGroup>
</Select>

Almacenamiento de datos en opciones

Puede definir y almacenar datos únicos en cada opción mediante la option.data propiedad. Esto puede resultar útil cuando necesitas enriquecer los datos al usar la onUpdate devolución de llamada o, por ejemplo, al dibujar tus opciones con renderOption ella.

Selección de varias opciones

Para habilitar la selección múltiple, utilice la multiple propiedad. Su valor predeterminado es false.

<Select multiple={true} placeholder="values">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Contador

Puede añadir un contador de los elementos seleccionados al componente mediante la hasCounter propiedad.

0
<Select multiple={true} hasCounter={true} placeholder="values">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Opciones de filtrado

Para habilitar la sección de filtro, utilice la filterable propiedad. Su valor predeterminado es false.

<Select filterable={true} placeholder="Filterable">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Tamaño

Para administrar el tamaño predeterminado de los controles y las opciones, utilice la size propiedad. Su tamaño predeterminado es m.

<Select size="s" placeholder="S Size">
  <Select.Option value="val_1">Value 1</Select.Option>
</Select>
<Select size="m" placeholder="M Size">
  <Select.Option value="val_1">Value 1</Select.Option>
</Select>
<Select size="l" placeholder="L Size">
  <Select.Option value="val_1">Value 1</Select.Option>
</Select>
<Select size="xl" placeholder="XL Size">
  <Select.Option value="val_1">Value 1</Select.Option>
</Select>

Ancho de control

De forma predeterminada, el ancho del control se amplía para que coincida con el ancho del contenido de las opciones seleccionadas. Puede administrarlo utilizando la width propiedad:

'max': Se extiende a todo el ancho del padre.

number: Aplica el ancho en píxeles.

Default

Max

In pixels

<Select>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select width="max">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select width={150}>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Anchura de la ventana emergente

Puede gestionar el ancho de la ventana emergente con la popupWidth propiedad. Los valores disponibles son:

'fit': Aplica el ancho de control.

number: Aplica el ancho en píxeles.

Puntos a tener en cuenta sobre el comportamiento predeterminado:

  • El ancho de la ventana emergente es igual al ancho de la opción más ancha, pero no más ancho que 90vw. Esto no se aplica en caso de que utilice la virtualización.

  • Las opciones limitadas se amplían para ajustarse al ancho del control.

Non-virtualized list

A regular list when all the elements are in the dom tree at once.

Default

Fit

In pixels

<Select>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select>
  <Select.Option value="val_1">Loooooooooooooooooooong Value 1</Select.Option>
  <Select.Option value="val_2">Loooooooooooooooooooong Value 2</Select.Option>
  <Select.Option value="val_3">Loooooooooooooooooooong Value 3</Select.Option>
  <Select.Option value="val_4">Loooooooooooooooooooong Value 4</Select.Option>
</Select>
<Select popupWidth="fit">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select popupWidth="fit">
  <Select.Option value="val_1">Loooooooooooooooooooong Value 1</Select.Option>
  <Select.Option value="val_2">Loooooooooooooooooooong Value 2</Select.Option>
  <Select.Option value="val_3">Loooooooooooooooooooong Value 3</Select.Option>
  <Select.Option value="val_4">Loooooooooooooooooooong Value 4</Select.Option>
</Select>
<Select popupWidth={80}>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select popupWidth={80}>
  <Select.Option value="val_1">Loooooooooooooooooooong Value 1</Select.Option>
  <Select.Option value="val_2">Loooooooooooooooooooong Value 2</Select.Option>
  <Select.Option value="val_3">Loooooooooooooooooooong Value 3</Select.Option>
  <Select.Option value="val_4">Loooooooooooooooooooong Value 4</Select.Option>
</Select>

Lista virtualizada

Para una visualización óptima de una gran cantidad de opciones, Select tiene una herramienta de virtualización de listas incorporada. La virtualización se habilita después de superar el umbral del número de opciones (de forma50 predeterminada). Puede administrar este valor mediante la virtualizationThreshold propiedad.

Cuando se utiliza la virtualización, se aplican algunas restricciones al elemento emergente:

  • El ancho de la ventana emergente ya no se ajusta a la longitud de la opción más larga.

  • El ancho mínimo de la ventana emergente es igual al ancho del control o 100px si el control es más corto.

Default

In pixels

<Select>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select>
  <Select.Option value="val_1">Loooooooooooooooooooong Value 1</Select.Option>
  <Select.Option value="val_2">Loooooooooooooooooooong Value 2</Select.Option>
  <Select.Option value="val_3">Loooooooooooooooooooong Value 3</Select.Option>
  <Select.Option value="val_4">Loooooooooooooooooooong Value 4</Select.Option>
</Select>
<Select popupWidth="fit">
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select popupWidth="fit">
  <Select.Option value="val_1">Loooooooooooooooooooong Value 1</Select.Option>
  <Select.Option value="val_2">Loooooooooooooooooooong Value 2</Select.Option>
  <Select.Option value="val_3">Loooooooooooooooooooong Value 3</Select.Option>
  <Select.Option value="val_4">Loooooooooooooooooooong Value 4</Select.Option>
</Select>
<Select popupWidth={80}>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select popupWidth={80}>
  <Select.Option value="val_1">Loooooooooooooooooooong Value 1</Select.Option>
  <Select.Option value="val_2">Loooooooooooooooooooong Value 2</Select.Option>
  <Select.Option value="val_3">Loooooooooooooooooooong Value 3</Select.Option>
  <Select.Option value="val_4">Loooooooooooooooooooong Value 4</Select.Option>
</Select>

Uso avanzado

Hay muchas formas de personalizar tu Select.

Representación del control personalizado

Para renderizar un control personalizado, utilice la renderControl propiedad. Nota: Debes reenviar todos los argumentos a tu nodo para permitir un comportamiento coherente, igual que cuando usas el control predeterminado.

<Select
  renderControl={({onClick, onKeyDown, ref}) => {
    return <button ref={ref} onClick={onClick} extraProps={{onKeyDown}}>Custom control</button>
  }}
>
  <Select.Option value="val_1">Value 1</Select.Option>
  <Select.Option value="val_2">Value 2</Select.Option>
  <Select.Option value="val_3">Value 3</Select.Option>
  <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Modelización de la sección de filtros personalizados

Para renderizar una sección de filtro personalizada, utilice la renderFilter propiedad y establezca la filterable propiedad en true. Nota: Debes reenviar todos los argumentos a tu nodo para habilitar un filtro que funcione correctamente, igual que cuando usas la configuración predeterminada.

<Select
  placeholder="Custom filter"
  filterable={true}
  renderFilter={({onChange, onKeyDown, ref, value}) => {
    return (
      <div style={{display: 'flex', flexDirection: 'column'}}>
        <input
          ref={ref}
          value={value}
          size="1"
          onKeyDown={onKeyDown}
          onChange={(e) => onChange(e.target.value)}
        />
        <button>Do smth</button>
      </div>
    );
  }}
>
  <Select.Option value="val_1">Value 1</Select.Option>
</Select>

Opciones personalizadas de renderizado

Para renderizar opciones personalizadas, utilice la renderOption propiedad:

<Select
  renderOption={(option) => {
    return (
      <div style={{color: option.data.color}}>
        {option.children}
      </div>
    );
  }}
>
  <Select.Option value="val_1" data={{color: '#8FE1A1'}}>Value 1</Select.Option>
  <Select.Option value="val_2" data={{color: '#38C0A8'}}>Value 2</Select.Option>
  <Select.Option value="val_3" data={{color: '#3A7AC3'}}>Value 3</Select.Option>
  <Select.Option value="val_4" data={{color: '#534581'}}>Value 4</Select.Option>
</Select>

Modelizar las opciones seleccionadas personalizadas

Para renderizar las opciones seleccionadas personalizadas, utilice la renderSelectedOption propiedad:

<Select
  renderSelectedOption={(option) => {
    return (
      <div style={{color: option.data.color}}>
        {option.children}
      </div>
    );
  }}
>
  <Select.Option value="val_1" data={{color: '#8FE1A1'}}>Value 1</Select.Option>
  <Select.Option value="val_2" data={{color: '#38C0A8'}}>Value 2</Select.Option>
  <Select.Option value="val_3" data={{color: '#3A7AC3'}}>Value 3</Select.Option>
  <Select.Option value="val_4" data={{color: '#534581'}}>Value 4</Select.Option>
</Select>

Opciones de renderizado con diferentes alturas

Las opciones tienen una altura fija según la size propiedad. Si necesita renderizar opciones con alturas diferentes, puede usar la option.data propiedad. Almacenará información sobre la altura que necesita establecer para las opciones, así como la getOptionHeight propiedad para establecer este valor.

<Select
  getOptionHeight={(option) => option.data.height}
>
  <Select.Option value="val_1" data={{height: 20}}>Value 1</Select.Option>
  <Select.Option value="val_2" data={{height: 40}}>Value 2</Select.Option>
  <Select.Option value="val_3" data={{height: 60}}>Value 3</Select.Option>
  <Select.Option value="val_4" data={{height: 80}}>Value 4</Select.Option>
</Select>

Representación de una ventana emergente personalizada

Para representar una ventana emergente personalizada, utilice la renderPopup propiedad.

<Select
  filterable
  placeholder="Custom popup"
  renderPopup={({renderList, renderFilter}) => {
    return (
      <React.Fragment>
        {renderFilter()}
        <div style={{width: "100%", height: "20px", backgroundColor: "tomato"}} />
        {renderList()}
      </React.Fragment>
    );
  }}
>
  <Select.Option value="val_1" data={{color: '#8FE1A1'}}>Value 1</Select.Option>
  <Select.Option value="val_2" data={{color: '#38C0A8'}}>Value 2</Select.Option>
  <Select.Option value="val_3" data={{color: '#3A7AC3'}}>Value 3</Select.Option>
  <Select.Option value="val_4" data={{color: '#534581'}}>Value 4</Select.Option>
</Select>

Error

Este Select estado se debe a una entrada de usuario incorrecta. Para cambiar el Select aspecto, utilice la validationState propiedad con el "invalid" valor. Si lo desea, puede proporcionar un mensaje de error a través de la errorMessage propiedad. De forma predeterminada, el texto del mensaje se representa fuera del componente. Puede cambiarlo con la errorPlacement propiedad.

Error message
<Select
    placeholder="Placeholder"
    errorMessage="Error message"
    validationState="invalid"
>
    <Select.Option value="val_1">Value 1</Select.Option>
    <Select.Option value="val_2">Value 2</Select.Option>
    <Select.Option value="val_3">Value 3</Select.Option>
    <Select.Option value="val_4">Value 4</Select.Option>
</Select>
<Select
    placeholder="Placeholder"
    errorPlacement="inside"
    errorMessage="Error message"
    validationState="invalid"
>
    <Select.Option value="val_1">Value 1</Select.Option>
    <Select.Option value="val_2">Value 2</Select.Option>
    <Select.Option value="val_3">Value 3</Select.Option>
    <Select.Option value="val_4">Value 4</Select.Option>
</Select>

Propiedades

NombreDescripciónTipoPredeterminado
classNameNombre de clase de controlstring
defaultValueValores predeterminados que representan las opciones seleccionadas en caso de usar un estado no controladostring[]
inhabilitadoMuestra que el usuario no puede trabajar con el controlbooleanfalse
filtrableMuestra que la ventana emergente de selección tiene una sección de filtrobooleanfalse
filterOptionSe usa para comparar la opción con el filtrofunction
filterPlaceholderTexto de marcador de posición de entrada de filtro predeterminadostring
getOptionHeightSe utiliza para establecer la altura de las opciones de usuario personalizadasfunction
getOptionGroupHeightSe utiliza para establecer la altura del grupo de opciones de usuario personalizadofunction
hasClearActiva la visualización del icono para borrar las opciones seleccionadasbooleanfalse
identificaciónid Atributo HTMLstring
etiquetaEtiqueta de controlstring
cargandoAñade el elemento de carga al final de la lista de opciones. Funciona como un indicador de carga persistente mientras la lista de opciones está vacía.boolean
múltipleMuestra si se pueden seleccionar varias opciones en la listabooleanfalse
nombreNombre del controlstring
onBlurControlador que se invoca cuando el elemento pierde el foco.function
filtrarValor de filtro controladostring''
onFilterChangeSe dispara cada vez que se cambia el filtrofunction
onFocusControlador que se llama cuando el elemento se enfocafunction
onLoadMoreSe activa cuando el indicador de carga se hace visiblefunction
onOpenChangeSe activa cada vez que se cambia la visibilidad de la ventana emergentefunction
onUpdateSe activa cuando el usuario comete una modificación del Select valorfunction
opcionesOpciones para seleccionar(Seleccione la opción| [Seleccione el grupo de opciones)]
alfilerControlar la vista de la fronterastring'round-round'
marcador de posiciónTexto de marcador de posiciónstring
popupClassNameVentana emergente con la lista de opciones classNamestring
popupPlacementColocación de ventanas emergentesPopupPlacement Matriz<PopupPlacement>['bottom-start', 'bottom-end', 'top-start', 'top-end']
popupWidthAnchura de la ventana emergentenúmero| 'ajustado'| 'atuendo''outfit'
qaAtributo de identificación de prueba (data-qa)string
renderControlSe usa para renderizar el control del usuariofunction
renderEmptyOptionsSe usa para representar un nodo para una lista de opciones vacíafunction
renderFilterSe usa para renderizar la sección de filtro de usuariofunction
renderOptionSe usa para representar las opciones de usuariofunction
renderOptionGroupSe usa para representar grupos de opciones de usuariofunction
renderSelectedOptionSe usa para representar las opciones seleccionadas por el usuariofunction
renderPopupSe utiliza para representar el contenido emergente del usuariofunction
tamañoTamaño de control/ opcionesstring'm'
valorValores que representan las opciones seleccionadasstring[]
vistaVista de controlstring'normal'
virtualizationThresholdUmbral de recuento de opciones tras el cual se habilita la virtualizaciónnumber50
anchuraAncho de controlcadena| númeroundefined
errorMessageTexto de errorstring
errorPlacementPosición de erroroutside insideoutside
validationStateEstado de validación"invalid"
hasCounterMuestra el recuento de opciones seleccionadas. El contador solo aparece cuando la selección múltiple está habilitada.boolean

API CSS

NombreDescripción
--g-select-focus-outline-colorColor del contorno si está enfocado (falta de forma predeterminada)