refactor(useMarketData): 优化数据获取逻辑
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
// src/views/Company/components/MarketDataView/hooks/useMarketData.ts
|
||||
// MarketDataView 数据获取 Hook
|
||||
|
||||
import { useState, useEffect, useCallback } from 'react';
|
||||
import { useState, useEffect, useCallback, useRef } from 'react';
|
||||
import { logger } from '@utils/logger';
|
||||
import { marketService } from '../services/marketService';
|
||||
import { DEFAULT_PERIOD } from '../constants';
|
||||
@@ -28,6 +28,7 @@ export const useMarketData = (
|
||||
): UseMarketDataReturn => {
|
||||
// 主数据状态
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [tradeLoading, setTradeLoading] = useState(false);
|
||||
const [summary, setSummary] = useState<MarketSummary | null>(null);
|
||||
const [tradeData, setTradeData] = useState<TradeDayData[]>([]);
|
||||
const [fundingData, setFundingData] = useState<FundingDayData[]>([]);
|
||||
@@ -40,6 +41,11 @@ export const useMarketData = (
|
||||
const [minuteData, setMinuteData] = useState<MinuteData | null>(null);
|
||||
const [minuteLoading, setMinuteLoading] = useState(false);
|
||||
|
||||
// 记录是否已完成首次加载
|
||||
const isInitializedRef = useRef(false);
|
||||
// 记录上一次的 stockCode,用于判断是否需要重新加载所有数据
|
||||
const prevStockCodeRef = useRef(stockCode);
|
||||
|
||||
/**
|
||||
* 加载所有市场数据
|
||||
*/
|
||||
@@ -159,6 +165,50 @@ export const useMarketData = (
|
||||
}
|
||||
}, [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()]);
|
||||
}, [loadMarketData, loadMinuteData]);
|
||||
|
||||
// 监听股票代码和周期变化,自动加载数据
|
||||
// 监听股票代码变化,加载所有数据(首次加载或切换股票)
|
||||
useEffect(() => {
|
||||
if (stockCode) {
|
||||
// stockCode 变化时,加载所有数据
|
||||
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 {
|
||||
loading,
|
||||
tradeLoading,
|
||||
summary,
|
||||
tradeData,
|
||||
fundingData,
|
||||
@@ -187,6 +251,7 @@ export const useMarketData = (
|
||||
analysisMap,
|
||||
refetch,
|
||||
loadMinuteData,
|
||||
refreshTradeData,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user