From e5b00515d3c4520c78309d83492bc5b98c90f386 Mon Sep 17 00:00:00 2001 From: hzm <934585316@qq.com> Date: Thu, 19 Mar 2026 20:04:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=8A=A8=E7=94=BB=E5=BC=95=E8=B5=B7=E7=9A=84=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E6=AD=A3=E7=A1=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/components/GroupSummary.jsx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/components/GroupSummary.jsx b/app/components/GroupSummary.jsx index f7c9232..6b9848d 100644 --- a/app/components/GroupSummary.jsx +++ b/app/components/GroupSummary.jsx @@ -8,6 +8,8 @@ function CountUp({ value, prefix = '', suffix = '', decimals = 2, className = '' const [displayValue, setDisplayValue] = useState(value); const previousValue = useRef(value); const isFirstChange = useRef(true); + const rafIdRef = useRef(null); + const displayValueRef = useRef(value); useEffect(() => { if (previousValue.current === value) return; @@ -15,13 +17,14 @@ function CountUp({ value, prefix = '', suffix = '', decimals = 2, className = '' if (isFirstChange.current) { isFirstChange.current = false; previousValue.current = value; + displayValueRef.current = value; setDisplayValue(value); return; } - const start = previousValue.current; + const start = displayValueRef.current; const end = value; - const duration = 400; + const duration = 300; const startTime = performance.now(); const animate = (currentTime) => { @@ -29,16 +32,25 @@ function CountUp({ value, prefix = '', suffix = '', decimals = 2, className = '' const progress = Math.min(elapsed / duration, 1); const ease = 1 - Math.pow(1 - progress, 4); const current = start + (end - start) * ease; + displayValueRef.current = current; setDisplayValue(current); if (progress < 1) { - requestAnimationFrame(animate); + rafIdRef.current = requestAnimationFrame(animate); } else { previousValue.current = value; + rafIdRef.current = null; } }; - requestAnimationFrame(animate); + rafIdRef.current = requestAnimationFrame(animate); + + return () => { + if (rafIdRef.current != null) { + cancelAnimationFrame(rafIdRef.current); + rafIdRef.current = null; + } + }; }, [value]); return (