Autocompletev1.1.0
فیلد متنی که هر چه تایپ میکنید، فهرست گزینهها را فیلتر میکند؛ ترکیب Input و ListBox در یک کامپوننت، با مدل combobox (فوکوس همیشه روی خودِ فیلد میماند).
این کامپوننت فعلاً برای ۱ فریمورک از ۴ فریمورک آماده است.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نصب
با CLI اختصاصی digdesign کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگیها و فایلها خودکار اضافه میشوند.
npx digdesign@latest add https://docs.digdesign.ir/r/autocomplete.jsonpnpm dlx digdesign@latest add https://docs.digdesign.ir/r/autocomplete.jsonyarn dlx digdesign@latest add https://docs.digdesign.ir/r/autocomplete.jsonbunx --bun digdesign@latest add https://docs.digdesign.ir/r/autocomplete.jsonاین کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
استفاده
import { Autocomplete } from "@/components/ui/autocomplete"
<Autocomplete
items={cities}
value={city}
onValueChange={setCity}
placeholder="شهر را جستجو کنید…"
/>این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
ترکیب اجزا
Autocomplete دیتا-محور است: فهرست items را بهعنوان آرایهٔ { value, label } میدهید، نه فرزند JSX (برخلاف ListBox).
فیلتر روی برچسبها با نرمالسازی حروف عربی/فارسی (ی/ك در برابر ی/ک) انجام میشود تا تایپ با هر دو صورت نویسهها کار کند.
دسترسپذیری
- role=combobox روی input با aria-expanded/aria-controls/aria-activedescendant؛ فهرست role=listbox و هر گزینه role=option است.
- فوکوس واقعیِ کیبورد همیشه روی input میماند؛ گزینهٔ هایلایتشده فقط با aria-activedescendant معرفی میشود، نه با جابهجایی فوکوس.
- فلش بالا/پایین بین گزینههای فیلترشده حرکت میکند، Enter گزینهٔ هایلایتشده را تایید میکند و Escape فهرست را میبندد و مقدار را به آخرین انتخاب برمیگرداند.
- idهای input، listbox و گزینهها برای هر نمونه یکتاست (پیشفرض React.useId)؛ برای برچسبِ قابلدیدن id بدهید و همان را در Label htmlFor بگذارید.
مرجع API
Autocomplete
| ویژگی | نوع | پیشفرض | توضیح |
|---|---|---|---|
| items | { value: string; label: string; disabled?: boolean }[] | — | فهرست کامل گزینهها. |
| value / defaultValue | string | — | مقدار انتخابشدهٔ کنترلشده یا اولیه. |
| onValueChange | (value: string) => void | — | فراخوانی هنگام انتخاب یک گزینه. |
| placeholder | string | "جستجو…" | متن راهنمای فیلد. |
| emptyText | string | "چیزی پیدا نشد" | متن هنگام خالیبودن نتیجهٔ فیلتر. |
| disabled | boolean | false | غیرفعال کردن کل فیلد. |
| invalid | boolean | false | فیلد نامعتبر است: حاشیهٔ خطا و aria-invalid روی خودِ ورودی. پیام خطا را جدا بنویسید و با aria-describedby وصلش کنید. |
| id | string | React.useId() | id ورودی، برای اتصال <Label htmlFor>. idهای listbox و گزینهها از همین ساخته میشوند؛ بدون آن هر نمونه یک id یکتای خودکار میگیرد، پس چند Autocomplete در یک صفحه تداخل ندارند. |
این کامپوننت هنوز برای Vue پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Svelte پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
این کامپوننت هنوز برای Angular پورت نشده است.
نسخهٔ ریاکت آماده است؛ پورت این فریمورک در دست کار است.
نمونهها
با برچسب و مقدار اولیه
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
با گزینهٔ غیرفعال
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
غیرفعال
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نامعتبر (Invalid)
Autocomplete پراپ invalid ندارد. حاشیهٔ خطا را با className روی input بگذارید و پیام را زیرش بنویسید. اگر فیلد اجباری است، پیش از اولین تلاشِ ثبت خطا نشان ندهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
غیرفعال در برابر مقدار قطعیشده
Autocomplete حالت فقطخواندنی ندارد و disabled جایش نیست: مقدار خاکستری و غیرقابل کپی میشود. اگر انتخاب قطعی شده، بهجای کنترل، متن نشان دهید.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
در حال دریافت گزینهها (Loading)
تا رسیدن گزینهها فیلد را قفل کنید و placeholder را گویا بگذارید. فیلد باز ولی خالی، کاربر را وادار میکند تایپ کند و نتیجه نبیند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
نتیجهٔ خالی (Empty)
متن پیشفرض «چیزی پیدا نشد» است. با emptyText دقیقترش کنید تا کاربر بفهمد در چه چیزی جستجو شده و چه کند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
عنوان بلند (Overflow)
عرض ثابت بدهید تا فیلد با محتوا کش نیاید. بدون آن، یک گزینهٔ بلند کل چیدمان فرم را جابهجا میکند.
این نمونه هنوز برای Vue پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Svelte پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
این نمونه هنوز برای Angular پورت نشده است؛ آنچه میبینید نسخهٔ ریاکت است.
کدام نمونه برای کدام موقعیت
| نمونه | کجا به کار میآید |
|---|---|
| با برچسب و مقدار اولیه | فرم ویرایش سفر که شهر مبدا از قبل انتخاب شده |
| با گزینهٔ غیرفعال | شهری که ظرفیتش تکمیل شده و فعلاً قابل انتخاب نیست |
| غیرفعال | فیلد شهر مقصد که تا انتخابنشدن مبدا قفل است |
| نامعتبر (Invalid) | فیلد اجباری که کاربر بدون انتخاب، فرم را ثبت کرده |
| غیرفعال در برابر مقدار قطعیشده | فیلدی که بعد از ثبت قفل شده و فقط باید دیده شود |
| در حال دریافت گزینهها (Loading) | فهرستی که با باز شدن فرم از سرور میآید |
| نتیجهٔ خالی (Empty) | جستجویی که به هیچ گزینهای نمیخورد |
| عنوان بلند (Overflow) | نام کامل سازمانها و عنوانهای طولانی |