From 416ef077b916de27c88439d2fb679691e85df743 Mon Sep 17 00:00:00 2001
From: 李凌 <344137771@qq.com>
Date: Fri, 12 Jun 2026 16:40:53 +0800
Subject: [PATCH] 1

---
 src/page/kline/index.vue            |   12 ++++-
 src/page/kline/components/kLine.vue |   95 ++++++++++++++++++++++++++++-------------------
 2 files changed, 65 insertions(+), 42 deletions(-)

diff --git a/src/page/kline/components/kLine.vue b/src/page/kline/components/kLine.vue
index 7e75569..d9e16f9 100644
--- a/src/page/kline/components/kLine.vue
+++ b/src/page/kline/components/kLine.vue
@@ -46,6 +46,19 @@
   HQChart.Chart.MARKET_SUFFIX_NAME.GetMarketStatus = function(symbol) {
     return 2;
   }; // 一直交易
+
+  // HQChart 各数据接口均需纳入轮询(IsAutoUpdate 无效);切换 tab 后通常只触发历史类请求
+  const POLL_REQUEST_TYPES = new Set([
+    "MinuteChartContainer::RequestMinuteData",
+    "MinuteChartContainer::RequestHistoryMinuteData",
+    "KLineChartContainer::RequestHistoryData",
+    "KLineChartContainer::RequestRealtimeData",
+    "KLineChartContainer::RequestFlowCapitalData",
+    "KLineChartContainer::ReqeustHistoryMinuteData",
+    "KLineChartContainer::RequestMinuteRealtimeData",
+  ]);
+  const REFRESH_INTERVAL = 10000;
+
   function DefaultData() {}
 
   DefaultData.GetMinuteOption = function() {
@@ -60,7 +73,7 @@
       ],
 
       Symbol: "AAPL.usa",
-      IsAutoUpdate: true, // 是自动更新数据
+      IsAutoUpdate: false,
       AutoUpdateFrequency: 20000,
       DayCount: 1, // 1 最新交易日数据 >1 多日走势图
       IsShowRightMenu: false, // 是否显示右键菜单
@@ -894,7 +907,7 @@
         // { Index: 'MACD', Modify: true, Change: true, Close: false }
       ],
       Symbol: "600015.sh",
-      IsAutoUpdate: true, // 是自动更新数据
+      IsAutoUpdate: false,
       AutoUpdateFrequency: 15000,
       IsApiPeriod: true,
       IsShowRightMenu: false, // 是否显示右键菜单
@@ -1074,7 +1087,8 @@
 
         VolChartHeight: 10,
         chartType: "kline",
-        timerss: null,
+        refreshHandlers: {},
+        refreshTimer: null,
         isShow: false,
         xData: [],
       };
@@ -1128,13 +1142,10 @@
       // 自适应K线图
       var elementResizeDetectorMaker = require("element-resize-detector");
 
-      // 创建实例,无参数
-      var erd = elementResizeDetectorMaker(); // 使用默认选项(将使用基于对象的方法)。
-
       // 创建实例带参数
       // 使用基于超快速滚动的方法。
       // 这是推荐的策略。
