refactor(useMarketData): 优化数据获取逻辑

This commit is contained in:
zdl
2025-12-16 15:24:00 +08:00
parent 3d6d01964d
commit 59f4b1cdb9

View File

@@ -1,7 +1,7 @@
// src/views/Company/components/MarketDataView/hooks/useMarketData.ts // src/views/Company/components/MarketDataView/hooks/useMarketData.ts
// MarketDataView 数据获取 Hook // MarketDataView 数据获取 Hook
import { useState, useEffect, useCallback } from 'react'; import { useState, useEffect, useCallback, useRef } from 'react';
import { logger } from '@utils/logger'; import { logger } from '@utils/logger';
import { marketService } from '../services/marketService'; import { marketService } from '../services/marketService';
import { DEFAULT_PERIOD } from '../constants'; import { DEFAULT_PERIOD } from '../constants';
@@ -28,6 +28,7 @@ export const useMarketData = (
): UseMarketDataReturn => { ): UseMarketDataReturn => {
// 主数据状态 // 主数据状态
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [tradeLoading, setTradeLoading] = useState(false);
const [summary, setSummary] = useState<MarketSummary | null>(null); const [summary, setSummary] = useState<MarketSummary | null>(null);
const [tradeData, setTradeData] = useState<TradeDayData[]>([]); const [tradeData, setTradeData] = useState<TradeDayData[]>([]);
const [fundingData, setFundingData] = useState<FundingDayData[]>([]); const [fundingData, setFundingData] = useState<FundingDayData[]>([]);
@@ -40,6 +41,11 @@ export const useMarketData = (
const [minuteData, setMinuteData] = useState<MinuteData | null>(null); const [minuteData, setMinuteData] = useState<MinuteData | null>(null);
const [minuteLoading, setMinuteLoading] = useState(false); const [minuteLoading, setMinuteLoading] = useState(false);
// 记录是否已完成首次加载
const isInitializedRef = useRef(false);
// 记录上一次的 stockCode用于判断是否需要重新加载所有数据
const prevStockCodeRef = useRef(stockCode);
/** /**
* 加载所有市场数据 * 加载所有市场数据
*/ */
@@ -159,6 +165,50 @@ export const useMarketData = (
} }
}, [stockCode]); }, [stockCode]);
/**
* 单独刷新日K线数据只刷新交易数据和涨幅分析
* 用于切换时间周期时,避免重新加载所有数据
*/
const refreshTradeData = useCallback(async () => {
if (!stockCode) return;
logger.debug('useMarketData', '刷新日K线数据', { stockCode, period });
setTradeLoading(true);
try {
// 并行获取交易数据和涨幅分析
const [tradeRes, riseAnalysisRes] = await Promise.all([
marketService.getTradeData(stockCode, period),
marketService.getRiseAnalysis(stockCode),
]);
// 更新交易数据
if (tradeRes.success && tradeRes.data) {
setTradeData(tradeRes.data);
// 重建涨幅分析映射
if (riseAnalysisRes.success && riseAnalysisRes.data) {
const tempAnalysisMap: Record<number, RiseAnalysis> = {};
riseAnalysisRes.data.forEach((analysis) => {
const dateIndex = tradeRes.data.findIndex(
(item) => item.date.substring(0, 10) === analysis.trade_date
);
if (dateIndex !== -1) {
tempAnalysisMap[dateIndex] = analysis;
}
});
setAnalysisMap(tempAnalysisMap);
}
}
logger.info('useMarketData', '日K线数据刷新成功', { stockCode, period });
} catch (error) {
logger.error('useMarketData', 'refreshTradeData', error, { stockCode, period });
} finally {
setTradeLoading(false);
}
}, [stockCode, period]);
/** /**
* 刷新所有数据 * 刷新所有数据
*/ */
@@ -166,16 +216,30 @@ export const useMarketData = (
await Promise.all([loadMarketData(), loadMinuteData()]); await Promise.all([loadMarketData(), loadMinuteData()]);
}, [loadMarketData, loadMinuteData]); }, [loadMarketData, loadMinuteData]);
// 监听股票代码和周期变化,自动加载数据 // 监听股票代码变化,加载所有数据(首次加载或切换股票)
useEffect(() => { useEffect(() => {
if (stockCode) { if (stockCode) {
loadMarketData(); // stockCode 变化时,加载所有数据
loadMinuteData(); if (stockCode !== prevStockCodeRef.current || !isInitializedRef.current) {
loadMarketData();
loadMinuteData();
prevStockCodeRef.current = stockCode;
isInitializedRef.current = true;
}
} }
}, [stockCode, period, loadMarketData, loadMinuteData]); }, [stockCode, loadMarketData, loadMinuteData]);
// 监听时间周期变化只刷新日K线数据
useEffect(() => {
// 只有在已初始化后period 变化时才单独刷新交易数据
if (stockCode && isInitializedRef.current) {
refreshTradeData();
}
}, [period, refreshTradeData, stockCode]);
return { return {
loading, loading,
tradeLoading,
summary, summary,
tradeData, tradeData,
fundingData, fundingData,
@@ -187,6 +251,7 @@ export const useMarketData = (
analysisMap, analysisMap,
refetch, refetch,
loadMinuteData, loadMinuteData,
refreshTradeData,
}; };
}; };