diff --git a/src/useEscKeyDown.ts b/src/useEscKeyDown.ts index 79c022e..0044231 100644 --- a/src/useEscKeyDown.ts +++ b/src/useEscKeyDown.ts @@ -3,7 +3,7 @@ import { type EscCallback } from './Portal'; import useId from '@rc-component/util/lib/hooks/useId'; import { useEvent } from '@rc-component/util'; -let stack: string[] = []; +export let stack: string[] = []; // export for testing export default function useEscKeyDown(open: boolean, onEsc?: EscCallback) { const id = useId(); @@ -31,6 +31,7 @@ export default function useEscKeyDown(open: boolean, onEsc?: EscCallback) { window.addEventListener('keydown', handleEscKeyDown); return () => { + stack = stack.filter(item => item !== id); window.removeEventListener('keydown', handleEscKeyDown); }; }, [open, id]); diff --git a/tests/index.test.tsx b/tests/index.test.tsx index 72fa6a1..40b5eba 100644 --- a/tests/index.test.tsx +++ b/tests/index.test.tsx @@ -1,6 +1,7 @@ import { render, fireEvent } from '@testing-library/react'; import React from 'react'; import Portal from '../src'; +import { stack } from '../src/useEscKeyDown'; global.isOverflow = true; @@ -355,5 +356,17 @@ describe('Portal', () => { ); expect(onEscB).not.toHaveBeenCalled(); }); + + it('should clear stack when unmount', () => { + const { unmount } = render( + +
+ , + ); + + expect(stack).toHaveLength(1); + unmount(); + expect(stack).toHaveLength(0); + }); }); });