使用高级 Chakra UI 组件更快地构建 💎

了解更多
跳到内容
文档演练场指南博客
赞助

组合框

一个多功能的输入组件,它结合了文本输入框和列表框,允许用户筛选选项列表并选择单个或多个值。

源代码Storybook食谱Ark

用法

import { Combobox } from "@chakra-ui/react"
<Combobox.Root>
  <Combobox.Label />

  <Combobox.Control>
    <Combobox.Input />
    <Combobox.IndicatorGroup>
      <Combobox.ClearTrigger />
      <Combobox.Trigger />
    </Combobox.IndicatorGroup>
  </Combobox.Control>

  <Combobox.Positioner>
    <Combobox.Content>
      <Combobox.Empty />
      <Combobox.Item />

      <Combobox.ItemGroup>
        <Combobox.ItemGroupLabel />
        <Combobox.Item />
      </Combobox.ItemGroup>
    </Combobox.Content>
  </Combobox.Positioner>
</Combobox.Root>

要设置组合框,您可能需要导入以下 Hook

  • useListCollection: 用于管理组合框中的项目列表,提供用于过滤和修改列表的实用方法。

  • useFilter: 用于根据 Intl.Collator API 为组合框提供过滤逻辑。

示例

基本

基本组合框提供了一个可搜索的下拉菜单,支持单选。

尺寸

size 属性传递给 Combobox.Root 以改变组合框的尺寸。

变体

variant 属性传递给 Combobox.Root 以改变组合框的外观。

多选

multiple 属性传递给 Combobox.Root 以启用多选。这允许用户从列表中选择多个项目。

当设置此项时,组合框在选择项目后将始终清除输入值。

异步加载

这是一个用户输入时异步加载 collection 的示例,非常适合 API 驱动的搜索界面。

高亮匹配文本

这是一个组合 Combobox.ItemHighlight 组件以在高亮搜索结果中匹配文本的示例。

点击打开

使用 openOnClick 属性,在用户点击输入框时打开组合框。

自定义对象

默认情况下,组合框集合期望一个包含 labelvalue 属性的对象数组。在某些情况下,您可能需要处理自定义对象。

使用 itemToStringitemToValue 属性将自定义对象映射到所需的接口。

const items = [
  { country: "United States", code: "US", flag: "🇺🇸" },
  { country: "Canada", code: "CA", flag: "🇨🇦" },
  { country: "Australia", code: "AU", flag: "🇦🇺" },
  // ...
]

const { collection } = useListCollection({
  initialItems: items,
  itemToString: (item) => item.country,
  itemToValue: (item) => item.code,
})

最少字符数

使用 openOnChange 属性设置过滤列表前的最少字符数。

<Combobox.Root openOnChange={(e) => e.inputValue.length > 2} />

字段

Combobox 组件与 Field 组件组合,将组合框包装在表单字段中。这对于表单布局很有用。

您喜欢的框架

禁用状态

disabled 属性传递给 Combobox.Root 以禁用整个组合框。

禁用项

禁用下拉菜单中的特定项,将 disabled 属性添加到集合项。

const items = [
  { label: "Item 1", value: "item-1", disabled: true },
  { label: "Item 2", value: "item-2" },
]

const { collection } = useListCollection({
  initialItems: items,
  // ...
})

输入组

与 InputGroup 结合使用以添加图标或其他元素。

无效

invalid 属性传递给 Combobox.Root 以显示错误状态。

受控值

使用 valueonValueChange 属性以编程方式控制组合框的值。

已选择
N/A

存储

控制组合框的另一种方法是使用 Combobox.RootProvider 组件和 useCombobox 存储 Hook。

import { Combobox, useCombobox } from "@chakra-ui/react"

function Demo() {
  const combobox = useCombobox()

  return (
    <Combobox.RootProvider value={combobox}>{/* ... */}</Combobox.RootProvider>
  )
}

这样您就可以从组合框外部访问组合框的状态和方法。

受控打开状态

使用 openonOpenChange 属性以编程方式控制组合框的打开状态。

限制大数据集

管理大型列表的推荐方法是在 useListCollection Hook 上使用 limit 属性。这将限制 DOM 中渲染的项目数量以提高性能。

虚拟化

另外,您可以利用 @tanstack/react-virtual 包的虚拟化功能,高效渲染大型数据集。

使用 asChild 属性将组合框项目渲染为链接。

对于自定义路由链接,您可以自定义 Combobox.Root 组件上的 navigate 属性。

这是一个使用 Tanstack Router 的示例。

import { Combobox } from "@chakra-ui/react"
import { useNavigate } from "@tanstack/react-router"

function Demo() {
  const navigate = useNavigate()
  return (
    <Combobox.Root
      navigate={({ href }) => {
        navigate({ to: href })
      }}
    >
      {/* ... */}
    </Combobox.Root>
  )
}

恢复值

在某些情况下,组合框具有 defaultValue 但集合尚未加载时,这是一个如何恢复值并填充输入值的示例。

自定义项

