Chuyển tới nội dung

Pro đang mở bán trước. Cài đặt mở từ tháng 1/2027. Xem Pro

Component

Command

Tìm và chạy một hành động bằng cách gõ. Dùng Command inline hoặc CommandDialog cho một palette, với kết quả theo nhóm và điều hướng bằng bàn phím.

  • npm: 0 trực tiếp, 7 tổng
  • registry: 6 trực tiếp, 8 tổng

Xem trước

    • Dự án mới⌘ N
    • Tìm kiếm dự án
    • Cài đặt
    • Thanh toán

Props

  • placeholder
  • emptyText
  • defaultSearch
  • disabled
import { IconPlus, IconSearch, IconSettings } from "@tabler/icons-react"
import { Command, CommandGroup, CommandItem, CommandSeparator, CommandShortcut } from "@/components/ui/command"

const selectCommand = (value: string) => { /* Chạy hành động đã chọn. */ }

<Command label="Tìm kiếm lệnh" placeholder="Tìm kiếm thao tác…" emptyText="Không tìm thấy kết quả." className="w-full max-w-md">
  <CommandGroup heading="Không gian làm việc">
    <CommandItem value="new-project" keywords={["create"]} leadingIcon={<IconPlus size={16} />} onSelect={selectCommand} shortcut={<CommandShortcut aria-label="Command N">⌘ N</CommandShortcut>}>Dự án mới</CommandItem>
    <CommandItem value="search-projects" leadingIcon={<IconSearch size={16} />} onSelect={selectCommand}>Tìm kiếm dự án</CommandItem>
  </CommandGroup>
  <CommandSeparator />
  <CommandGroup heading="Tài khoản">
    <CommandItem value="settings" leadingIcon={<IconSettings size={16} />} onSelect={selectCommand}>Cài đặt</CommandItem>
    <CommandItem value="billing" disabled onSelect={selectCommand}>Thanh toán</CommandItem>
  </CommandGroup>
</Command>

Cách dùng

Khi nào dùng

  • Tìm và chạy hành động từ danh sách tìm được, inline hoặc trong dialog.
  • Để người dùng tới một đích bằng cách tìm tên hoặc keywords của đích đó.

Khi nào không dùng

  • Chọn một giá trị form từ danh sách tìm được. Dùng Combobox.
  • Menu ngắn, cố định, không có tìm kiếm. Dùng DropdownMenu.
  • Đăng ký shortcut toàn cục. Thêm handler trong ứng dụng của bạn.

Ví dụ

Hành động workspace

    • Tạo dự án
    • Lưu trữ dự án
    • Sửa hồ sơ
import { Command, CommandGroup, CommandItem, CommandSeparator } from "@/components/ui/command"

const selectCommand = (value: string) => { /* Chạy hành động đã chọn. */ }

<Command label="Tìm một thao tác của không gian làm việc" placeholder="Tìm kiếm không gian làm việc…">
  <CommandGroup heading="Không gian làm việc">
    <CommandItem value="create" keywords={["new", "add"]} onSelect={selectCommand}>Tạo dự án</CommandItem>
    <CommandItem value="archive" disabled>Lưu trữ dự án</CommandItem>
  </CommandGroup>
  <CommandSeparator />
  <CommandGroup heading="Tài khoản">
    <CommandItem value="profile" onSelect={selectCommand}>Sửa hồ sơ</CommandItem>
  </CommandGroup>
</Command>

Trong dialog

Phần tử cha giữ trạng thái mở và các handler của hành động. Khi đóng, focus trở về button.

import { useState } from "react"
import { Button } from "@/components/ui/button"
import { Command, CommandDialog, CommandItem } from "@/components/ui/command"

const [commandOpen, setCommandOpen] = useState(false)
const openCommand = () => setCommandOpen(true)
const selectCommand = (value: string) => { /* Chạy hành động đã chọn. */ }

<div>
  <Button variant="secondary" onClick={openCommand}>Mở lệnh</Button>
  <CommandDialog title="Thao tác không gian làm việc" open={commandOpen} onOpenChange={setCommandOpen}>
    <Command label="Tìm một thao tác">
      <CommandItem value="create" onSelect={selectCommand}>Tạo dự án</CommandItem>
      <CommandItem value="profile" onSelect={selectCommand}>Sửa hồ sơ</CommandItem>
    </Command>
  </CommandDialog>
</div>

Từ tìm tùy chỉnh

    • Giao diện
    • Thông báo
import { Command, CommandGroup, CommandItem } from "@/components/ui/command"

const selectCommand = (value: string) => { /* Chạy hành động đã chọn. */ }

<Command label="Tìm một cài đặt" emptyText="Không có cài đặt nào khớp.">
  <CommandGroup heading="Cài đặt">
    <CommandItem value="appearance" textValue="Giao diện" keywords={["theme", "dark", "light"]} onSelect={selectCommand}>Giao diện</CommandItem>
    <CommandItem value="notifications" onSelect={selectCommand}>Thông báo</CommandItem>
  </CommandGroup>
</Command>

Nên và không nên

