106k
New

组合框

带有建议列表的自动完成输入框。

"use client"

import {

安装

pnpm dlx shadcn@latest add combobox

用法

import {
  Combobox,
  ComboboxContent,
  ComboboxEmpty,
  ComboboxInput,
  ComboboxItem,
  ComboboxList,
} from "@/components/ui/combobox"
const frameworks = ["Next.js", "SvelteKit", "Nuxt.js", "Remix", "Astro"]
 
export function ExampleCombobox() {
  return (
    <Combobox items={frameworks}>
      <ComboboxInput placeholder="选择一个框架" />
      <ComboboxContent>
        <ComboboxEmpty>未找到项目。</ComboboxEmpty>
        <ComboboxList>
          {(item) => (
            <ComboboxItem key={item} value={item}>
              {item}
            </ComboboxItem>
          )}
        </ComboboxList>
      </ComboboxContent>
    </Combobox>
  )
}

自定义项

当您的项目是对象时,请使用 itemToStringValue

import * as React from "react"
 
import {
  Combobox,
  ComboboxContent,
  ComboboxEmpty,
  ComboboxInput,
  ComboboxItem,
  ComboboxList,
} from "@/components/ui/combobox"
 
type Framework = {
  label: string
  value: string
}
 
const frameworks: Framework[] = [
  { label: "Next.js", value: "next" },
  { label: "SvelteKit", value: "sveltekit" },
  { label: "Nuxt", value: "nuxt" },
]
 
export function ExampleComboboxCustomItems() {
  return (
    <Combobox
      items={frameworks}
      itemToStringValue={(framework) => framework.label}
    >
      <ComboboxInput placeholder="选择一个框架" />
      <ComboboxContent>
        <ComboboxEmpty>未找到项目。</ComboboxEmpty>
        <ComboboxList>
          {(framework) => (
            <ComboboxItem key={framework.value} value={framework}>
              {framework.label}
            </ComboboxItem>
          )}
        </ComboboxList>
      </ComboboxContent>
    </Combobox>
  )
}

多选

使用 multiple 和标签实现多选行为。

import * as React from "react"
 
import {
  Combobox,
  ComboboxChip,
  ComboboxChips,
  ComboboxChipsInput,
  ComboboxContent,
  ComboboxEmpty,
  ComboboxInput,
  ComboboxItem,
  ComboboxList,
  ComboboxValue,
} from "@/components/ui/combobox"
 
const frameworks = ["Next.js", "SvelteKit", "Nuxt.js", "Remix", "Astro"]
 
export function ExampleComboboxMultiple() {
  const [value, setValue] = React.useState<string[]>([])
 
  return (
    <Combobox
      items={frameworks}
      multiple
      value={value}
      onValueChange={setValue}
    >
      <ComboboxChips>
        <ComboboxValue>
          {value.map((item) => (
            <ComboboxChip key={item}>{item}</ComboboxChip>
          ))}
        </ComboboxValue>
        <ComboboxChipsInput placeholder="添加框架" />
      </ComboboxChips>
      <ComboboxContent>
        <ComboboxEmpty>未找到项目。</ComboboxEmpty>
        <ComboboxList>
          {(item) => (
            <ComboboxItem key={item} value={item}>
              {item}
            </ComboboxItem>
          )}
        </ComboboxList>
      </ComboboxContent>
    </Combobox>
  )
}

例子

基本

一个包含框架列表的简单组合框。

"use client"

import {

多选

使用 multipleComboboxChips 的多选组合框。

"use client"

import * as React from "react"

清除按钮

使用 showClear 属性显示清除按钮。

"use client"

import {

分组

使用 ComboboxGroupComboboxSeparator 来分组项目。

"use client"

import {

自定义项目

您可以在 ComboboxItem 内渲染自定义组件。

"use client"

import {

无效状态

使用 aria-invalid 属性使组合框处于无效状态。

"use client"

import {

禁用

使用 disabled 属性禁用组合框。

"use client"

import {

自动高亮

使用 autoHighlight 属性在过滤时自动高亮第一个项目。

"use client"

import {

弹出式

您可以通过 render 属性,使用按钮或其他组件触发组合框。将 ComboboxInput 移动到 ComboboxContent 内。

"use client"

import { Button } from "@/components/ui/button"

输入组

您可以在 ComboboxInput 内使用 InputGroupAddon 组件为组合框添加附加内容。

"use client"

import {

API 参考

更多信息请参见 Base UI 文档。