Transfer List

View pricing →

Início rápido da instalação Pro 🚀

Introdução

Visão Geral da Lista de Transferência

1 min

A entrada de lista de transferência é ideal para situações onde o usuário final precisa selecionar e ordenar múltiplos valores de uma lista de opções. Neste exemplo, estamos permitindo que o usuário final selecione de um grupo de convidados e os mova para uma lista VIP:

Carregar exemplo ao vivo

Começando

Nesta seção, vamos cobrir o básico de como replicar o exemplo 'Convidados vs VIPs' acima.

Entrada base

Abaixo está um exemplo da entrada de lista de transferência com as propriedades mínimas necessárias. Como você pode ver, existem duas caixas de listagem: a caixa de listagem de origem e a caixa de listagem de destino. A caixa de listagem de origem conterá a lista de opções, e a caixa de listagem de destino conterá as opções selecionadas:

Carregar exemplo ao vivo

Rótulos

Vamos adicionar algumas propriedades de rótulo para deixar claro para o usuário final como usar a entrada de lista de transferência. Vamos adicionar uma propriedade label para explicar a diretiva ao usuário, e propriedades source-label e target-label para indicar qual caixa de listagem é a origem e qual é o destino:

Carregar exemplo ao vivo

Mensagens de vazio de origem e destino

Neste estado, sem opções passadas e sem valores selecionados, podemos exibir uma mensagem personalizada para o usuário definindo as propriedades source-empty-message e target-empty-message:

Carregar exemplo ao vivo

Definindo opções

A propriedade options pode aceitar três formatos diferentes de valores:

  • Um array de objetos com chaves value e label
  • Um array de strings 'A', 'B', 'C'
  • Um objeto literal com pares chave-valor { a: 'A', b: 'B', c: 'C' }
  • Uma função que retorna qualquer um dos acima

Vamos seguir em frente e popular as opções da lista de transferência com uma lista de nomes de convidados:

Carregar exemplo ao vivo

Valores

O valor da entrada da lista de transferência é um array. Valores de opções selecionadas da lista de origem serão anexados ao array. Para mostrar a mudança de valor no exemplo abaixo, vamos envolver a entrada da lista de transferência em um formulário FormKit, definir o nome da entrada da lista de transferência para vips e mostrar o valor do próprio formulário em uma tag <pre> (se você não está familiarizado com formulários FormKit, pode ler mais aqui):

Carregar exemplo ao vivo

Valores iniciais

A entrada da lista de transferência pode ser pré-populada com valores definindo a propriedade value na própria transferlist ou em um form ou group que a envolva. Lembre-se de que os valores que você passa para a propriedade value precisam corresponder às chaves dos valores na sua lista de opções:

Carregar exemplo ao vivo

Pesquisável

A entrada da lista de transferência pode ser tornada pesquisável definindo a propriedade searchable. Neste exemplo, vamos definir a propriedade searchable e também definir uma propriedade placeholder para a entrada de pesquisa:

Carregar exemplo ao vivo
Apenas as opções são pesquisadas
A entrada de pesquisa pesquisa apenas pelas opções na lista de opções de origem. Ela não retorna opções que já foram transferidas para a lista de destino.

Filtragem

A entrada da lista de transferência filtrará opções com sua própria função de pesquisa interna. Você pode substituir essa função de pesquisa fornecendo à propriedade filter uma função sua. Sua função receberá dois argumentos, a opção que está sendo iterada e o valor atual da pesquisa:

Carregar exemplo ao vivo

Limpar ao selecionar

Por padrão, a entrada da lista de transferência limpará a entrada de pesquisa ao selecionar. Você pode alterar esse comportamento definindo a propriedade clear-on-select como false:

Máximo

A entrada da lista de transferência pode ser limitada a um número máximo de valores selecionados definindo a propriedade max. Apenas para este exemplo, vamos definir a propriedade max para 2 para limitar o número de VIPs que podem ser selecionados:

Carregar exemplo ao vivo

Transferência ao selecionar

