/** * 热点概览数据获取 Hook * 负责获取指数分时数据和概念异动数据 */ import { useState, useEffect, useCallback, useRef } from 'react'; import { logger } from '@utils/logger'; /** * @param {Date|null} selectedDate - 选中的交易日期 * @returns {Object} 数据和状态 */ export const useHotspotData = (selectedDate) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [data, setData] = useState(null); // 用于防止 React StrictMode 下的双重请求 const fetchingRef = useRef(false); const lastDateRef = useRef(null); const fetchData = useCallback(async (forceRefetch = false) => { // 获取日期字符串用于比较 const dateStr = selectedDate ? selectedDate.toISOString().split('T')[0] : 'today'; // 如果正在请求中,或者日期未变化且不是强制刷新,跳过 if (fetchingRef.current && !forceRefetch) { return; } if (lastDateRef.current === dateStr && data && !forceRefetch) { return; } fetchingRef.current = true; setLoading(true); setError(null); try { const dateParam = selectedDate ? `?date=${dateStr}` : ''; const response = await fetch(`/api/market/hotspot-overview${dateParam}`); const result = await response.json(); if (result.success) { setData(result.data); lastDateRef.current = dateStr; } else { setError(result.error || '获取数据失败'); } } catch (err) { logger.error('useHotspotData', 'fetchData', err); setError('网络请求失败'); } finally { setLoading(false); fetchingRef.current = false; } }, [selectedDate, data]); useEffect(() => { fetchData(); }, [fetchData]); return { loading, error, data, refetch: () => fetchData(true), }; }; export default useHotspotData;