列表框用于从项目列表中选择一个或多个值。
import Listbox from 'primevue/listbox';
列表框与v-model属性一起使用,用于双向值绑定以及options集合。选项的标签和值分别使用optionLabel和optionValue属性定义。请注意,当选项是简单的原始值(例如字符串数组)时,则无需optionLabel和optionValue。
<Listbox v-model="selectedCity" :options="cities" optionLabel="name" class="w-full md:w-56" />
列表框与 PrimeVue 表单库无缝集成。
<Form v-slot="$form" :resolver="resolver" :initialValues="initialValues" @submit="onFormSubmit" class="flex flex-col gap-4 w-full sm:w-56">
<div class="flex flex-col gap-1">
<Listbox name="city" :options="cities" optionLabel="name" fluid />
<Message v-if="$form.city?.invalid" severity="error" size="small" variant="simple">{{ $form.city.error?.message }}</Message>
</div>
<Button type="submit" severity="secondary" label="Submit" />
</Form>
突出显示所选选项的另一种方法是显示复选标记。
<Listbox v-model="selectedCity" :options="cities" optionLabel="name" checkmark :highlightOnSelect="false" class="w-full md:w-56" />
列表框默认允许选择单个项目,启用multiple属性可以选择多个项目。当存在可选的metaKeySelection时,其行为会发生变化,即选择新项目需要存在 meta 键。
<Listbox v-model="selectedCity" :options="cities" multiple optionLabel="name" class="w-full md:w-56" />
当提供嵌套数据结构时,可以对选项进行分组。要定义组的标签,需要optionGroupLabel属性,并且还需要optionGroupChildren来定义引用组子项的属性。
<Listbox v-model="selectedCity" :options="groupedCities" optionLabel="label" optionGroupLabel="label" optionGroupChildren="items" class="w-full md:w-56" listStyle="max-height:250px">
<template #optiongroup="slotProps">
<div class="flex items-center">
<img :alt="slotProps.option.name" src="https://primefaces.org/cdn/primevue/images/flag/flag_placeholder.png" :class="`flag flag-${slotProps.option.code.toLowerCase()} mr-2`" style="width: 18px" />
<div>{{ slotProps.option.label }}</div>
</div>
</template>
</Listbox>
列表框提供内置筛选功能,可以通过添加filter属性来启用。
<Listbox v-model="selectedCity" :options="cities" filter optionLabel="name" class="w-full md:w-56" />
使用option插槽显示选项的自定义内容,该插槽将选项作为参数。其他可用的模板部分包括filter和optionGroup。
<Listbox v-model="selectedCountry" :options="countries" optionLabel="name" class="w-full md:w-56" listStyle="max-height:250px">
<template #option="slotProps">
<div class="flex items-center">
<img :alt="slotProps.option.name" src="https://primefaces.org/cdn/primevue/images/flag/flag_placeholder.png" :class="`flag flag-${slotProps.option.code.toLowerCase()} mr-2`" style="width: 18px" />
<div>{{ slotProps.option.name }}</div>
</div>
</template>
</Listbox>
VirtualScroller 用于高效渲染长列表选项,例如本演示中的 10 万条记录。配置通过virtualScrollerOptions属性完成,有关可用选项的更多信息,请参阅 VirtualScroller,因为它在内部由列表框使用。
<Listbox v-model="selectedItem" :options="items" optionLabel="label" optionValue="value"
:virtualScrollerOptions="{ itemSize: 38 }" class="w-full md:w-56" listStyle="height:250px" striped />
无效状态使用invalid prop 显示,以指示验证失败。在与表单验证库集成时,可以使用此样式。
<Listbox v-model="selectedCity" :options="cities" optionLabel="name" :invalid="selectedCity === null" class="w-full md:w-56" />
当存在disabled时,该元素无法编辑和聚焦。
<Listbox v-model="selectedCity" disabled :options="cities" optionLabel="name" class="w-full md:w-56" />
可以使用 aria-labelledby 或 aria-label prop 提供描述组件的值。列表元素具有 listbox 角色,并具有 aria-multiselectable 属性,当启用多选时,该属性设置为 true。每个列表项都具有 option 角色,并具有 aria-selected 和 aria-disabled 作为其属性。
如果启用了筛选,则可以定义 filterInputProps 以将 aria-* prop 赋予输入元素。或者,屏幕阅读器通常也会使用 filterPlaceholder。
<span id="lb"></span>Options</span>
<Listbox aria-labelledby="lb" />
<Listbox aria-label="City" />
按键 | 功能 |
---|---|
tab | 将焦点移动到第一个选定的选项,如果没有,则第一个选项会接收焦点。 |
上箭头 | 将焦点移动到上一个选项。 |
下箭头 | 将焦点移动到下一个选项。 |
回车 | 切换聚焦选项的选中状态。 |
空格 | 切换聚焦选项的选中状态。 |
home | 将焦点移动到第一个选项。 |
end | 将焦点移动到最后一个选项。 |
shift + 下箭头 | 将焦点移动到下一个选项并切换选择状态。 |
shift + 上箭头 | 将焦点移动到上一个选项并切换选择状态。 |
shift + 空格 | 选择最近选择的选项和聚焦选项之间的项目。 |
control + shift + home | 选择聚焦的选项以及直到第一个选项的所有选项。 |
control + shift + end | 选择聚焦的选项以及直到最后一个选项的所有选项。 |
control + a | 选择所有选项。 |
pageUp | 将视觉焦点跳转到第一个选项。 |
pageDown | 将视觉焦点跳转到最后一个选项。 |
任何可打印字符 | 将焦点移动到标签以键入的字符开头的选项。 |
按键 | 功能 |
---|---|
下箭头 | 将焦点移动到下一个选项,如果没有,则视觉焦点不会改变。 |
上箭头 | 将焦点移动到上一个选项,如果没有,则视觉焦点不会改变。 |
左箭头 | 从当前选项中移除视觉焦点,并将输入光标向左移动一个字符。 |
右箭头 | 从当前选项中移除视觉焦点,并将输入光标向右移动一个字符。 |
home | 将输入光标移动到末尾,如果没有,则将焦点移动到第一个选项。 |
end | 将输入光标移动到开头,如果没有,则将焦点移动到最后一个选项。 |
回车 | 关闭弹出窗口并将焦点移动到多选元素。 |
escape | 关闭弹出窗口并将焦点移动到多选元素。 |
tab | 将焦点移动到组件中下一个可聚焦的元素。如果没有,则将焦点移动到页面中的下一个元素。 |