CascadeSelect

CascadeSelect 是一个表单组件,用于从嵌套的选项结构中选择值。


import CascadeSelect from 'primevue/cascadeselect';

CascadeSelect 与 v-model 属性一起使用,通过 options 集合实现双向值绑定。要定义组的标签,需要 optionGroupLabel 属性,同时需要 optionGroupChildren 来定义引用组子项的属性。请注意 optionGroupChildren 的顺序很重要,因为它应该对应数据层次结构。

选择城市
3 results are available

<CascadeSelect v-model="selectedCity" :options="countries" optionLabel="cname" optionGroupLabel="name"
    :optionGroupChildren="['states', 'cities']" class="w-56" placeholder="选择城市" />

CascadeSelect 与 PrimeVue Forms 库无缝集成。

选择城市
3 results are available

<Form v-slot="$form" :resolver="resolver" :initialValues="initialValues" @submit="onFormSubmit" class="flex justify-center flex-col gap-4">
    <div class="flex flex-col gap-1">
        <CascadeSelect name="city" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" class="w-56" placeholder="选择城市" />
        <Message v-if="$form.city?.invalid" severity="error" size="small" variant="simple">{{ $form.city.error?.message }}</Message>
    </div>
    <Button type="submit" severity="secondary" label="提交" />
</Form>

CascadeSelect 通过模板提供多个插槽用于自定义。

选择城市
3 results are available

<CascadeSelect v-model="selectedCity" :options="countries" optionLabel="cname" optionGroupLabel="name"
    :optionGroupChildren="['states', 'cities']" class="w-56" placeholder="选择城市">
    <template #option="slotProps">
        <div class="flex items-center">
            <img v-if="slotProps.option.states" :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"  />
            <i v-if="slotProps.option.cities" class="pi pi-compass mr-2"></i>
            <i v-if="slotProps.option.cname" class="pi pi-map-marker mr-2"></i>
            <span>{{ slotProps.option.cname || slotProps.option.name }}</span>
        </div>
    </template>
    <template #dropdownicon>
        <i class="pi pi-map" />
    </template>
    <template #header>
        <div class="font-medium px-3 py-2">可用国家</div>
    </template>
    <template #footer>
        <div class="px-3 py-1">
            <Button label="添加新项" fluid severity="secondary" text size="small" icon="pi pi-plus" />
        </div>
    </template>
</CascadeSelect>

Loading state can be used loading property.

Loading...
No results found

<CascadeSelect loading placeholder="Loading..." class="w-56" />

When showClear is enabled, a clear icon is added to reset the CascadeSelect.

Select a City
3 results are available

<CascadeSelect v-model="selectedCity" :options="countries" optionLabel="cname" optionGroupLabel="name"
    :optionGroupChildren="['states', 'cities']" class="w-56" placeholder="Select a City" />

variant 属性指定为 filled 以显示比默认 outlined 样式具有更高视觉强调的组件。

选择城市
3 results are available

<CascadeSelect v-model="selectedCity" variant="filled" :options="countries" optionLabel="cname" optionGroupLabel="name"
    :optionGroupChildren="['states', 'cities']" class="w-56" placeholder="选择城市" />

当获得焦点时,浮动标签会出现在输入字段的顶部。访问 FloatLabel 文档了解更多信息。

p-emptylabel
3 results are available
p-emptylabel
3 results are available
p-emptylabel
3 results are available

<FloatLabel class="w-full md:w-56">
    <CascadeSelect v-model="value1" inputId="over_label" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" class="w-full" />
    <label for="over_label">上方标签</label>
</FloatLabel>

<FloatLabel class="w-full md:w-56">
    <CascadeSelect v-model="value2" inputId="in_label" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" class="w-full" variant="filled" />
    <label for="in_label">内部标签</label>
</FloatLabel>

<FloatLabel class="w-full md:w-56">
    <CascadeSelect v-model="value3" inputId="on_label" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" class="w-full" />
    <label for="on_label">表面标签</label>
</FloatLabel>

IftaLabel 用于创建字段内顶部对齐的标签。访问 IftaLabel 文档了解更多信息。

p-emptylabel
3 results are available

<IftaLabel class="w-full md:w-56">
    <CascadeSelect v-model="selectedCity" inputId="cs_city" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" class="w-full" variant="filled" />
    <label for="cs_city">城市</label>
