"use client" import * as React from "react" import { Check, ChevronsUpDown } from "lucide-react" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { useDebouncedCallback } from 'use-debounce'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "@/components/ui/command" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" export interface ComboboxProps { value?: string setValue: (value: string) => void dataList: { value: string; label: string }[] placeholder?: string notFoundText?: string onOpenChange?: () => void className?: string onKeyWordChange?: (keyword: string) => void keyword?: string isLoading?: boolean } export function Combobox({ value, setValue, dataList, placeholder, notFoundText, onOpenChange, className, keyword, onKeyWordChange, isLoading }: ComboboxProps) { const [open, setOpen] = React.useState(false) const debounced = useDebouncedCallback( (v) => { onKeyWordChange && onKeyWordChange(v as string); }, 500, ); return ( { onOpenChange && onOpenChange() setOpen(open)}}> debounced(v)} placeholder={`${placeholder||"请选择..."}`} /> {isLoading ? "加载中..." : notFoundText||"未找到结果"} {dataList.map((item) => ( { setValue(currentValue === value ? "" : currentValue) setOpen(false) }} > {item.label} ))} ) }