delay —— تطبيع تأخير الإظهار والإخفاء
يحتاج tooltip إلى «ظهور فوري عند مرور المؤشر، وبقاء لحظة بعد إبعاده» (تجنب الوميض أثناء العبور)؛ ويحتاج popconfirm إلى «ظهور فوري عند النقر». لكل مكوّن طبقة منبثقة إيقاعه الخاص في الإظهار والإخفاء، ولكن أمر «أي قيمة افتراضية تُستخدم حين لا يمررها المستخدم» هو أمر مشترك بينها.
متى يُستخدم
Section titled “متى يُستخدم”- طبقات منبثقة من نوع التحويم مثل tooltip / popover / popconfirm، تُعرِض props كل من
show-delay/hide-delay. - أي معامل زمني «يمكن للمستخدم تجاوزه، وله قيمة افتراضية معقولة».
لا ينبغي استخدامه: في سيناريوهات التوقيت الثابت (الإغلاق التلقائي لـ message بعد 3 ثوانٍ) اكتب ثابتًا مباشرة، بلا حاجة إلى التطبيع.
طريقة الاستيراد
Section titled “طريقة الاستيراد”import { resolveDelay, type LhDefaultDelay } from '@lh-ui/share/core/shared/delay'الأنواع والدوال
Section titled “الأنواع والدوال”export interface LhDefaultDelay { show: number hide: number}| الدالة | التوقيع | الدور |
|---|---|---|
resolveDelay |
(showDelay: number | undefined, hideDelay: number | undefined, defaults: LhDefaultDelay) => LhDefaultDelay |
تطبيع تأخير الإظهار والإخفاء |
resolveDelay(undefined, undefined, { show: 0, hide: 150 })// { show: 0, hide: 150 } —— المستخدم لم يمرر شيئًا، تُستخدم افتراضات المكوّن
resolveDelay(200, undefined, { show: 0, hide: 150 })// { show: 200, hide: 150 } —— لم يُتجاوز سوى showالتنفيذ هو ?? اثنان فحسب: showDelay ?? defaults.show و hideDelay ?? defaults.hide. ويمر null في المسار نفسه (فالـ ?? يعالج null و undefined معًا).
لماذا تُستخرج دالة مستقلة
Section titled “لماذا تُستخرج دالة مستقلة”القيم الافتراضية تختلف بين المكوّنات الثلاثة، لكن منطق التطبيع واحدة:
| المكوّن | show الافتراضي | hide الافتراضي | السبب |
|---|---|---|---|
| tooltip | 0 | 150 | ظهور فوري لتجنب «عبور بلا استجابة»، وتأخير الإخفاء لتجنب الوميض عند التحرك نحو الهدف |
| popover | 0 | 150 | نفس ما سبق، لكن المحتوى تفاعلي، و hide أطول (تحدده طبقة واجهة المستخدم) |
| popconfirm | 0 | 0 | يعمل بالنقر، بلا دلالة تحويم |
بعد استخراجها، يكفي أن يمرر أي مكوّن طبقة منبثقة جديد قيم defaults الخاصة به، دون إعادة كتابة «إسقاط undefined» مرة أخرى.
الفرق عن debounce
Section titled “الفرق عن debounce”أمران يُخلط بينهما بسهولة:
resolveDelay |
debounce (utils) |
|
|---|---|---|
| الدلالة | تطبيع معاملات «كم الانتظار قبل الإظهار / الإخفاء هذه المرة» | أداة تضييق تُجمِّع الاستدعاءات عالية التردد في تنفيذ واحد |
| الاستخدام | حساب قيمة التأخير | أخذ قيمة التأخير لتغليف مؤقت حقيقي |
المسار النموذجي هو تسلسل طردي: const { hide } = resolveDelay(props.hideDelay, undefined, DEFAULTS) ← hideTimer = debounce(actualHide, hide).
أمثلة الاستخدام
Section titled “أمثلة الاستخدام”// داخل مكوّن popoverconst DEFAULT_DELAY: LhDefaultDelay = { show: 0, hide: 150 }
const delay = computed(() => resolveDelay(props.showDelay, props.hideDelay, DEFAULT_DELAY),)
function onShow() { setTimeout(open, delay.value.show)}function onHide() { setTimeout(close, delay.value.hide)}ملاحظات
Section titled “ملاحظات”- تطبيع بالرجوع فقط، بلا حدّ: تُمرَّر قيمة التأخير السالبة كما هي. فإن احتجت طبقة واجهة المستخدم إلى «تأخير غير سالب حتمًا» فتعامل مع ذلك عند
setTimeout(fn, Math.max(0, ms))(فالـsetTimeoutيعامل السالب على أنه 0، فلا تحدث مشكلة فعلية). show/hideمستقلان: بعد التطبيع يبقى رقمين مستقلين، يستخدمهما المكوّن في مؤقتين منفصلين.- تُعيد كائنًا جديدًا: كل استدعاء يُعيد
{ show, hide }جديدًا، فيمكن تغليفه بأمان داخل غلاف تفاعلي.
@lh-ui/share/core/delay → resolveDelay( )(填好参数后点运行)Copyright © 2024-2026 FengMo WenXue