Nên

  • Dùng nhãn ngắn mở đầu bằng động từ và xếp hành động liên quan thành nhóm.
  • Đưa textValue cho nhãn tùy chỉnh và keywords cho các tên khác.
  • Để ứng dụng tự đăng ký shortcut toàn cục và xử lý tác dụng phụ của hành động.

Không nên

  • Đừng dùng Command để gửi một giá trị form; dùng Combobox.
  • Đừng dùng tìm từ xa trực tiếp hoặc trang command lồng nhau trong phiên bản này.
  • Đừng hiện gợi ý shortcut cho shortcut mà ứng dụng không làm.

Props

TênKiểuGiá trịMặc địnhMô tả
label bắt buộcstring--Tên truy cập của ô tìm và danh sách kết quả.
placeholderstring-Search actions…Gợi ý nhìn thấy trong ô tìm.
emptyTextstring-No results found.Trạng thái hiện khi không command nào khớp chữ đang tìm.
searchstring--Chữ tìm được kiểm soát. Phần tử cha cập nhật nó qua onSearchChange.
defaultSearchstring-Chữ tìm ban đầu cho Command không được kiểm soát.
onSearchChangefunction--Được gọi với chữ tìm mới mỗi khi người dùng gõ.
loopboolean-trueQuay vòng điều hướng mũi tên từ kết quả enabled cuối về kết quả đầu.
openboolean--Trạng thái mở được kiểm soát của CommandDialog.
defaultOpenboolean-falseTrạng thái mở ban đầu của CommandDialog không được kiểm soát.
onOpenChangefunction--Được gọi khi CommandDialog mở hoặc đóng.
heading bắt buộcstring--Tiêu đề nhìn thấy và truy cập được của CommandGroup.
value bắt buộcstring--Định danh CommandItem duy nhất, truyền vào onSelect. Đây không phải lựa chọn form được lưu.
keywordsnode--Một mảng các từ tìm thêm trên CommandItem.
leadingIconnode--Icon trang trí của CommandItem. Dùng icon thường 16px.
shortcutnode--Gợi ý phím của CommandItem: chữ dùng một Kbd nhỏ; node CommandShortcut, Kbd hoặc KbdGroup giữ định dạng và tên truy cập riêng. Không đăng ký shortcut.
disabledboolean-falseCommandItem disabled vẫn hiện nhưng không được tô sáng hoặc kích hoạt.
onSelectfunction--Callback của CommandItem, nhận value của nó. CommandDialog đóng sau khi kích hoạt.
textValuestring--Nhãn tìm được của CommandItem khi children chứa node tùy chỉnh.
title bắt buộcstring--CommandDialog dùng prop title để đặt tên dialog của nó. Bắt buộc trên CommandDialog, không có trên Command inline.
descriptionstring--CommandDialog dùng prop description cho mô tả truy cập tùy chọn.

Cấu tạo

PhầnMô tả
rootMột command enabled hoặc một kết quả disabled.
controlÔ tìm với ngữ nghĩa combobox.
placeholderGợi ý hiện trong ô tìm đang trống.
listDanh sách kết quả cuộn được.
iconIcon trang trí trước nhãn của command.
groupLabelTiêu đề nhìn thấy của một nhóm kết quả.
separatorĐường kẻ trang trí giữa các nhóm đang hiện.
emptyChữ trạng thái khi không command nào khớp.
shortcutGợi ý phím gọn ở cuối hàng. Chữ thuần dùng Kbd nhỏ; gợi ý phím hoặc nhóm phím được truyền thì render trực tiếp, không thêm keycap nữa.
contentPanel raised kiểu inline, chứa field tìm và kết quả của nó.

Khả năng truy cập

Role: combobox

PhímHành động
ArrowDown / ArrowUpĐưa phần tô sáng qua các command enabled đang hiện, không rời field tìm.
Home / EndTô sáng command enabled đang hiện đầu tiên hoặc cuối cùng.
EnterKích hoạt command đang tô sáng đúng một lần; không bao giờ kích hoạt khi đang soạn chữ.
EscapeĐóng CommandDialog và trả focus về phần tử đã mở nó. Command inline để Escape cho phần tử chủ.
Tab / Shift+TabTheo thứ tự focus bình thường khi inline; ở lại trong dialog khi modal.
  • label là bắt buộc và đặt tên cho cả field tìm lẫn listbox.
  • aria-activedescendant chỉ trỏ tới một option enabled đã mount. aria-selected theo phần đang tô sáng.
  • Mỗi CommandGroup được đặt tên bằng tiêu đề của nó. Các mục disabled được thông báo là disabled.
  • CommandDialog bắt buộc title và focus vào field tìm khi mở. Nó đặt lại chữ tìm không kiểm soát khi đóng.
  • Dùng value không trùng cho mỗi mục và nội dung thuần, không tương tác. Hành động nằm ở onSelect; đừng lồng link hoặc button bên trong một option.

Cài đặt

npx werewolf-ui add command

Chạy npx werewolf-ui init một lần trong app trước khi thêm component. Init cài token, thêm CSS import và luật cho agent. Add cài component này cùng các dependency và giữ nguyên theme của bạn. Xem Cài đặt để biết yêu cầu và cách cài qua registry.