109k

组合框

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

Radix UIBase UI
Radix UI - shadcn/ui 组件库
"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="Select a framework" />
      <ComboboxContent>
        <ComboboxEmpty>No items found.</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="Select a framework" />
      <ComboboxContent>
        <ComboboxEmpty>No items found.</ComboboxEmpty>
        <ComboboxList>
          {(framework) => (
            <ComboboxItem key={framework.value} value={framework}>
              {framework.label}
            </ComboboxItem>
          )}
        </ComboboxList>
      </ComboboxContent>
    </Combobox>
  )
}

多选

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

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="Add framework" />
      </ComboboxChips>
      <ComboboxContent>
        <ComboboxEmpty>No items found.</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 {

RTL (从右至左)

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

"use client"

import * as React from "react"

API 参考

查看 Base UI 文档以获取更多信息。