@@ -22,7 +22,13 @@ const macroTask = (fn: VoidFunction, times = 1) => {
2222 * Trigger by latest open call, if nextOpen is undefined, means toggle.
2323 * ignoreNext will skip next call in the macro task queue.
2424 */
25- export type TriggerOpenType = ( nextOpen ?: boolean , ignoreNext ?: boolean ) => void ;
25+ export type TriggerOpenType = (
26+ nextOpen ?: boolean ,
27+ config ?: {
28+ ignoreNext ?: boolean ;
29+ lazy ?: boolean ;
30+ } ,
31+ ) => void ;
2632
2733/**
2834 * When `open` is controlled, follow the controlled value;
@@ -61,30 +67,34 @@ export default function useOpen(
6167 internalSetOpen ( nextOpen ) ;
6268 } ) ;
6369
64- const toggleOpen = useEvent < TriggerOpenType > ( ( nextOpen ?: boolean , ignoreNext = false ) => {
70+ const toggleOpen = useEvent < TriggerOpenType > ( ( nextOpen , config = { } ) => {
71+ const { ignoreNext = false , lazy = false } = config ;
72+
6573 taskIdRef . current += 1 ;
6674 const id = taskIdRef . current ;
6775
6876 const nextOpenVal = typeof nextOpen === 'boolean' ? nextOpen : ! mergedOpen ;
6977
7078 // Since `mergedOpen` is post-processed, we need to check if the value really changed
71- if ( nextOpenVal ) {
72- triggerEvent ( true ) ;
73-
74- // Lock if needed
75- if ( ignoreNext ) {
76- taskLockRef . current = ignoreNext ;
77-
78- macroTask ( ( ) => {
79- taskLockRef . current = false ;
80- } , 2 ) ;
79+ if ( nextOpenVal || ! lazy ) {
80+ if ( ! taskLockRef . current ) {
81+ triggerEvent ( nextOpenVal ) ;
82+
83+ // Lock if needed
84+ if ( ignoreNext ) {
85+ taskLockRef . current = ignoreNext ;
86+
87+ macroTask ( ( ) => {
88+ taskLockRef . current = false ;
89+ } , 2 ) ;
90+ }
8191 }
8292 return ;
8393 }
8494
8595 macroTask ( ( ) => {
8696 if ( id === taskIdRef . current && ! taskLockRef . current ) {
87- triggerEvent ( false ) ;
97+ triggerEvent ( nextOpenVal ) ;
8898 }
8999 } ) ;
90100 } ) ;
0 commit comments