تخطّي إلى المحتوى الرئيسي

الأسئلة الشائعة

لماذا لا توجد آلية تثبيت app.use()​

ليس في React نظام إضافات (plugins) مثل Vue. جميع صادرات @lh-ui/react مسمَّاة، فاكتفِ بالاستيراد عند الحاجة، مما يجعل tree-shaking أكثر ودًا. وللتكوين العام لفَّ تطبيقك بمكوّن LhConfigProvider.

لماذا لا تُحقَن الأنماط تلقائيًا​

استراتيجية الاستيراد عند الحاجة الموافقة لـ @lh-ui/vue2: لا يُحقِن مدخل الحزمة أنماطًا كاملة كأثر جانبي، بل يُستورَد @lh-ui/react/theme.css و@lh-ui/react/style/<name> صراحةً من قبل المستخدم. والسبب أن الاستيراد عند الحاجة هو السائد في منظومة React، وأن الآثار الجانبية الكاملة تُفسِد tree-shaking.

لماذا onChange يأخذ معاملين​

تصميم المعاملين (value, event) متماثل بنيويًا مع emit('change', [val, e]) في lh-ui-plus، مما يُسهِّل الترحيل من Vue ويحافظ على إمكانية الحصول على الحدث الأصلي.

لماذا لا تُستخدم floating-ui لتموضع الطبقات المنبثقة​

خط أحمر عائلي: حسابات هندسة الطبقات المنبثقة منفَّذة داخل @lh-ui/share/core/shared/popper، وتتشارك جميع الأطراف المنطق نفسه ومعالجة الحدود (القلب، الانطواء عند التجاوز، السهم). وإدخال مكتبة خارجية يؤدي إلى انحراف السلوك بين الأطراف.

لماذا لا يُستخدم react-transition-group للحركات الانتقالية​

للسبب ذاته. useTransition آلة حالة mounted + phase من تطوير هذه المكتبة، وأسماء أصنافها مطابقة تمامًا لـ SCSS في share (*-enter-from / *-enter-active / *-enter-to)، وهي آمنة تحت StrictMode.

لماذا يكون Dialog متحكَّمًا به بالكامل​

تُحفظ open بالكامل في حالة خارجية، وكل مسار إغلاق (النقر على القناع / Esc / زر الإغلاق) يستدعي onClose فقط. أما في lh-ui-plus فتوجد حالة وسيطة isVisible مع مزامنة watch ثنائية الاتجاه؛ وقد حُذِفت هذه الطبقة في نسخة React: فدلالة التحكم أنقى، وتُجنَّب حالة التنافس بين props والحالة الداخلية.

عند فتح عدة مربعات حوار، لماذا يُغلق Esc واحدًا منها فقط​

يُدير useLhOverlayStack رصة ترتيب الفتح، فيُغلق Esc الطبقة العلوية فقط. وهذا ما يتطلَّبه APG dialog pattern، لتفادي إغلاق جميع الطبقات بضغطة واحدة.

هل تُنشئ الخدمات الحتمية عدة React root​

لا. تشارك خدمات مثل message جذر حاوية أحاديًا (singleton) يُنشأ بتكاسل عند أول استدعاء ويُلحَق بـ body، وتُدار قائمة الرسائل بحالة داخل المكوّن. ويستدعي destroyContainer() صراحةً root.unmount().

ماذا يحدث عند استدعاء message في SSR​

تُطبع تحذيرة في وضع التطوير فقط وتُهمَل (no-op) دون إنشاء أي DOM. فجميع عمليات DOM داخل useEffect / useIsomorphicLayoutEffect، ويُقدِّم useLhLocale لقطة SSR متسقة عبر useSyncExternalStore.

لماذا الحاجة إلى forwardRef بدل استخدام ref كـ prop مباشرة​

دعم نسختي React 18 و19 معًا. فـ ref-as-prop في React 19 غير موجود في 18، وforwardRef هو المجموعة الفوقية المشتركة بين النسختين. وجميع المكوّنات القابلة للتركيز (button / input / select / dialog / tooltip) تُمرِّر ref.

هل يمكن استخدام lh-ui-plus و@lh-ui/react في المشروع نفسه​

نعم، أسماء الأصناف والرموز متطابقة تمامًا بينهما فلا تتعارض الأنماط. لكن ذلك غير ضروري عادةً — فهما شكلان إطاريان للمكوّنات نفسها. وفي سيناريوهات الترحيل التدريجي، انتبه إلى ضرورة توافق نطاقات إصدار @lh-ui/share بين المكتبتين.

ما الذي لم يُنفَّذ في الإصدار الأول​

لم تُنفَّذ مكوّنات P1/P2 (Popover وDrawer وDropdown وTable وغيرها). أما الخدمات الحتمية الثلاث (message / notification / loading) فمُنفَّذة بالكامل.