使用您自己的组件自定义下拉菜单中项目的显示。

自定义过滤器

这是一个自定义过滤器的示例,它可以匹配项目的多个属性。

自定义动画

要自定义组合框的动画,请将 _open_closed 属性传递给 Combobox.Content 组件。

弹出框

要在弹出框组件中使用组合框,请避免将 Combobox.Positioner 包装在 Portal 中。

-<Portal>
  <Combobox.Positioner>
    <Combobox.Content>
      {/* ... */}
    </Combobox.Content>
  </Combobox.Positioner>
-</Portal>

属性

Root

属性名默认值类型
collection *
ListCollection<T>

项目集合

composite true
boolean

组合框是否与其他复合小部件(如选项卡)组合

inputBehavior '\'none\''
'none' | 'autohighlight' | 'autocomplete'

定义组合框的自动完成行为。 - `autohighlight`: 用户输入时,第一个焦点项会被高亮显示 - `autocomplete`: 使用方向键导航列表框时会选择项目并更新输入框

lazyMount false
boolean

是否启用懒加载

loopFocus true
boolean

键盘导航是否在项目间循环

openOnChange true
boolean | ((details: InputValueChangeDetails) => boolean)

输入值改变时是否显示组合框

openOnClick false
boolean

首次点击输入框时是否打开组合框弹出窗口

openOnKeyPress true
boolean

按下方向键时是否打开组合框

selectionBehavior '\'replace\''
'replace' | 'clear' | 'preserve'

选择项目时组合框输入框的行为 - `replace`: 选定的项目字符串被设置为输入值 - `clear`: 输入值被清除 - `preserve`: 输入值被保留

unmountOnExit false
boolean

是否在退出时卸载。

allowCustomValue
boolean

是否允许在输入框中输入自定义值

asChild
boolean

使用提供的子元素作为默认渲染元素,结合它们的属性和行为。

欲了解更多详情,请阅读我们的 组合 指南。
autoFocus
boolean

是否在挂载时自动聚焦输入框

closeOnSelect
boolean

选择项目时是否关闭组合框。

defaultOpen
boolean

组合框首次渲染时的初始打开状态。在您不需要控制其打开状态时使用。

defaultValue
string[]

组合框首次渲染时的初始值。在您不需要控制组合框状态时使用。

disabled
boolean

组合框是否禁用

disableLayer
boolean

是否禁用将此注册为可关闭层

form
string

组合框的关联表单。

highlightedValue
string

活动项目的 ID。用于设置 `aria-activedescendant` 属性

id
string

机器的唯一标识符。

ids
Partial<{ root: string label: string control: string input: string content: string trigger: string clearTrigger: string item(id: string, index?: number | undefined): string positioner: string itemGroup(id: string | number): string itemGroupLabel(id: string | number): string }>

组合框中元素的 ID。对组合很有用。

immediate
boolean

是立即同步当前更改还是将其推迟到下一帧

inputValue
string

组合框输入框的当前值

invalid
boolean

组合框是否无效

multiple
boolean

是否允许多选。**请注意:**当 `multiple` 为 `true` 时,`selectionBehavior` 会自动设置为 `clear`。建议在单独的容器中渲染已选择的项目。

name
string

组合框输入框的 `name` 属性。对表单提交很有用。

navigate
(details: NavigateDetails) => void

导航到所选项目的功能

onExitComplete
() => void

当动画在关闭状态下结束时调用的函数

onFocusOutside
(event: FocusOutsideEvent) => void

当焦点移出组件时调用的函数

onHighlightChange
(details: HighlightChangeDetails<T>) => void

使用指针或键盘导航高亮显示项目时调用的函数。

onInputValueChange
(details: InputValueChangeDetails) => void

当输入框的值改变时调用的函数

onInteractOutside
(event: InteractOutsideEvent) => void

当组件外部发生交互时调用的函数

onOpenChange
(details: OpenChangeDetails) => void

弹出窗口打开时调用的函数

onPointerDownOutside
(event: PointerDownOutsideEvent) => void

当指针在组件外部按下时调用的函数

onValueChange
(details: ValueChangeDetails<T>) => void

选择新项目时调用的函数

open
boolean

组合框是否打开

placeholder
string

组合框输入框的占位符文本

positioning
PositioningOptions

动态定位菜单的定位选项

present
boolean

节点是否存在(由用户控制)

readOnly
boolean

组合框是否只读。这将使组合框处于“不可编辑”模式,但用户仍然可以与其交互

required
boolean

组合框是否为必填项

scrollToIndexFn
(details: ScrollToIndexDetails) => void

滚动到特定索引的函数

translations
IntlTranslations

指定识别可访问性元素及其状态的本地化字符串

value
string[]

所选项目的键

Item

属性名默认值类型
asChild
boolean

使用提供的子元素作为默认渲染元素,结合它们的属性和行为。

欲了解更多详情,请阅读我们的 组合 指南。
item
any

要渲染的项目

persistFocus
boolean

悬停在外部时是否清除高亮状态

上一页

可折叠

下一页

颜色选择器