From 59f4b1cdb932a5d3535941e91a39525829dab1d4 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Tue, 16 Dec 2025 15:24:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor(useMarketData):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MarketDataView/hooks/useMarketData.ts | 75 +++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/src/views/Company/components/MarketDataView/hooks/useMarketData.ts b/src/views/Company/components/MarketDataView/hooks/useMarketData.ts index 55247658..db27106f 100644 --- a/src/views/Company/components/MarketDataView/hooks/useMarketData.ts +++ b/src/views/Company/components/MarketDataView/hooks/useMarketData.ts @@ -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(null); const [tradeData, setTradeData] = useState([]); const [fundingData, setFundingData] = useState([]); @@ -40,6 +41,11 @@ export const useMarketData = ( const [minuteData, setMinuteData] = useState(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 = {}; + 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) { - loadMarketData(); - loadMinuteData(); + // 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, }; };