Por padrão, a entrada da lista de transferência adicionará ou removerá opções ao clicar. Você pode alterar esse comportamento definindo a propriedade transfer-on-select como false. Agora, a lista de transferência se comportará mais como uma lista de transferência tradicional:

Carregar exemplo ao vivo

Assincronia

Opções assíncronas

Aqui temos uma entrada de lista de transferência que carrega suas opções a partir de uma função assíncrona. A função é chamada quando o componente é montado e as opções são subsequentemente carregadas na caixa de lista de origem:

Carregar exemplo ao vivo

Paginação

Agora vamos supor que nossa solicitação à API não busca todas as opções de que precisamos, mas em vez disso retorna uma resposta paginada. A entrada da lista de transferência pode lidar com a paginação com uma configuração mínima para a função assíncrona.

Ao atribuir a propriedade de opções a uma função assíncrona, a função será chamada com o objeto de contexto do FormKit como seu primeiro argumento. Este objeto de contexto contém uma propriedade page (a página atual que estamos tentando carregar) que é rastreada pela entrada da lista de transferência, e hasNextPage, que é uma função de retorno de chamada que podemos usar para informar à lista de transferência que há mais opções para carregar:

Carregar exemplo ao vivo

Pesquisa

A entrada da lista de transferência também pode carregar opções assincronamente quando o usuário pesquisa. Neste exemplo, vamos adicionar de volta a propriedade searchable e mudar getGuests() para searchGuests(). Quando o usuário pesquisar, searchGuests() será chamado com o mesmo objeto de contexto de antes, mas desta vez, vamos desestruturar apenas a propriedade search. Além disso, modificaremos getGuests() para retornar convidados apenas quando um valor de pesquisa for fornecido:

Carregar exemplo ao vivo

Carregador de opções

Reidratando valores

A entrada da lista de transferência também fornece uma propriedade optionLoader que permite reidratar valores que não estão na lista de opções. Neste exemplo, forneceremos à lista de transferência um valor inicial (um ID de convidado) e atribuiremos o optionLoader a uma função que fará uma solicitação à API para buscar os dados individuais do convidado:

Carregar exemplo ao vivo

Observe no exemplo acima que a função optionLoader getGuest recebe dois argumentos: o valor da opção selecionada (neste caso, o ID do filme) e o cachedOption. O cachedOption é usado para prevenir buscas desnecessárias; se o cachedOption não for null, significa que a opção selecionada já foi carregada, e você pode retornar o cachedOption diretamente.

Buscando dados adicionais

Você também pode usar o optionLoader para buscar dados adicionais sobre valores selecionados que não estão na lista de opções. Neste exemplo, após selecionar uma opção, vamos realizar uma busca para carregar a idade do convidado selecionado:

Carregar exemplo ao vivo

Slots

Assim como qualquer outro input do FormKit, o input de lista de transferência permite que você utilize slots para personalizar sua marcação.

Opções de origem e destino

Agora que estamos carregando dados adicionais sobre valores selecionados (a idade e o endereço de e-mail do convidado selecionado), vamos personalizar a aparência dos valores selecionados usando os slots target-option:

Carregar exemplo ao vivo

Exemplos

Ordem classificada

O input de lista de transferência pode ser usado para criar uma lista classificada, vamos fazer isso com os maiores jogadores da NBA:

Carregar exemplo ao vivo

Props & Atributos

