علامات التبويب Tabs
مكوّن تبديل بالألسنة، يدعم الوضعين المتحكَّم وغير المتحكَّم، ومظهرين (بطاقة / خط)، وإغلاق الألسنة وإضافتها، وتنقلًا كاملًا بلوحة المفاتيح.
الاستخدام الأساسي
import { useState } from 'react'
import { LhTabs, LhTabPane } from '@lh-ui/react'
export default function Demo() {
const [value, setValue] = useState('ink')
return (
<LhTabs value={value} onChange={(name) => setValue(name)}>
<LhTabPane name="ink" label="رسم الحبر">
يتدرّج الحبر وينبض بالروح.
</LhTabPane>
<LhTabPane name="danqing" label="ألوان دانتشينغ">
تتألق ألوان دانتشينغ ببريق ذهبي.
</LhTabPane>
</LhTabs>
)
}
Tabs Props
| الخاصية | الوصف | النوع | القيم المتاحة | الافتراضي |
|---|---|---|---|---|
| value | اسم اللسان النشط حاليًا (متحكَّم به) | string | — | — |
| defaultValue | اسم اللسان النشط حاليًا (قيمة افتراضية غير متحكَّم بها) | string | — | — |
| type | المظهر | 'line' | 'card' | — | 'line' |
| closable | إمكانية إغلاق الألسنة | boolean | — | false |
| addable | إظهار زر الإضافة | boolean | — | false |
| tabPosition | موضع الألسنة | 'top' | 'bottom' | — | 'top' |
| sx | خصائص تخطيط سريعة | SxProps | — | — |
TabPane Props
| الخاصية | الوصف | النوع | الافتراضي |
|---|---|---|---|
| name | المعرِّف الفريد للسان (مفتاح ثابت، يُستحسَن عدم تعديله ديناميكيًا) | string | — |
| label | عنوان اللسان | ReactNode | — |
| disabled | معطّل | boolean | false |
| children | محتوى اللسان | ReactNode | — |
Tabs أحداث
| الحدث | الوصف | معامل الاستدعاء | المقابل في Vue |
|---|---|---|---|
| onChange | يُطلَق عند تغيُّر اللسان النشط | (name: string) => void | @change |
| onRemove | يُطلَق عند إغلاق لسان (ظهور اللسان وإخفاؤه بيد منطق العمل) | (name: string) => void | @remove |
| onAdd | يُطلَق عند النقر على زر الإضافة | () => void | @add |
تمرير value يجعله متحكَّمًا به، وتمرير defaultValue يجعله غير متحكَّم به بحالة داخلية. وكلا الوضعين يُطلِق onChange. وعند حذف اللسان النشط، ينتقل الوضع غير المتحكَّم تلقائيًا إلى أقرب لسان متاح (موافق لـ getNameAfterRemove في plus)؛ أما الوضع المتحكَّم به فيترك المعالجة لمنطق العمل داخل onRemove.
يجب أن يكون children مباشرةً LhTabPane (يمكن العرض via .map، ويمكن لفّه تسطيحًا بـ Fragment، لكن لا يمكن لفّه بمكوّن مخصَّص) — إذ يعتمد المكوّن الأب على Children.forEach للنزول وجمع سجلات الألسنة، واللفّ المخصَّص يؤدي إلى فشل الج مع.
تفاعل لوحة المفاتيح
اتباعًا لنمط tabs في APG: عندما يكون التركيز على زر لسان، يتنقَّل ArrowRight / ArrowLeft (في الوضع العمودي ArrowDown / ArrowUp) بين الألسنة المتاحة ويُنشِّطها، متخطّيًا المعطَّلة؛ وينتقل Home / End إلى الأول / الأخير؛ ويغلق Delete / Backspace اللسان الحالي (يتطلَّب closable). فقط اللسان النشط يحمل tabindex=0، وغيره -1 (roving tabindex).
إمكانية الوصول
شريط الألسنة role="tablist"، وكل لسان role="tab" مع aria-selected / aria-controls، وكل لوحة role="tabpanel" مع aria-labelledby، وتُولَّد المعرِّفات عبر useId() ومستقرة في SSR. وتُزال اللوحات غير النشطة من شجرة إمكانية الوصول عبر خاصية hidden.
المرجع
forwardRef<HTMLDivElement> —— العنصر الجذري. ويُمرِّر LhTabPane HTMLDivElement.
الأنماط
import '@lh-ui/react/theme.css'
import '@lh-ui/react/style/tabs'