步进器组件通过引导用户完成多步骤的进程来显示类似向导的工作流程。
import Stepper from 'primevue/stepper';
import StepList from 'primevue/steplist';
import StepPanels from 'primevue/steppanels';
import StepItem from 'primevue/stepitem';
import Step from 'primevue/step';
import StepPanel from 'primevue/steppanel';
步进器由StepList、Step、StepPanels 和 StepPanel 组件组合而成。value 属性对于将 Step 和 StepPanel 相互关联至关重要。
<Stepper value="1">
<StepList>
<Step value="1">Header I</Step>
<Step value="2">Header II</Step>
<Step value="3">Header III</Step>
</StepList>
<StepPanels>
<StepPanel v-slot="{ activateCallback }" value="1">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content I</div>
</div>
<div class="flex pt-6 justify-end">
<Button label="Next" icon="pi pi-arrow-right" iconPos="right" @click="activateCallback('2')" />
</div>
</StepPanel>
<StepPanel v-slot="{ activateCallback }" value="2">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content II</div>
</div>
<div class="flex pt-6 justify-between">
<Button label="Back" severity="secondary" icon="pi pi-arrow-left" @click="activateCallback('1')" />
<Button label="Next" icon="pi pi-arrow-right" iconPos="right" @click="activateCallback('3')" />
</div>
</StepPanel>
<StepPanel v-slot="{ activateCallback }" value="3">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content III</div>
</div>
<div class="pt-6">
<Button label="Back" severity="secondary" icon="pi pi-arrow-left" @click="activateCallback('2')" />
</div>
</StepPanel>
</StepPanels>
</Stepper>
水平布局需要 StepItem 作为 Step 和 StepPanel 组件的包装器。
<Stepper value="1">
<StepItem value="1">
<Step>Header I</Step>
<StepPanel v-slot="{ activateCallback }">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content I</div>
</div>
<div class="py-6">
<Button label="Next" @click="activateCallback('2')" />
</div>
</StepPanel>
</StepItem>
<StepItem value="2">
<Step>Header II</Step>
<StepPanel v-slot="{ activateCallback }">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content II</div>
</div>
<div class="flex py-6 gap-2">
<Button label="Back" severity="secondary" @click="activateCallback('1')" />
<Button label="Next" @click="activateCallback('3')" />
</div>
</StepPanel>
</StepItem>
<StepItem value="3">
<Step>Header III</Step>
<StepPanel v-slot="{ activateCallback }">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content III</div>
</div>
<div class="py-6">
<Button label="Back" severity="secondary" @click="activateCallback('2')" />
</div>
</StepPanel>
</StepItem>
</Stepper>
当存在 linear 属性时,必须完成当前步骤才能移动到下一步。
<Stepper value="1" linear>
<StepList>
<Step value="1">Header I</Step>
<Step value="2">Header II</Step>
<Step value="3">Header III</Step>
</StepList>
<StepPanels>
<StepPanel v-slot="{ activateCallback }" value="1">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content I</div>
</div>
<div class="flex pt-6 justify-end">
<Button label="Next" icon="pi pi-arrow-right" @click="activateCallback('2')" />
</div>
</StepPanel>
<StepPanel v-slot="{ activateCallback }" value="2">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content II</div>
</div>
<div class="flex pt-6 justify-between">
<Button label="Back" severity="secondary" icon="pi pi-arrow-left" @click="activateCallback('1')" />
<Button label="Next" icon="pi pi-arrow-right" iconPos="right" @click="activateCallback('3')" />
</div>
</StepPanel>
<StepPanel v-slot="{ activateCallback }" value="3">
<div class="flex flex-col h-48">
<div class="border-2 border-dashed border-surface-200 dark:border-surface-700 rounded bg-surface-50 dark:bg-surface-950 flex-auto flex justify-center items-center font-medium">Content III</div>
</div>
<div class="pt-6">
<Button label="Back" severity="secondary" icon="pi pi-arrow-left" @click="activateCallback('2')" />
</div>
</StepPanel>
</StepPanels>
</Stepper>
仅使用带有 StepList 的步进器来满足需要进度指示器的自定义要求。
<Stepper value="1" class="basis-[50rem]">
<StepList>
<Step value="1">Design</Step>
<Step value="2">Development</Step>
<Step value="3">QA</Step>
</StepList>
</Stepper>
步骤的自定义内容使用默认槽定义。可选的 as 属性控制步骤的默认容器元素,例如将其设置为 button 会为标题呈现一个按钮,而不是 div。asChild 选项通过传递回调和属性来实现你自己的步骤,从而启用无头模式以进行进一步的自定义。
<Stepper v-model:value="activeStep" class="basis-[40rem]">
<StepList>
<Step v-slot="{ activateCallback, value, a11yAttrs }" asChild :value="1">
<div class="flex flex-row flex-auto gap-2" v-bind="a11yAttrs.root">
<button class="bg-transparent border-0 inline-flex flex-col gap-2" @click="activateCallback" v-bind="a11yAttrs.header">
<span
:class="[
'rounded-full border-2 w-12 h-12 inline-flex items-center justify-center',
{ 'bg-primary text-primary-contrast border-primary': value <= activeStep, 'border-surface-200 dark:border-surface-700': value > activeStep }
]"
>
<i class="pi pi-user" />
</span>
</button>
<Divider />
</div>
</Step>
<Step v-slot="{ activateCallback, value, a11yAttrs }" asChild :value="2">
<div class="flex flex-row flex-auto gap-2 pl-2" v-bind="a11yAttrs.root">
<button class="bg-transparent border-0 inline-flex flex-col gap-2" @click="activateCallback" v-bind="a11yAttrs.header">
<span
:class="[
'rounded-full border-2 w-12 h-12 inline-flex items-center justify-center',
{ 'bg-primary text-primary-contrast border-primary': value <= activeStep, 'border-surface-200 dark:border-surface-700': value > activeStep }
]"
>
<i class="pi pi-star" />
</span>
</button>
<Divider />
</div>
</Step>
<Step v-slot="{ activateCallback, value, a11yAttrs }" asChild :value="3">
<div class="flex flex-row pl-2" v-bind="a11yAttrs.root">
<button class="bg-transparent border-0 inline-flex flex-col gap-2" @click="activateCallback" v-bind="a11yAttrs.header">
<span
:class="[
'rounded-full border-2 w-12 h-12 inline-flex items-center justify-center',
{ 'bg-primary text-primary-contrast border-primary': value <= activeStep, 'border-surface-200 dark:border-surface-700': value > activeStep }
]"
>
<i class="pi pi-id-card" />
</span>
</button>
</div>
</Step>
</StepList>
<StepPanels>
<StepPanel v-slot="{ activateCallback }" :value="1">
<div class="flex flex-col gap-2 mx-auto" style="min-height: 16rem; max-width: 20rem">
<div class="text-center mt-4 mb-4 text-xl font-semibold">Create your account</div>
<div class="field">
<InputText id="input" v-model="name" type="text" placeholder="Name" fluid />
</div>
<div class="field">
<InputText id="email" v-model="email" type="email" placeholder="Email" fluid />
</div>
<div class="field">
<Password v-model="password" placeholder="Password" fluid />
</div>
</div>
<div class="flex pt-6 justify-end">
<Button label="Next" icon="pi pi-arrow-right" iconPos="right" @click="activateCallback(2)" />
</div>
</StepPanel>
<StepPanel v-slot="{ activateCallback }" :value="2">
<div class="flex flex-col gap-2 mx-auto" style="min-height: 16rem; max-width: 24rem">
<div class="text-center mt-4 mb-4 text-xl font-semibold">Choose your interests</div>
<div class="flex flex-wrap justify-center gap-4">
<ToggleButton v-model="option1" onLabel="Nature" offLabel="Nature" />
<ToggleButton v-model="option2" onLabel="Art" offLabel="Art" />
<ToggleButton v-model="option3" onLabel="Music" offLabel="Music" />
<ToggleButton v-model="option4" onLabel="Design" offLabel="Design" />
<ToggleButton v-model="option5" onLabel="Photography" offLabel="Photography" />
<ToggleButton v-model="option6" onLabel="Movies" offLabel="Movies" />
<ToggleButton v-model="option7" onLabel="Sports" offLabel="Sports" />
<ToggleButton v-model="option8" onLabel="Gaming" offLabel="Gaming" />
<ToggleButton v-model="option9" onLabel="Traveling" offLabel="Traveling" />
<ToggleButton v-model="option10" onLabel="Dancing" offLabel="Dancing" />
</div>
</div>
<div class="flex pt-6 justify-between">
<Button label="Back" severity="secondary" icon="pi pi-arrow-left" @click="activateCallback(1)" />
<Button label="Next" icon="pi pi-arrow-right" iconPos="right" @click="activateCallback(3)" />
</div>
</StepPanel>
<StepPanel v-slot="{ activateCallback }" :value="3">
<div class="flex flex-col gap-2 mx-auto" style="min-height: 16rem; max-width: 24rem">
<div class="text-center mt-4 mb-4 text-xl font-semibold">Account created successfully</div>
<div class="text-center">
<img alt="logo" src="https://primefaces.org/cdn/primevue/images/stepper/content.svg" />
</div>
</div>
<div class="flex pt-6 justify-start">
<Button label="Back" severity="secondary" icon="pi pi-arrow-left" @click="activateCallback(2)" />
</div>
</StepPanel>
</StepPanels>
</Stepper>
步进器容器使用 tablist 角色定义,由于任何属性都传递到容器元素,因此可以选择使用 aria-labelledby 来指定一个元素来描述步进器。每个步进器标题都有一个 tab 角色和 aria-controls 来引用相应的步进器内容元素。每个步进器的内容元素都有 tabpanel 角色,一个与标题的 aria-controls 匹配的 id 和一个引用标题作为可访问名称的 aria-labelledby。
按键 | 功能 |
---|---|
tab | 在标题之间移动焦点。 |
enter | 激活聚焦的步进器标题。 |
空格 | 激活聚焦的步进器标题。 |