dropdown 输入允许用户从选项列表中选择一个值。与原生的 select 元素不同,下拉输入允许您自定义其外观和行为。
options 属性可以接受三种不同格式的值:
value 和 label 键的对象数组(见上面的示例)['A', 'B', 'C']{ a: 'A', b: 'B', c: 'C' }如果你将选项指定为一个空数组,输入将以禁用状态呈现。
下拉输入默认情况下将以单选模式呈现。
设置了 multiple 属性的下拉输入将以多选模式呈现。
请注意,在上面的示例中,因为设置了 multiple 属性,value 属性必须是一个数组。
选项可以动态地分配给 options 属性,而不是传递一个静态列表。
在这个示例中,函数 loadHorrorMovies 向 TMDB API 发出请求,以加载恐怖电影列表。将函数分配给 options 属性将在最终用户打开列表框时加载选项。
默认情况下,下拉框只会在列表框展开时异步加载选项一次。设置属性 always-load-on-open 将导致下拉框每次列表框展开时都加载选项。
属性 load-on-created 将导致下拉框在创建时立即加载选项。
分配给 options 属性的函数将传递两个参数:page 和 hasNextPage。page 参数表示当前页码,hasNextPage 是一个回调函数,用于指示是否还有更多页面要加载。
如果您希望用户能够在不必点击选项列表底部的加载更多选项的情况下加载更多选项,您可以将 load-on-scroll 属性设置为 true,我们的函数 loadCurrentlyPopularMovies 将会再次被调用:
FormKit 的下拉输入还提供了一个 optionLoader 属性,允许您重新填充不在选项列表中的值。在这个例子中,下拉菜单被提供了一个初始值(两个电影 ID)。对于不在选项列表中的每个值,都会调用 optionLoader 函数。
请注意,在上面的例子中,optionLoader 函数传递了两个参数:所选选项的 value(在这种情况下是电影 ID)和 cachedOption。cachedOption 属性用于防止不必要的查找。如果 cachedOption 不是 null,这意味着所选选项已经被加载过了,您可以直接返回 cachedOption。
与原生 select 元素不同,下拉输入可以通过标记进行自定义。
下拉输入允许您使用选项插槽自定义每个选项的外观和感觉。在这个例子中,我们使用选项插槽来显示每个选项的资产;标志和名称:
下拉输入允许您自定义所选选项的外观和感觉。
当使用下拉输入作为 multi-select 时,您可以通过设置 selection-appearance 属性为 truncate(默认值)或 tags 来自定义所选选项的外观和感觉。
如果您只想自定义所选选项的显示,请使用选择槽位(与上面提到的选项槽位相对):
多选下拉菜单的选择外观为 truncate 时,不存在选择槽位。
以下属性允许您自定义下拉输入的行为。
默认情况下,如果没有传递选项,下拉输入将以禁用状态呈现。您可以选择性地传递 empty-message 属性,当没有可用选项时显示一条消息:
如果您希望允许用户移除所选值,请将 selection-removable 属性设置为 true。这将在所选值旁边渲染一个关闭图标:
selection-removable 属性不能用于多选。
默认情况下,当 selection-removable 属性设置为 true 时,移除所选值后下拉菜单不会打开。您可以通过将 open-on-remove 属性设置为 true 来改变这种行为:
默认情况下,当设置了 multiple 属性时,选择一个选项后下拉菜单不会关闭。您可以通过将 close-on-select 属性设置为 true 来改变这种行为:
如果您希望在下拉输入聚焦时立即展开列表框,您可以使用 open-on-focus 属性:
在使用具有静态选项的下拉菜单时,FormKit 的下拉菜单还具有一个称为 overscroll 的功能。将 behavior 属性设置为 overscroll 将直接在输入框上方渲染列表框,以最大化列表的可用大小:
如果您想限制可以选择的选项数量,您可以使用 max 属性:
| Prop | Type | 默认 | 描述 |
|---|---|---|---|
| options | any | [] | 用户可以从中选择的选项列表。 |
| load-on-scroll | boolean | false | 当设置为 `true` 时,下拉菜单将根据用户的滚动位置尝试加载更多选项。 |
| option-loader | function | null | 用于初始化值的填充,或执行额外的请求以加载所选选项的更多信息。 |
| empty-message | string | undefined | 当没有选项可显示时,渲染一条消息。 |
| selection-appearance | string | truncate | 对于多选下拉菜单,此属性允许您自定义所选选项的外观和感觉。可能的值有 `truncate`(默认值)或 `tags`。 |
| selection-removable | boolean | false | 对于单选下拉菜单,此属性允许您移除所选值。 |
| open-on-remove | boolean | false | 当 `selection-removable` 属性设置为 `true` 时,移除所选值后下拉菜单不会打开。您可以通过将 `open-on-remove` 属性设置为 `true` 来改变这种行为。 |
| close-on-select | boolean | false | 当设置了 `multiple` 属性时,选择一个选项后下拉菜单不会关闭。您可以通过将 `close-on-select` 属性设置为 `true` 来改变这种行为。 |
| open-on-focus | boolean | false | 如果您希望在下拉输入框聚焦时立即展开列表框,您可以使用 `open-on-focus` 属性。 |
| options-appearance | string | undefined | 对于多选下拉菜单,此属性允许您自定义所选选项的外观和感觉。可能的值有 `default`(默认值)或 `checkbox`。 |
| multiple | boolean | false | 当设置为 `true` 时,下拉菜单将允许用户选择多个选项。 |
| behavior | string | undefined | 直接在输入框上方渲染列表框,以最大化列表的可用大小。 |
| always-load-on-open | boolean | false | 确定下拉菜单在打开时是否应始终加载其选项,或者是否应参考之前打开时找到的选项。 |
| load-on-created | boolean | false | 当设置为 `true` 时,下拉菜单将在节点创建时加载选项。 |
| max | number | string | undefined | 如果您想限制可以选择的选项数量,您可以使用 `max` 属性(仅适用于多选)。 |
| deselect | boolean | true | 当设置为 `false` 时,最终用户无法从列表框中取消选择已选选项。 |
| popover | boolean | false | 使用浏览器 Popover API 渲染输入框的列表框。 |
| 显示 通用 props | |||
| config | Object | {} | 提供给 input 的节点和此输入的任何后代节点的配置选项。 |
| delay | Number | 20 | 在调度 commit hook 前,输入值的去抖动毫秒数。 |
| dirtyBehavior | string | touched | 确定此输入的“dirty”标志设置方式。可以设置为 touched 或 compare — 默认为 touched,性能更好,但无法检测表单是否再次匹配其初始状态。 |
| errors | Array | [] | 要在此字段上显示的错误消息的字符串数组。 |
| help | String | '' | 帮助文本与输入关联的文本。 |
| id | String | input_{n} | 输入的唯一标识符。提供一个 id 还可以全局访问输入的节点。 |
| ignore | Boolean | false | 防止将输入包含在任何父级(组、列表、表单等)中。在仅用于 UI 而不是实际值的情况下非常有用。 |
| index | Number | undefined | 如果父级是列表,允许在给定索引处插入输入。如果输入的值未定义,它将继承该索引位置的值。如果它有一个值,它将在给定索引处将其插入到列表的值中。 |
| label | String | '' | 与输入关联的 label 元素的文本。 |
| name | String | input_{n} | 输入的名称,在数据对象中唯一标识。在一组字段中应该是唯一的。 |
| parent | FormKitNode | contextual | 默认情况下,父级是包装组、列表或表单,但此属性允许显式分配父级节点。 |
| prefix-icon | String | '' | 指定放置在 prefixIcon 部分的 图标。 |
| preserve | boolean | false | 在输入卸载时,在父组、列表或表单上保留输入的值。 |
| preserve-errors | boolean | false | 默认情况下,使用 setErrors 在输入上设置的错误会在输入时自动清除,将此属性设置为 true 可以保留错误,直到明确清除为止。 |
| sections-schema | Object | {} | 一个包含部分键和模式部分值的对象,其中每个模式部分应用于相应的部分。 |
| suffix-icon | String | '' | 指定放置在 suffixIcon 部分的 图标。 |
| type | String | text | 要从库中渲染的输入类型。 |
| validation | String, Array | [] | 要应用于输入的 验证 规则。 |
| validation-visibility | String | blur | 确定何时显示输入的验证失败规则。有效值为 blur、dirty 和 live。 |
| validation-label | String | {label prop} | 确定在验证错误消息中使用的标签,默认情况下,如果可用,则使用 label 属性,否则使用 name 属性。 |
| validation-rules | Object | {} | 附加的自定义验证规则,可用于验证 prop。 |
| value | Any | undefined | 为输入和/或其子元素提供初始值。不是响应式的。可以种子 整个组(表单)和列表。 |
您可以通过使用该部分的"key"来定位输入的特定部分,从而可以修改该部分的类、HTML(通过:sections-schema)或内容(通过插槽))。了解更多关于部分的信息,请点击这里。
| Section-key | 描述 |
|---|---|
| selector | 选择器部分是一个按钮元素,用于打开下拉选项列表。 |
| selection | 包含已选择的选项。 |
| listitem | 一个列表项元素,包含选项部分。 |
| option | 一个包含选项内容的div。 |
| listbox | 列表框部分是一个ul元素,包含选项列表。 |
| dropdownWrapper | 包裹列表框部分的div,用于处理列表框的滚动。 |
| optionLoading | 一个在加载时条件渲染在选中选项内的span元素。 |
| loaderIcon | 一个在加载时在选择器元素中输出图标的元素。 |
| selectIcon | 一个在下拉菜单关闭时在选择器元素中输出图标的元素。 |
| selectedIcon | 一个在列表框内部,选中选项旁边输出图标的元素。 |
| loadMore | 一个在选项列表底部条件渲染的列表项元素,当有更多页面需要加载时。 |
| loadMoreInner | 一个作为包裹loadMore部分内loaderIcon的span元素。 |
| emptyMessage | 一个在没有选项可显示时条件渲染的列表项元素。 |
| emptyMessageInner | 一个作为包裹emptyMessage部分的span元素。 |
| tagsWrapper | 一个包裹标签部分的div元素。 |
| tags | 一个包含标签的div元素。 |
| tagWrapper | 一个包裹标签的div元素。 |
| tag | 一个包含标签标签和removeSelection部分的div元素。 |
| tagLabel | 一个包含标签标签的span元素。 |
| removeSelection | 一个包含removeSelection图标的span元素。 |
| selectorSelectionsWrapper | 一个包裹selectorSelections部分的div元素。 |
| selectorSelections | 一个包含selectorSelectionsItem部分的div元素。 |
| selectorSelectionsItem | 一个包含selectorSelectionsItem内容的div元素。 |
| truncationCount | 一个包含truncationCount内容的div元素。 |
| 显示 通用 section keys | |
| outer | 最外层的包装元素。 |
| wrapper | 标签和输入周围的包装器。 |
| label | 输入的标签。 |
| prefix | 默认情况下没有输出,但允许直接在输入元素之前放置内容。 |
| prefixIcon | 输出在前缀部分之前放置一个图标的元素。 |
| inner | 实际输入元素周围的包装器。 |
| suffix | 默认情况下没有输出,但允许直接在输入元素之后放置内容。 |
| suffixIcon | 输出在后缀部分之后放置一个图标的元素。 |
| input | 输入元素本身。 |
| help | 包含帮助文本的元素。 |
| messages | 包装所有消息的容器。 |
| message | 包含消息的元素(或多个元素) - 最常见的是验证和错误消息。 |
所有 FormKit 输入都是考虑到以下无障碍性因素而设计的。通过在此处提交无障碍性问题,帮助我们不断改进所有人的无障碍性:
| 部分键 | 属性 | 默认 | 描述 |
|---|---|---|---|
| selector | tabindex | 0 | 通过将其设置为0来优先考虑键盘焦点顺序 |
| aria-haspopup | listbox | 标示交互触发的弹出列表框的存在。 | |
| aria-expanded | 指示下拉元素当前是展开还是折叠状态。 | ||
| aria-controls | 将此元素链接到列表框元素的ID。 | ||
| aria-describedBy | 将此元素与另一个元素的描述性文本关联。 | ||
| placeholder | aria-hidden | true | 当不存在占位符时,使此元素不暴露给无障碍性API。 |
| removeSelection | tabindex | -1 | 通过将其设置为-1来优先考虑键盘焦点顺序 |
| aria-controls | 将此元素链接到输入元素的ID。 | ||
| selections | aria-live | polite | 向屏幕阅读器宣布,此元素已动态更新,而不会中断当前任务。 |
| aria-hidden | true | 使此元素不暴露给无障碍性API。 | |
| selectionsItem | aria-hidden | true | 当最后可见索引和索引大于最后可见索引时,使此元素不暴露给无障碍性API。 |
| tagWrapper | tabindex | 0 | 通过将其设置为0来优先考虑键盘焦点顺序 |
| tag | tabindex | 0 | 通过将其设置为0来优先考虑键盘焦点顺序 |
| tagsWrapper | aria-live | polite | 向屏幕阅读器宣布,此元素已动态更新,而不会中断当前任务。 |
| 显示 通用 部分键 | |||
| label | label | for | 将其与输入元素关联,提高可访问性和用户体验 |
| input | input | disabled | 禁用 HTML 元素,阻止用户交互并指示非交互状态 |
| aria-describedby | 通过将元素与描述关联,增强可访问性,帮助屏幕阅读器 | ||
| aria-required | 当需要验证时,添加所需的状态 | ||
| icon | icon | for | 每当将图标定义为标签时,将其与输入元素关联,增强可访问性和用户体验 |
| 键盘事件 | 描述 |
|---|---|
| Tab | 将焦点移动到页面上的下一个可聚焦输入。 |
| Shift + Tab | 将焦点移动到页面上的上一个可聚焦输入。 |