From 03043192ddf00f9a36b7454799a9152cd1b50a0b Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:13:45 +0800
Subject: [PATCH] 1
---
src/views/usStock/List.vue | 116 ++++++++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 96 insertions(+), 20 deletions(-)
diff --git a/src/views/usStock/List.vue b/src/views/usStock/List.vue
index ae12380..f07c340 100644
--- a/src/views/usStock/List.vue
+++ b/src/views/usStock/List.vue
@@ -49,8 +49,8 @@
'text-up': item.changeRatio > 0,
'text-down': item.changeRatio <= 0,
}">{{ item.changeRatio ? `${item.changeRatio}%` : item.changeRatio === 0 ? 0
- :
- '--' }}</p>
+ :
+ '--' }}</p>
</div>
</div>
<div class="divider mt-10"></div>
@@ -115,7 +115,7 @@
</div>
<div class="divider"></div>
<div class="all-etf-ranking">
- <p class="title">{{ t('WellUSstocks') }}</p>
+ <p class="title">{{ t('涨幅榜') }}</p>
<div class="etf-table">
<ul>
<li class="title-line">
@@ -131,7 +131,7 @@
</div>
</div>
</li>
- <li v-for="(item, index) in prominentListData.slice(0, 5)" :key="item.symbol" @click="itemClick(item)">
+ <li v-for="(item) in prominentListData.slice(0, 5)" :key="item.symbol" @click="itemClick(item)">
<div class="flex-l">
<p>{{ item.name }}</p>
<p class="gray-text">
@@ -151,7 +151,7 @@
</li>
</ul>
</div>
- <div class="more-box" @click="moreOpen(0, t('WellUSstocks'), 'prominent')">
+ <div class="more-box" @click="moreOpen(0, t('涨幅榜'), 'prominent')">
<div class="icon-group">
<p class="">{{ t('更多') }}</p>
<img src="@/assets/image/quotes/right-arrow-grey.png" alt="" class="icon arrow">
@@ -186,7 +186,8 @@
</div>
</li>
- <li v-for="(item, index) in technologyListData.slice(0, 5)" :key="item.symbol" @click="itemClick(item)">
+ <li v-for="(item, index) in technologyListData.slice(0, 5)" :key="item.symbol"
+ @click="itemClick(item)">
<div class="flex-l">
<p>{{ item.name }}</p>
<p class="gray-text">
@@ -234,7 +235,8 @@
</div>
</div>
</li>
- <li v-for="(item, index) in dinancialListData.slice(0, 5)" :key="item.symbol" @click="itemClick(item)">
+ <li v-for="(item, index) in dinancialListData.slice(0, 5)" :key="item.symbol"
+ @click="itemClick(item)">
<div class="flex-l">
<p>{{ item.name }}</p>
<p class="gray-text">
@@ -282,7 +284,8 @@
</div>
</div>
</li>
- <li v-for="(item, index) in healthcareListData.slice(0, 5)" :key="item.symbol" @click="itemClick(item)">
+ <li v-for="(item, index) in healthcareListData.slice(0, 5)" :key="item.symbol"
+ @click="itemClick(item)">
<div class="flex-l">
<p>{{ item.name }}</p>
<p class="gray-text">
@@ -508,6 +511,7 @@
const isZh = language == "zh-CN" || language == "CN"
const isLoading = ref(false)
const initObjData = ref({})
+const sockets = ref(null)
const props = defineProps({
index: {
type: Number,
@@ -521,23 +525,26 @@
onMounted(async () => {
getNewsList()
- getRealtimeByType()
- publicRealtimeTop()
- letMeGo()
+ await getRealtimeByType()
+ await publicRealtimeTop()
+ await startStocksSocket()
+ // letMeGo() // 取消美股的轮询请求,通过ws来获取最新的数据
nextTick(() => {
renderFundChart(linesData)
})
})
-const emit = defineEmits(['changeLetMego'])
-const letMeGo = () => {
- emit('changeLetMego', () => {
- getRealtimeByType()
- publicRealtimeTop()
- })
-}
+// 轮询相关
+// const emit = defineEmits(['changeLetMego'])
+// const letMeGo = () => {
+// emit('changeLetMego', () => {
+// getRealtimeByType()
+// publicRealtimeTop()
+// })
+// }
onBeforeUnmount(() => {
fundChart && fundChart.dispose()
+ sockets.value && sockets.value.close()
})
const renderFundChart = (_rawData) => {
@@ -639,6 +646,7 @@
type: 'US-stocks',
}).then(data => {
indexCardInfo.value = data.slice(0, 3) || []
+ initObjData.value = data[0]
}).catch((e) => {
})
@@ -659,8 +667,75 @@
energyListData.value = data.filter(item => item.category.indexOf('energy') > -1) || []
manufacturingListData.value = data.filter(item => item.category.indexOf('manufacturing') > -1) || []
chineseListData.value = data.filter(item => item.category.indexOf('chinese') > -1) || []
- initObjData.value = data[0]
+ // initObjData.value = data[0]
})
+}
+
+// 去除字符串中的 % 符号
+const removePercentSign = (str) => {
+ if (typeof str === 'string' && str.includes('%')) {
+ return str.replace(/%/g, '')
+ }
+ return str
+}
+
+const startStocksSocket = () => {
+ sockets.value = new WebSocket(`wss://ws.sceazy.com/websocket-server`)
+ sockets.value.onmessage = (evt) => {
+ const { data } = evt
+ const _data = JSON.parse(data)
+
+ // 处理 pcp 值,去除 % 符号
+ const pcpValue = removePercentSign(_data.pcp)
+
+ let upData = prominentListData.value.find(item => item.pid == _data.pid);
+ if (upData) {
+ upData.changeRatio = pcpValue;
+ upData.close = _data.last;
+ }
+
+ let upData1 = technologyListData.value.find(item => item.pid == _data.pid);
+ if (upData1) {
+ upData1.changeRatio = pcpValue;
+ upData1.close = _data.last;
+ }
+
+ let upData2 = dinancialListData.value.find(item => item.pid == _data.pid);
+ if (upData2) {
+ upData2.changeRatio = pcpValue;
+ upData2.close = _data.last;
+ }
+
+ let upData3 = healthcareListData.value.find(item => item.pid == _data.pid);
+ if (upData3) {
+ upData3.changeRatio = pcpValue;
+ upData3.close = _data.last;
+ }
+
+ let upData4 = energyListData.value.find(item => item.pid == _data.pid);
+ if (upData4) {
+ upData4.changeRatio = pcpValue;
+ upData4.close = _data.last;
+ }
+
+ let upData5 = manufacturingListData.value.find(item => item.pid == _data.pid);
+ if (upData5) {
+ upData5.changeRatio = pcpValue;
+ upData5.close = _data.last;
+ }
+
+ let upData6 = chineseListData.value.find(item => item.pid == _data.pid);
+ if (upData6) {
+ upData6.changeRatio = pcpValue;
+ upData6.close = _data.last;
+ }
+
+ let upData7 = indexCardInfo.value.find(item => item.pid == _data.pid);
+ if (upData7) {
+ upData7.changeRatio = pcpValue;
+ upData7.close = _data.last;
+ }
+ }
}
const onRoute = (path) => {
@@ -682,6 +757,7 @@
}
})
</script>
+
<style lang="scss" scoped>
.loading-box-us {
position: absolute;
@@ -1086,7 +1162,7 @@
flex: 1;
align-self: center;
text-align: center;
-
+
&:last-child {
text-align: right;
}
--
Gitblit v1.9.3