تخطَّ إلى المحتوى

delay —— تطبيع تأخير الإظهار والإخفاء

يحتاج tooltip إلى «ظهور فوري عند مرور المؤشر، وبقاء لحظة بعد إبعاده» (تجنب الوميض أثناء العبور)؛ ويحتاج popconfirm إلى «ظهور فوري عند النقر». لكل مكوّن طبقة منبثقة إيقاعه الخاص في الإظهار والإخفاء، ولكن أمر «أي قيمة افتراضية تُستخدم حين لا يمررها المستخدم» هو أمر مشترك بينها.

  • طبقات منبثقة من نوع التحويم مثل tooltip / popover / popconfirm، تُعرِض props كل من show-delay / hide-delay.
  • أي معامل زمني «يمكن للمستخدم تجاوزه، وله قيمة افتراضية معقولة».

لا ينبغي استخدامه: في سيناريوهات التوقيت الثابت (الإغلاق التلقائي لـ message بعد 3 ثوانٍ) اكتب ثابتًا مباشرة، بلا حاجة إلى التطبيع.

import { resolveDelay, type LhDefaultDelay } from '@lh-ui/share/core/shared/delay'
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» مرة أخرى.

أمران يُخلط بينهما بسهولة:

resolveDelay debounce (utils)
الدلالة تطبيع معاملات «كم الانتظار قبل الإظهار / الإخفاء هذه المرة» أداة تضييق تُجمِّع الاستدعاءات عالية التردد في تنفيذ واحد
الاستخدام حساب قيمة التأخير أخذ قيمة التأخير لتغليف مؤقت حقيقي

المسار النموذجي هو تسلسل طردي: const { hide } = resolveDelay(props.hideDelay, undefined, DEFAULTS) ← hideTimer = debounce(actualHide, hide).

// داخل مكوّن popover
const 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)
}
  • تطبيع بالرجوع فقط، بلا حدّ: تُمرَّر قيمة التأخير السالبة كما هي. فإن احتجت طبقة واجهة المستخدم إلى «تأخير غير سالب حتمًا» فتعامل مع ذلك عند setTimeout(fn, Math.max(0, ms)) (فالـ setTimeout يعامل السالب على أنه 0، فلا تحدث مشكلة فعلية).
  • show / hide مستقلان: بعد التطبيع يبقى رقمين مستقلين، يستخدمهما المكوّن في مؤقتين منفصلين.
  • تُعيد كائنًا جديدًا: كل استدعاء يُعيد { show, hide } جديدًا، فيمكن تغليفه بأمان داخل غلاف تفاعلي.
@lh-ui/share/core/delay → resolveDelay( )
返回值
(填好参数后点运行)

Copyright © 2024-2026 FengMo WenXue