refactor(useMarketData): 优化数据获取逻辑
This commit is contained in:
@@ -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,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user