PropTypePadrãoDescrição
debouncenumber200Número de milissegundos para debater chamadas a uma função de opções.
optionsany[]A lista de opções que o usuário pode selecionar.
filterfunctionnullUsado para aplicar sua própria função de filtro personalizada para opções estáticas.
option-loaderfunctionnullUsado para hidratar o valor inicial, ou realizar uma solicitação adicional para carregar mais informações de uma opção selecionada.
source-empty-messagestringundefinedExibe uma mensagem quando não há opções para mostrar.
target-empty-messagestringundefinedExibe uma mensagem quando não há valores para mostrar.
maxnumberundefinedLimita o número de opções que podem ser selecionadas.
clear-on-selectbooleantrueLimpa o campo de busca após selecionar uma opção (apenas para opções que não são carregadas via função).
searchablebooleanfalseHabilita o campo de busca.
source-labelstringundefinedExibe um rótulo para a lista de origem.
target-labelstringundefinedExibe um rótulo para a lista de destino.
transfer-on-selectbooleantrueTransfere automaticamente as opções selecionadas para a lista de destino. Se definido como falso, renderizará botões de transferência para frente e para trás.
Mostrar Universal props
configObject{}Opções de configuração a serem fornecidas para o nó do input e qualquer nó descendente deste input.
delayNumber20Número de milissegundos para debounce do valor do input antes de despachar o commit hook.
dirtyBehaviorstringtouchedDetermina como o indicador "dirty" deste input é definido. Pode ser configurado como touched ou compare - touched (o padrão) é mais performático, mas não detectará quando o formulário corresponder novamente ao seu estado inicial.
errorsArray[]Array de strings para exibir como mensagens de erro neste campo.
helpString''Texto para o texto de ajuda associado ao input.
idStringinput_{n}O ID único do input. Fornecer um ID também permite acesso global ao nó do input.
ignoreBooleanfalseImpede que um input seja incluído em qualquer pai (grupo, lista, formulário etc). Útil ao usar inputs para a interface do usuário em vez de valores reais.
indexNumberundefinedPermite que um input seja inserido no índice fornecido, se o pai for uma lista. Se o valor do input for indefinido, ele herda o valor dessa posição de índice. Se ele tiver um valor, ele o insere nos valores da lista no índice fornecido.
labelString''Texto para o elemento label associado ao input.
nameStringinput_{n}O nome do input como identificado no objeto de dados. Isso deve ser único dentro de um grupo de campos.
parentFormKitNodecontextualPor padrão, o pai é um grupo, lista ou formulário de envolvimento, mas essa prop permite a atribuição explícita do nó pai.
prefix-iconString''Especifica um ícone para colocar na seção prefixIcon.
preservebooleanfalsePreserva o valor do input em um grupo pai, lista ou formulário quando o input é desmontado.
preserve-errorsbooleanfalsePor padrão, os erros definidos em inputs usando setErrors são automaticamente limpos no input. Definir essa prop como true mantém o erro até que ele seja explicitamente limpo.
sections-schemaObject{}Um objeto de chaves de seção e valores parciais de esquema, em que cada esquema parcial é aplicado à seção respectiva.
suffix-iconString''Especifica um ícone para colocar na seção suffixIcon.
typeStringtextO tipo de input a ser renderizado pela biblioteca.
validationString, Array[]As regras de validação a serem aplicadas ao input.
validation-visibilityStringblurDetermina quando mostrar as regras de validação com falha de um input. Os valores válidos são blur, dirty e live.
validation-labelString{label prop}Determina qual rótulo usar nas mensagens de erro de validação, por padrão, usa a propriedade label, se disponível, caso contrário, usa a propriedade name.
validation-rulesObject{}Regras de validação personalizadas adicionais para disponibilizar na propriedade de validação.
valueAnyundefinedInicializa o valor do input e/ou de seus filhos. Não é reativo. Pode inicializar grupos inteiros (formulários) e listas..

Seções

Você pode direcionar uma seção específica de uma entrada usando a "chave" dessa seção, permitindo que você modifique as classes dessa seção, HTML (via :sections-schema), ou conteúdo (via slots). Leia mais sobre seções aqui.

Invólucro da lista de transferência

View on a larger screen to see this section diagram.

Escolha os VIPs para a festa
Você pode selecionar até 3 VIPs.
Lista de origem
Controles de transferência
Lista de destino
Desculpe, você não pode adicionar mais de 3 convidados.

Origem

View on a larger screen to see this section diagram.

Convidados
97
Nenhum convidado encontrado
John Doe

Controles de transferência

View on a larger screen to see this section diagram.

Destino

View on a larger screen to see this section diagram.

