|
|
@@ -1,8 +1,92 @@
|
|
|
<template>
|
|
|
- <app-view>
|
|
|
-
|
|
|
+ <app-view class="market-detail">
|
|
|
+ <template #header>
|
|
|
+ <app-navbar title="商品详情" />
|
|
|
+ </template>
|
|
|
+ <div class="market-detail__quote" v-if="quote">
|
|
|
+ <ul>
|
|
|
+ <li>
|
|
|
+ <span>{{ quote.last }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>卖价</span>
|
|
|
+ <span>{{ quote.ask }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>开盘</span>
|
|
|
+ <span>{{ quote.opened }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>{{ handleNumberValue(quote.rise.toFixed(quote.decimalplace)) }}</span>
|
|
|
+ <span>{{ parsePercent(quote.change) }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>买价</span>
|
|
|
+ <span>{{ quote.bid }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>均价</span>
|
|
|
+ <span>{{ }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>昨结</span>
|
|
|
+ <span>{{ quote.presettle }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>最高</span>
|
|
|
+ <span>{{ quote.highest }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>结算</span>
|
|
|
+ <span>{{ }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>昨收</span>
|
|
|
+ <span>{{ }}</span>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <span>最低</span>
|
|
|
+ <span>{{ quote.lowest }}</span>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <Tabs v-model:active="active">
|
|
|
+ <template v-for="(item, index) in getChartCycleTypeList()" :key="index">
|
|
|
+ <Tab :title="item.label" :name="item.value" />
|
|
|
+ </template>
|
|
|
+ </Tabs>
|
|
|
+ <component :is="componentMap.get('echartsTimeline')" v-bind="{ goodscode }" v-if="active === ChartCycleType.Time" />
|
|
|
+ <component :is="componentMap.get('echartsKline')" v-bind="{ goodscode, cycleType: active }" v-else />
|
|
|
</app-view>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
-</script>
|
|
|
+import { shallowRef, onMounted, onUnmounted, defineAsyncComponent } from 'vue'
|
|
|
+import { Tab, Tabs } from 'vant'
|
|
|
+import { parsePercent, handleNumberValue } from '@/filters'
|
|
|
+import { getChartCycleTypeList, ChartCycleType } from '@/constants/chart'
|
|
|
+import { useNavigation } from '@/hooks/navigation'
|
|
|
+import { useFuturesStore } from '@/stores'
|
|
|
+import quoteSocket from '@/services/websocket/quote'
|
|
|
+
|
|
|
+const componentMap = new Map<string, unknown>([
|
|
|
+ ['echartsTimeline', defineAsyncComponent(() => import('@mobile/components/modules/echarts-timeline/index.vue'))],
|
|
|
+ ['echartsKline', defineAsyncComponent(() => import('@mobile/components/modules/echarts-kline/index.vue'))]
|
|
|
+])
|
|
|
+
|
|
|
+const { getQueryString } = useNavigation()
|
|
|
+const futuresStore = useFuturesStore()
|
|
|
+const goodscode = getQueryString('goodscode')
|
|
|
+const active = shallowRef(ChartCycleType.Time)
|
|
|
+
|
|
|
+const quote = futuresStore.getQuoteInfo(goodscode)
|
|
|
+const subscribe = quoteSocket.addSubscribe([goodscode])
|
|
|
+
|
|
|
+onMounted(() => subscribe.start())
|
|
|
+
|
|
|
+onUnmounted(() => subscribe.stop())
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less">
|
|
|
+@import './index.less';
|
|
|
+</style>
|