-      elementResizeDetectorMaker({
+      this.erd = elementResizeDetectorMaker({
         // var erdUltraFast = elementResizeDetectorMaker({
         strategy: "scroll",
         callOnAdd: true, // callOnAdd选项,用于确定在添加侦听器时是否应调用它们。默认为true。
@@ -1146,7 +1157,7 @@
       var self = this;
       // 侦听元素的调整大小事件,并使用元素作为调整大小事件的参数来调用侦听器函数。传递给函数的选项将
       // 覆盖实例选项
-      erd.listenTo(this.$refs["rightContent"], function(element) {
+      this.erd.listenTo(this.$refs["rightContent"], function(element) {
         var width = element.offsetWidth;
         var height = element.offsetHeight;
         self.tableHeight = height - 10; // 将监听到的宽高进行赋值
@@ -1156,10 +1167,36 @@
       });
     },
     beforeDestroy() {
-      clearInterval(this.timerss); // 在组件销毁前清除定时器
-      this.timerss = null
+      this.stopRefreshTimer();
+      if (this.erd && this.$refs.rightContent) {
+        this.erd.uninstall(this.$refs.rightContent);
+        this.erd = null;
+      }
+      window.onresize = null;
     },
     methods: {
+      resetRefreshHandlers() {
+        this.refreshHandlers = {};
+      },
+
+      startRefreshTimer() {
+        if (this.refreshTimer) {
+          return;
+        }
+        this.refreshTimer = setInterval(() => {
+          Object.values(this.refreshHandlers).forEach(({ data, callback }) => {
+            EastMoney.HQData.NetworkFilter(data, callback);
+          });
+        }, REFRESH_INTERVAL);
+      },
+
+      stopRefreshTimer() {
+        if (this.refreshTimer) {
+          clearInterval(this.refreshTimer);
+          this.refreshTimer = null;
+        }
+        this.refreshHandlers = {};
+      },
 
       OnSize() {
         var width = this.$refs.right.clientWidth;
@@ -1248,6 +1285,7 @@
         this.IsShowRightMenu = isShowRightMenu;
 
         this.Symbol = symbol;
+        this.resetRefreshHandlers();
         this.Chart.ChangeSymbol(this.Symbol);
         this.KLineChart.ChangeSymbol(this.Symbol);
       },
@@ -1269,6 +1307,7 @@
         //分时额外处理才注释的
         this.chartType = type;
         this.KLinePeriodIndex = index;
+        this.resetRefreshHandlers();
         this.KLineChart.ChangePeriod(item.ID);
       },
 
@@ -1277,6 +1316,7 @@
         item // K线复权
       ) {
         this.KLineRightIndex = index;
+        this.resetRefreshHandlers();
         this.KLineChart.ChangeRight(item.ID);
       },
 
@@ -1299,37 +1339,14 @@
         callback // 第3方数据替换接口
       ) {
         EastMoney.HQData.Log("[HQChartDemo::NetworkFilter] data", data);
-        // console.log(data.Name,123123);
         EastMoney.HQData.NetworkFilter(data, callback);
-        this.timerss = setInterval(() => {
-          switch (data.Name) {
-            // 分时图数据对接
-            case "MinuteChartContainer::RequestMinuteData":
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
-            case "MinuteChartContainer::RequestHistoryMinuteData":
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
 
-            case "KLineChartContainer::RequestHistoryData": // 日线全量数据下载
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
-            case "KLineChartContainer::RequestRealtimeData": // 日线实时数据更新
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
-            case "KLineChartContainer::RequestFlowCapitalData": // 流通股本
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
-            case "KLineChartContainer::ReqeustHistoryMinuteData": // 分钟全量数据下载
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
-            case "KLineChartContainer::RequestMinuteRealtimeData": // 分钟增量数据更新
-              EastMoney.HQData.NetworkFilter(data, callback);
-              break;
-          }
-        }, 10000);
-
-
+        if (!POLL_REQUEST_TYPES.has(data.Name)) {
+          return;
+        }
+        // 始终更新为最新 callback,避免切换 tab 后仍用旧周期参数轮询
+        this.refreshHandlers[data.Name] = { data, callback };
+        this.startRefreshTimer();
       },
 
       handleSelect(key, keyPath) {
diff --git a/src/page/kline/index.vue b/src/page/kline/index.vue
index 1d0ecc9..7678659 100644
--- a/src/page/kline/index.vue
+++ b/src/page/kline/index.vue
@@ -494,13 +494,19 @@
     this.getNohknews();
   },
   beforeDestroy() {
-    this.clearInterval(this.timer); // 在组件销毁前清除定时器
+    this.clearStockTimer();
   },
   // beforeDestroy() {
   //   this.Klinetype = false;
   //   window.clearInterval()
   // },
   methods: {
+    clearStockTimer() {
+      if (this.timer) {
+        clearInterval(this.timer);
+        this.timer = null;
+      }
+    },
     async getHknews() {
       await api.queryIndexNews().then((res) => {
         if (res.status === 0) {
@@ -649,7 +655,7 @@
       }
     },
     handleBackaa() {
-      clearInterval(this.timer);
+      this.clearStockTimer();
       window.localStorage.removeItem("kLine");
       this.$router.go(-1);
     },
@@ -665,7 +671,7 @@
       });
     },
     goBuy(index) {
-      clearInterval(this.timer);
+      this.clearStockTimer();
       this.$router.push({
         path: "/TradingBuy",
         query: {

--
Gitblit v1.9.3