</IftaLabel>

CascadeSelect 提供 smalllarge 尺寸作为基础尺寸的替代选项。

小尺寸
3 results are available
正常尺寸
3 results are available
大尺寸
3 results are available

<CascadeSelect v-model="value1" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" 
    class="w-56" size="small" placeholder="小尺寸" />
<CascadeSelect v-model="value2" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" 
    class="w-56" placeholder="正常尺寸" />
<CascadeSelect v-model="value3" :options="countries" optionLabel="cname" optionGroupLabel="name" :optionGroupChildren="['states', 'cities']" 
    class="w-56" size="large" placeholder="大尺寸" />

使用 invalid 属性显示无效状态以指示验证失败。在与表单验证库集成时可以使用此样式。

选择城市
3 results are available
选择城市
3 results are available

<div class="card flex flex-wrap justify-center gap-4">
    <CascadeSelect v-model="selectedCity1" :invalid="!selectedCity1" :options="countries" optionLabel="cname" optionGroupLabel="name" 
        :optionGroupChildren="['states', 'cities']" class="w-full sm:w-56" placeholder="选择城市" />
    <CascadeSelect v-model="selectedCity2" :invalid="!selectedCity2" :options="countries" optionLabel="cname" optionGroupLabel="name" 
        :optionGroupChildren="['states', 'cities']" class="w-full sm:w-56" placeholder="选择城市" variant="filled" />
</div>

当存在 disabled 属性时,元素无法编辑和获得焦点。

已禁用
No results found

<CascadeSelect disabled placeholder="已禁用" class="w-56" />

屏幕阅读器

描述组件的值可以通过 aria-labelledbyaria-label 属性提供。cascadeselect 元素除了具有 aria-haspopuparia-expanded 属性外,还具有 combobox 角色。 组合框和弹出窗口之间的关系通过引用弹出窗口 id 的 aria-controls 创建。

弹出列表具有引用 combobox 元素的 aria-controls 属性的 id,并使用 tree 作为角色。每个列表项都具有 treeitem 角色以及 aria-labelaria-selectedaria-expanded 属性。树节点的容器元素具有 group 角色。aria-setsizearia-posinsetaria-level 属性会被隐式计算并添加到每个树项中。


<span id="dd1"></span>Options</span>
<CascadeSelect aria-labelledby="dd1" />

<CascadeSelect aria-label="Options" />

关闭状态键盘支持

按键功能
tab将焦点移动到 cascadeselect 元素。
space打开弹出窗口并将视觉焦点移动到选定的选项,如果没有选定项则第一个选项获得焦点。
enterOpens the popup and moves visual focus to the selected option, if there is none then first option receives the focus.
down arrowOpens the popup and moves visual focus to the selected option, if there is none then first option receives the focus.
up arrow打开弹出窗口并将视觉焦点移动到选定的选项,如果没有选定项则最后一个选项获得焦点。
any printable character打开弹出窗口并将焦点移动到标签以输入字符开头的选项,如果没有则第一个选项获得焦点。

弹出窗口键盘支持

按键功能
tab隐藏弹出窗口并将焦点移动到下一个可制表元素。如果没有,则选择可聚焦选项并关闭覆盖层,然后将焦点移动到页面中的下一个元素。
shift + tab隐藏弹出窗口并将焦点移动到上一个可制表元素。
enter选择聚焦的选项并关闭弹出窗口。
spaceSelects the focused option and closes the popup.
escape关闭弹出窗口,将焦点移动到 cascadeselect 元素。
down arrow将焦点移动到下一个选项。
up arrow将焦点移动到上一个选项。
alt + up arrow选择聚焦的选项并关闭弹出窗口,然后将焦点移动到 cascadeselect 元素。
right arrow如果选项已关闭,则打开选项,否则将焦点移动到第一个子选项。
left arrow如果选项已打开,则关闭选项,否则将焦点移动到父选项。
home将输入光标移动到末尾,如果没有则将焦点移动到第一个选项。
end将输入光标移动到开头,如果没有则将焦点移动到最后一个选项。
any printable character将焦点移动到标签以输入字符开头的选项。
Build Faster Design Better
490+ ready to use UI blocks crafted with PrimeVue and Tailwind CSS.
Learn More
Theme Designer