window resize use debounce

This commit is contained in:
Gabe Yuan
2023-08-16 22:13:07 +08:00
parent 21fcc11ac1
commit 7de712b2b0
3 changed files with 41 additions and 22 deletions

View File

@@ -35,3 +35,19 @@ export const matchValue = (arr, val) => {
*/ */
export const sleep = (delay) => export const sleep = (delay) =>
new Promise((resolve) => setTimeout(resolve, delay)); new Promise((resolve) => setTimeout(resolve, delay));
/**
* 防抖函数
* @param {*} func
* @param {*} delay
* @returns
*/
export const debounce = (func, delay = 200) => {
let timer;
return (...args) => {
timer && clearTimeout(timer);
timer = setTimeout(() => {
func(...args);
}, delay);
};
};

View File

@@ -82,21 +82,15 @@ export default function Draggable({
}); });
const [edgeTimer, setEdgeTimer] = useState(null); const [edgeTimer, setEdgeTimer] = useState(null);
const goEdge = useCallback(() => { const goEdge = useCallback((w, h, width, height) => {
console.log("goEdge"); setPosition((pre) => getEdgePosition(pre, w, h, width, height));
setPosition((pre) =>
getEdgePosition(pre, windowSize.w, windowSize.h, width, height)
);
setEdgeTimer( setEdgeTimer(
setTimeout(() => { setTimeout(() => {
console.log("goHide"); setPosition((pre) => getHidePosition(pre, w, h, width, height));
setPosition((pre) =>
getHidePosition(pre, windowSize.w, windowSize.h, width, height)
);
}, 2000) }, 2000)
); );
}, [windowSize.w, windowSize.h, width, height]); }, []);
const handlePointerDown = (e) => { const handlePointerDown = (e) => {
!isMobile && e.target.setPointerCapture(e.pointerId); !isMobile && e.target.setPointerCapture(e.pointerId);
@@ -132,7 +126,7 @@ export default function Draggable({
if (!snapEdge) { if (!snapEdge) {
return; return;
} }
goEdge(); goEdge(windowSize.w, windowSize.h, width, height);
}; };
const handleClick = (e) => { const handleClick = (e) => {
@@ -143,7 +137,7 @@ export default function Draggable({
e.stopPropagation(); e.stopPropagation();
if (snapEdge && position.hide) { if (snapEdge && position.hide) {
edgeTimer && clearTimeout(edgeTimer); edgeTimer && clearTimeout(edgeTimer);
goEdge(); goEdge(windowSize.w, windowSize.h, width, height);
} }
}; };
@@ -152,8 +146,8 @@ export default function Draggable({
if (!snapEdge) { if (!snapEdge) {
return; return;
} }
goEdge(); goEdge(windowSize.w, windowSize.h, width, height);
}, [snapEdge, goEdge]); }, [snapEdge, goEdge, windowSize.w, windowSize.h, width, height]);
const opacity = useMemo(() => { const opacity = useMemo(() => {
if (snapEdge) { if (snapEdge) {

View File

@@ -10,6 +10,7 @@ import Stack from "@mui/material/Stack";
import { useEffect, useState, useMemo, useCallback } from "react"; import { useEffect, useState, useMemo, useCallback } from "react";
import { StoragesProvider } from "../../hooks/Storage"; import { StoragesProvider } from "../../hooks/Storage";
import Popup from "../Popup"; import Popup from "../Popup";
import { debounce } from "../../libs/utils";
export default function Action({ translator }) { export default function Action({ translator }) {
const fabWidth = 40; const fabWidth = 40;
@@ -20,12 +21,16 @@ export default function Action({ translator }) {
}); });
const [moved, setMoved] = useState(false); const [moved, setMoved] = useState(false);
const handleWindowResize = (e) => { const handleWindowResize = useMemo(
setWindowSize({ () =>
w: document.documentElement.clientWidth, debounce(() => {
h: document.documentElement.clientHeight, setWindowSize({
}); w: document.documentElement.clientWidth,
}; h: document.documentElement.clientHeight,
});
}),
[]
);
const handleWindowClick = (e) => { const handleWindowClick = (e) => {
setShowPopup(false); setShowPopup(false);
@@ -41,10 +46,14 @@ export default function Action({ translator }) {
useEffect(() => { useEffect(() => {
window.addEventListener("resize", handleWindowResize); window.addEventListener("resize", handleWindowResize);
window.addEventListener("click", handleWindowClick);
return () => { return () => {
window.removeEventListener("resize", handleWindowResize); window.removeEventListener("resize", handleWindowResize);
};
}, [handleWindowResize]);
useEffect(() => {
window.addEventListener("click", handleWindowClick);
return () => {
window.removeEventListener("click", handleWindowClick); window.removeEventListener("click", handleWindowClick);
}; };
}, []); }, []);