R: Improve conditional hook performance
This commit is contained in:
parent
6be49f2752
commit
fdc432ed57
|
@ -4,10 +4,13 @@ import { useEffect } from 'react';
|
||||||
|
|
||||||
import { assertIsNode } from '@/utils/utils';
|
import { assertIsNode } from '@/utils/utils';
|
||||||
|
|
||||||
function useClickedOutside({ ref, callback }: { ref: React.RefObject<HTMLElement>; callback?: () => void }) {
|
function useClickedOutside(enabled: boolean, ref: React.RefObject<HTMLElement>, callback?: () => void) {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
if (!enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
function handleClickOutside(event: MouseEvent) {
|
function handleClickOutside(event: MouseEvent) {
|
||||||
console.log(1);
|
|
||||||
assertIsNode(event.target);
|
assertIsNode(event.target);
|
||||||
if (ref.current && !ref.current.contains(event.target)) {
|
if (ref.current && !ref.current.contains(event.target)) {
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
|
@ -17,7 +20,7 @@ function useClickedOutside({ ref, callback }: { ref: React.RefObject<HTMLElement
|
||||||
return () => {
|
return () => {
|
||||||
document.removeEventListener('mouseup', handleClickOutside);
|
document.removeEventListener('mouseup', handleClickOutside);
|
||||||
};
|
};
|
||||||
}, [ref, callback]);
|
}, [ref, callback, enabled]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default useClickedOutside;
|
export default useClickedOutside;
|
||||||
|
|
|
@ -8,7 +8,7 @@ function useDropdown() {
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
const ref = useRef(null);
|
const ref = useRef(null);
|
||||||
|
|
||||||
useClickedOutside({ ref, callback: () => setIsOpen(false) });
|
useClickedOutside(isOpen, ref, () => setIsOpen(false));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ref,
|
ref,
|
||||||
|
|
|
@ -77,7 +77,7 @@ function NodeContextMenu({
|
||||||
onHide();
|
onHide();
|
||||||
}, [onHide]);
|
}, [onHide]);
|
||||||
|
|
||||||
useClickedOutside({ ref, callback: handleHide });
|
useClickedOutside(isOpen, ref, handleHide);
|
||||||
|
|
||||||
useEffect(() => setIsOpen(true), []);
|
useEffect(() => setIsOpen(true), []);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user