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:
Nesta seção, vamos cobrir o básico de como replicar o exemplo 'Convidados vs VIPs' acima.
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:
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:
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
:
A propriedade options
pode aceitar três formatos diferentes de valores:
value
e label
'A', 'B', 'C'
{ a: 'A', b: 'B', c: 'C' }
Vamos seguir em frente e popular as opções da lista de transferência com uma lista de nomes de convidados:
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):
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:
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:
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:
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
:
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:
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:
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:
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:
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:
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:
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.
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:
Assim como qualquer outro input do FormKit, o input de lista de transferência permite que você utilize slots para personalizar sua marcação.
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
:
O input de lista de transferência pode ser usado para criar uma lista classificada, vamos fazer isso com os maiores jogadores da NBA:
Prop | Type | Padrão | Descrição |
---|---|---|---|
debounce | number | 200 | Número de milissegundos para debater chamadas a uma função de opções. |
options | any | [] | A lista de opções que o usuário pode selecionar. |
filter | function | null | Usado para aplicar sua própria função de filtro personalizada para opções estáticas. |
option-loader | function | null | Usado para hidratar o valor inicial, ou realizar uma solicitação adicional para carregar mais informações de uma opção selecionada. |
source-empty-message | string | undefined | Exibe uma mensagem quando não há opções para mostrar. |
target-empty-message | string | undefined | Exibe uma mensagem quando não há valores para mostrar. |
max | number | undefined | Limita o número de opções que podem ser selecionadas. |
clear-on-select | boolean | true | Limpa o campo de busca após selecionar uma opção (apenas para opções que não são carregadas via função). |
searchable | boolean | false | Habilita o campo de busca. |
source-label | string | undefined | Exibe um rótulo para a lista de origem. |
target-label | string | undefined | Exibe um rótulo para a lista de destino. |
transfer-on-select | boolean | true | Transfere 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 | |||
config | Object | {} | Opções de configuração a serem fornecidas para o nó do input e qualquer nó descendente deste input. |
delay | Number | 20 | Número de milissegundos para debounce do valor do input antes de despachar o commit hook. |
dirtyBehavior | string | touched | Determina 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. |
errors | Array | [] | Array de strings para exibir como mensagens de erro neste campo. |
help | String | '' | Texto para o texto de ajuda associado ao input. |
id | String | input_{n} | O ID único do input. Fornecer um ID também permite acesso global ao nó do input. |
ignore | Boolean | false | Impede 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. |
index | Number | undefined | Permite 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. |
label | String | '' | Texto para o elemento label associado ao input. |
name | String | input_{n} | O nome do input como identificado no objeto de dados. Isso deve ser único dentro de um grupo de campos. |
parent | FormKitNode | contextual | Por 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-icon | String | '' | Especifica um ícone para colocar na seção prefixIcon . |
preserve | boolean | false | Preserva o valor do input em um grupo pai, lista ou formulário quando o input é desmontado. |
preserve-errors | boolean | false | Por 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-schema | Object | {} | Um objeto de chaves de seção e valores parciais de esquema, em que cada esquema parcial é aplicado à seção respectiva. |
suffix-icon | String | '' | Especifica um ícone para colocar na seção suffixIcon . |
type | String | text | O tipo de input a ser renderizado pela biblioteca. |
validation | String, Array | [] | As regras de validação a serem aplicadas ao input. |
validation-visibility | String | blur | Determina quando mostrar as regras de validação com falha de um input. Os valores válidos são blur , dirty e live . |
validation-label | String | {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-rules | Object | {} | Regras de validação personalizadas adicionais para disponibilizar na propriedade de validação. |
value | Any | undefined | Inicializa o valor do input e/ou de seus filhos. Não é reativo. Pode inicializar grupos inteiros (formulários) e listas.. |
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.
Section-key | Descrição |
---|---|
fieldset | Um elemento fieldset que atua como o elemento raiz para a entrada da lista de transferência. |
legend | Um elemento legend que renderiza o rótulo. |
source | Um elemento div que contém as seções sourceHeader, sourceControls e sourceListItems. |
sourceHeader | Um elemento div que contém as seções sourceHeaderLabel e sourceHeaderItemCount |
sourceHeaderLabel | Um elemento label que renderiza a propriedade sourceLabel. |
sourceHeaderItemCount | Um elemento span que renderiza o número de itens e o número de itens selecionados na lista de origem. |
sourceControls | Um elemento div que contém as seções sourceSearchINput e sourceSearchClear |
sourceSearch | Um elemento div que contém as seções sourceSearchInput e sourceSearchClear |
sourceSearchInput | Um elemento de entrada de texto usado para pesquisa. |
sourceSearchClear | Um elemento button que limpa a entrada de pesquisa. |
closeIcon | O span usado contendo o ícone para limpar a entrada de pesquisa. |
sourceListItems | Um elemento ul que contém os sourceListItems. |
sourceEmptyMessage | Um elemento li que contém a seção emptyMessageInner. |
emptyMessageInner | Um elemento span que renderiza a mensagem de vazio fornecida. |
sourceListItem | Um elemento li para a seção sourceListItems que contém a seção sourceOption. |
selectIcon | Um elemento span que renderiza o ícone selecionado quando o sourceListItem está definido como selecionado. |
sourceOption | Um elemento div que renderiza o rótulo da opção. |
sourceLoadMore | Um elemento li que contém a seção loadMoreInner. |
loadMoreInner | Um elemento span que renderiza o ícone de carregamento. |
loaderIcon | Um elemento span que exibe um ícone quando o carregamento está ocorrendo. |
transferControls | Um elemento div que contém as seções transferButtonForwardAll, transferButtonForward, transferButtonBackward e transferButtonBackwardAll. |
transferButtonForwardAll | Um elemento button que transfere todas as opções para a lista de destino. |
transferButtonForward | Um elemento button que transfere as opções selecionadas para a lista de destino. |
transferButtonBackward | Um elemento button que transfere as opções selecionadas para a lista de origem. |
transferButtonBackwardAll | Um elemento button que transfere todas as opções para a lista de origem. |
controlLabel | Um elemento span que renderiza o rótulo de controle. |
fastForwardIcon | Um elemento span que renderiza o ícone de avanço rápido. |
moveRightIcon | Um elemento span que renderiza o ícone de mover para a direita. |
moveLeftIcon | Um elemento span que renderiza o ícone de mover para a esquerda. |
rewindIcon | Um elemento span que renderiza o ícone de rebobinar. |
target | Um elemento div que contém as seções targetHeader, targetControls e targetListItems. |
targetHeader | Um elemento div que contém as seções targetHeaderLabel e targetHeaderItemCount |
targetHeaderLabel | Um elemento label que renderiza a propriedade targetLabel. |
targetHeaderItemCount | Um elemento span que renderiza o número de itens e o número de itens selecionados na lista de destino. |
targetListItems | Um elemento ul que contém os targetListItems. |
targetEmptyMessage | Um elemento li que contém a seção emptyMessageInner. |
targetListItem | Um elemento li para a seção targetListItems que contém a seção targetOption. |
targetLoadMore | Um elemento li que contém a seção loadMoreInner. |
Mostrar Universal section keys | |
outer | O elemento de envolvimento mais externo. |
wrapper | Um invólucro ao redor do rótulo e do input. |
label | O rótulo do input. |
prefix | Por padrão, não gera saída, mas permite conteúdo diretamente antes de um elemento input. |
prefixIcon | Um elemento para gerar um ícone antes da seção de prefixo. |
inner | Um invólucro ao redor do próprio elemento input. |
suffix | Por padrão, não gera saída, mas permite conteúdo diretamente após um elemento input. |
suffixIcon | Um elemento para gerar um ícone após a seção de sufixo. |
input | O próprio elemento input. |
help | O elemento que contém o texto de ajuda. |
messages | Um invólucro ao redor de todas as mensagens. |
message | O elemento (ou muitos elementos) que contém uma mensagem - na maioria das vezes mensagens de validação e erros. |
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:
Chave de Seção | Atributo | Padrão | Descrição |
---|---|---|---|
fieldset | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
aria-describedby | Associa um elemento a uma descrição, auxiliando leitores de tela. | ||
sourceHeader | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
sourceHeaderLabel | for | Associa o rótulo a um elemento de entrada. Os usuários podem clicar no rótulo para focar a entrada ou alternar entre estados. | |
sourceHeaderItemCount | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
aria-label | Fornece um nome acessível. | ||
sourceSearchInput | role | searchbox | Indica às tecnologias assistivas que este elemento funciona como uma caixa de pesquisa. |
aria-label | Fornece um nome acessível. | ||
sourceSearchClear | aria-label | Fornece um nome acessível. | |
sourceListItems | tabindex | -1 or 0 | Prioriza 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-activedescendant | Gerencia o foco para o elemento descendente ativo atual. | ||
role | listbox | Indica às tecnologias assistivas que este elemento funciona como uma caixa de listagem. | |
aria-multiselectable | true | Indica que permite que vários itens sejam selecionados simultaneamente. | |
aria-roledescription | Fornece uma descrição do papel deste elemento. | ||
sourceListItem | aria-selected | Indica que este elemento está atualmente selecionado. | |
role | option | Indica às tecnologias assistivas que este elemento funciona como uma opção. | |
sourceLoadMore | tabindex | -1 | Prioriza a ordem de foco do teclado definindo-a para -1. |
aria-selected | false | Indica que este elemento nunca é selecionado. | |
sourceEmptyMessage | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
targetHeader | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
targetHeaderLabel | for | Associa o rótulo a um elemento de entrada. Os usuários podem clicar no rótulo para focar a entrada ou alternar entre estados. | |
targetHeaderItemCount | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
aria-label | Fornece um nome acessível. | ||
targetListItems | tabindex | -1 or 0 | Prioriza 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-activedescendant | Gerencia o foco para o elemento descendente ativo atual. | ||
role | listbox | Indica às tecnologias assistivas que este elemento funciona como uma caixa de listagem. | |
aria-multiselectable | true | Indica que permite que vários itens sejam selecionados simultaneamente. | |
aria-roledescription | Fornece uma descrição do papel deste elemento. | ||
targetListItem | aria-selected | Indica que este elemento está atualmente selecionado. | |
role | option | Indica às tecnologias assistivas que este elemento funciona como uma opção. | |
targetLoadMore | tabindex | -1 | Prioriza a ordem de foco do teclado definindo-a para -1. |
aria-selected | false | Indica que este elemento nunca é selecionado. | |
targetEmptyMessage | role | presentation | Indica às tecnologias assistivas que este elemento funciona como apresentação. |
transferButtonForward | aria-label | Fornece um nome acessível. | |
transferButtonForwardAll | aria-label | Fornece um nome acessível. | |
transferButtonBackward | aria-label | Fornece um nome acessível. | |
transferButtonBackwardAll | aria-label | Fornece um nome acessível. | |
Mostrar Universal chave de seção | |||
label | label | for | Associa isso a um elemento de entrada, aprimorando acessibilidade e experiência do usuário |
input | input | disabled | Desabilita um elemento HTML, impedindo a interação do usuário e sinalizando um estado não interativo |
aria-describedby | Aprimora a acessibilidade associando um elemento a uma descrição, auxiliando leitores de tela | ||
aria-required | Adiciona o estado necessário quando a validação é exigida. | ||
icon | icon | for | Sempre que um ícone é definido como rótulo, ele o vincula a um elemento de entrada, aprimorando acessibilidade e experiência do usuário |
Evento de Teclado | Descrição |
---|---|
Tab | Move o foco para a próxima entrada focalizável na página. |
Shift + Tab | Move o foco para a entrada focalizável anterior na página. |