VIPs
3
Nenhum VIP selecionado
John Doe
Section-keyDescrição
fieldsetUm elemento fieldset que atua como o elemento raiz para a entrada da lista de transferência.
legendUm elemento legend que renderiza o rótulo.
sourceUm elemento div que contém as seções sourceHeader, sourceControls e sourceListItems.
sourceHeaderUm elemento div que contém as seções sourceHeaderLabel e sourceHeaderItemCount
sourceHeaderLabelUm elemento label que renderiza a propriedade sourceLabel.
sourceHeaderItemCountUm elemento span que renderiza o número de itens e o número de itens selecionados na lista de origem.
sourceControlsUm elemento div que contém as seções sourceSearchINput e sourceSearchClear
sourceSearchUm elemento div que contém as seções sourceSearchInput e sourceSearchClear
sourceSearchInputUm elemento de entrada de texto usado para pesquisa.
sourceSearchClearUm elemento button que limpa a entrada de pesquisa.
closeIconO span usado contendo o ícone para limpar a entrada de pesquisa.
sourceListItemsUm elemento ul que contém os sourceListItems.
sourceEmptyMessageUm elemento li que contém a seção emptyMessageInner.
emptyMessageInnerUm elemento span que renderiza a mensagem de vazio fornecida.
sourceListItemUm elemento li para a seção sourceListItems que contém a seção sourceOption.
selectIconUm elemento span que renderiza o ícone selecionado quando o sourceListItem está definido como selecionado.
sourceOptionUm elemento div que renderiza o rótulo da opção.
sourceLoadMoreUm elemento li que contém a seção loadMoreInner.
loadMoreInnerUm elemento span que renderiza o ícone de carregamento.
loaderIconUm elemento span que exibe um ícone quando o carregamento está ocorrendo.
transferControlsUm elemento div que contém as seções transferButtonForwardAll, transferButtonForward, transferButtonBackward e transferButtonBackwardAll.
transferButtonForwardAllUm elemento button que transfere todas as opções para a lista de destino.
transferButtonForwardUm elemento button que transfere as opções selecionadas para a lista de destino.
transferButtonBackwardUm elemento button que transfere as opções selecionadas para a lista de origem.
transferButtonBackwardAllUm elemento button que transfere todas as opções para a lista de origem.
controlLabelUm elemento span que renderiza o rótulo de controle.
fastForwardIconUm elemento span que renderiza o ícone de avanço rápido.
moveRightIconUm elemento span que renderiza o ícone de mover para a direita.
moveLeftIconUm elemento span que renderiza o ícone de mover para a esquerda.
rewindIconUm elemento span que renderiza o ícone de rebobinar.
targetUm elemento div que contém as seções targetHeader, targetControls e targetListItems.
targetHeaderUm elemento div que contém as seções targetHeaderLabel e targetHeaderItemCount
targetHeaderLabelUm elemento label que renderiza a propriedade targetLabel.
targetHeaderItemCountUm elemento span que renderiza o número de itens e o número de itens selecionados na lista de destino.
targetListItemsUm elemento ul que contém os targetListItems.
targetEmptyMessageUm elemento li que contém a seção emptyMessageInner.
targetListItemUm elemento li para a seção targetListItems que contém a seção targetOption.
targetLoadMoreUm elemento li que contém a seção loadMoreInner.
Mostrar Universal section keys
outerO elemento de envolvimento mais externo.
wrapperUm invólucro ao redor do rótulo e do input.
labelO rótulo do input.
prefixPor padrão, não gera saída, mas permite conteúdo diretamente antes de um elemento input.
prefixIconUm elemento para gerar um ícone antes da seção de prefixo.
innerUm invólucro ao redor do próprio elemento input.
suffixPor padrão, não gera saída, mas permite conteúdo diretamente após um elemento input.
suffixIconUm elemento para gerar um ícone após a seção de sufixo.
inputO próprio elemento input.
helpO elemento que contém o texto de ajuda.
messagesUm invólucro ao redor de todas as mensagens.
messageO elemento (ou muitos elementos) que contém uma mensagem - na maioria das vezes mensagens de validação e erros.

Acessibilidade

