111k

Combobox

带有建议列表的自动补全输入框。

"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 搭配 chips 实现多选行为。

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>
  )
}

示例

基础

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

"use client"

import {

多选

使用 multipleComboboxChips 的多选 combobox。

"use client"

import * as React from "react"

清除按钮

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

"use client"

import {

分组

使用 ComboboxGroupComboboxSeparator 对项目分组。

"use client"

import {

自定义项

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

"use client"

import {

无效

使用 aria-invalid 属性将 combobox 标记为无效。

"use client"

import {

禁用

使用 disabled 属性禁用 combobox。

"use client"

import {

自动高亮

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

"use client"

import {

弹出式

你可以通过 render 属性让按钮或其他组件触发 combobox。把 ComboboxInput 移到 ComboboxContent 内部。

"use client"

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

输入组

你可以在 ComboboxInput 内使用 InputGroupAddon 组件为 combobox 添加附加内容。

"use client"

import {

RTL

要在 shadcn/ui 中启用 RTL 支持,请参见 RTL 配置指南

"use client"

import * as React from "react"

API 参考

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