我用了一個計時器,我想問你我應該用 useMemo 和 callback 包裝它嗎?
沒有:
const [time, setTime] = useState();
const calculateInitialDuration = (endDate: string, today: Date): CountdownResult => {
const futureDate = new Date(endDate)
const days = differenceInDays(futureDate, today)
const hours = differenceInHours(futureDate, today) % 24
const minutes = differenceInMinutes(futureDate, today) % 60
const seconds = differenceInSeconds(futureDate, today) % 60
return { days, hours, minutes, seconds }
}
useEffect(() => {
const timer = setInterval(() =>
setTime(calculateInitialDuration(expire_date, new Date())), 1000);
return () => clearInterval(timer);
})
帶備忘錄
const calculateInitialDuration = useCallback(() => {
const days = calcDay;
const hours = calcHours;
const minutes = calcMinute;
const seconds = calcSeconds;
return { days, hours, minutes, seconds };
}, [time]);
const calcDay = useMemo(() => (differenceInDays(new Date(expire_date), new Date())), [time]);
const calcHours = useMemo(() => (differenceInHours(new Date(expire_date), new Date()) % 24), [time]);
const calcMinute = useMemo(() => (differenceInMinutes(new Date(expire_date), new Date()) % 60), [time]);
const calcSeconds = useMemo(() => (differenceInSeconds(new Date(expire_date), new Date()) % 60), [time]);
那么是否有必要用 memo 包裝所有計算,或者我應該使用沒有 useMemo 的簡單?
第二個問題它不會失去 1 秒,有時它會失去 2 秒
uj5u.com熱心網友回復:
嘗試在瀏覽器中實作不同的確切時間并不是一個好主意。setInterval/setTimeout 只能保證您的函式被呼叫的最短時間。至于記憶:通常建議使用它 - 使用它進行繁重的計算,或者如果您將一些變數作為道具傳遞給另一個組件。例如:
const memoized = useMemo(() => {....}, [])
return <SomeComponent prop={memoized}/>
除非您處于上述情況之一并且存在明顯的性能問題,否則使用不必要的記憶可能最終會降低性能。
uj5u.com熱心網友回復:
如果您嘗試計算日期差異,您不希望它來自呼叫該方法的特定實體嗎?
IE 不是每次呼叫都使用,而是每次呼叫都傳入然后傳入new Date()不是更有意義嗎?Date now = new Date();now
至少,這會在幾秒鐘內消除損失,不是嗎?
編輯:意識到這個問題與反應有關,不幸的是我不熟悉。如果這個答案在某種程度上是正確的,那就太棒了。否則,很抱歉浪費您的時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/464902.html
標籤:javascript 反应 反应式
上一篇:如何使用堆疊螢屏headerLeft和headerRight導航反應本機頁面?
下一篇:如何使用異步存盤讀取json資料