Todos os campos de entrada do FormKit são projetados levando em consideração as seguintes considerações de acessibilidade. Ajude-nos a melhorar continuamente a acessibilidade para todos, relatando problemas de acessibilidade aqui:

Marcação semânticaAtributos AriaAcessível por tecladoIndicadores de focoContraste de cores com o tema fornecidoEtiquetas acessíveis, texto de ajuda e erros
Chave de SeçãoAtributoPadrãoDescrição
fieldsetrolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
aria-describedbyAssocia um elemento a uma descrição, auxiliando leitores de tela.
sourceHeaderrolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
sourceHeaderLabelforAssocia o rótulo a um elemento de entrada. Os usuários podem clicar no rótulo para focar a entrada ou alternar entre estados.
sourceHeaderItemCountrolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
aria-labelFornece um nome acessível.
sourceSearchInputrolesearchboxIndica às tecnologias assistivas que este elemento funciona como uma caixa de pesquisa.
aria-labelFornece um nome acessível.
sourceSearchCleararia-labelFornece um nome acessível.
sourceListItemstabindex-1 or 0Prioriza a ordem de foco do teclado definindo-a para -1 quando pesquisável ou não há opções de fonte e 0 quando de outra forma.
aria-activedescendantGerencia o foco para o elemento descendente ativo atual.
rolelistboxIndica às tecnologias assistivas que este elemento funciona como uma caixa de listagem.
aria-multiselectabletrueIndica que permite que vários itens sejam selecionados simultaneamente.
aria-roledescriptionFornece uma descrição do papel deste elemento.
sourceListItemaria-selectedIndica que este elemento está atualmente selecionado.
roleoptionIndica às tecnologias assistivas que este elemento funciona como uma opção.
sourceLoadMoretabindex-1Prioriza a ordem de foco do teclado definindo-a para -1.
aria-selectedfalseIndica que este elemento nunca é selecionado.
sourceEmptyMessagerolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
targetHeaderrolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
targetHeaderLabelforAssocia o rótulo a um elemento de entrada. Os usuários podem clicar no rótulo para focar a entrada ou alternar entre estados.
targetHeaderItemCountrolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
aria-labelFornece um nome acessível.
targetListItemstabindex-1 or 0Prioriza a ordem de foco do teclado definindo-a para -1 quando pesquisável ou não há opções de fonte e 0 quando de outra forma.
aria-activedescendantGerencia o foco para o elemento descendente ativo atual.
rolelistboxIndica às tecnologias assistivas que este elemento funciona como uma caixa de listagem.
aria-multiselectabletrueIndica que permite que vários itens sejam selecionados simultaneamente.
aria-roledescriptionFornece uma descrição do papel deste elemento.
targetListItemaria-selectedIndica que este elemento está atualmente selecionado.
roleoptionIndica às tecnologias assistivas que este elemento funciona como uma opção.
targetLoadMoretabindex-1Prioriza a ordem de foco do teclado definindo-a para -1.
aria-selectedfalseIndica que este elemento nunca é selecionado.
targetEmptyMessagerolepresentationIndica às tecnologias assistivas que este elemento funciona como apresentação.
transferButtonForwardaria-labelFornece um nome acessível.
transferButtonForwardAllaria-labelFornece um nome acessível.
transferButtonBackwardaria-labelFornece um nome acessível.
transferButtonBackwardAllaria-labelFornece um nome acessível.
Mostrar Universal chave de seção
labellabelforAssocia isso a um elemento de entrada, aprimorando acessibilidade e experiência do usuário
inputinputdisabledDesabilita um elemento HTML, impedindo a interação do usuário e sinalizando um estado não interativo
aria-describedbyAprimora a acessibilidade associando um elemento a uma descrição, auxiliando leitores de tela
aria-requiredAdiciona o estado necessário quando a validação é exigida.
iconiconforSempre que um ícone é definido como rótulo, ele o vincula a um elemento de entrada, aprimorando acessibilidade e experiência do usuário

Interações com o Teclado

Evento de TecladoDescrição
TabMove o foco para a próxima entrada focalizável na página.
Shift + TabMove o foco para a entrada focalizável anterior na página.