| | |
| | | <template> |
| | | <div class="quotes-market-page"> |
| | | <!-- Top Tabs --> |
| | | <div class="market-tabs market-tabs--single"> |
| | | <div class="tab-item active"> |
| | | {{ $t('加密货币') }} |
| | | <div class="market-tabs"> |
| | | <div class="tab-item" v-for="tab in marketTabs" :key="tab.value" |
| | | :class="{ active: activeTab === tab.value }" @click="switchTab(tab.value)"> |
| | | {{ $t(tab.label) }} |
| | | </div> |
| | | </div> |
| | | |
| | |
| | | <van-list v-model:loading="marketLoading" :finished="marketFinished" :immediate-check="false" |
| | | :scroll-target="marketListRef" :finished-text="$t('没有更多了') || '没有更多了'" @load="loadMoreMarket"> |
| | | <div class="pair-item" v-for="pair in tradingPairs" :key="pair.symbol" |
| | | @click="goToOptions(pair.symbol)"> |
| | | @click="goToOptions(pair.symbol, pair.type)"> |
| | | <div class="pair-header"> |
| | | <div class="pair-symbol"> |
| | | <img v-if="getPairIconUrl(pair)" :src="getPairIconUrl(pair)" alt="" |
| | | class="pair-symbol-icon" /> |
| | | {{ pair.symboltxt.toUpperCase() }} |
| | | {{ (pair.symboltxt || pair.symbol || '').toUpperCase() }} |
| | | </div> |
| | | <div class="pair-change" :class="pair.change >= 0 ? 'up' : 'down'"> |
| | | {{ pair.change >= 0 ? '+' : '' }}{{ pair.change.toFixed(4) }}% |
| | |
| | | const useStore = useUserStore() |
| | | const quotesStore = useQuotesStore() |
| | | |
| | | const activeTab = ref('crypto') |
| | | const activeTab = ref('cryptos') |
| | | const marketTabs = [ |
| | | { label: '加密货币', value: 'cryptos' }, |
| | | { label: '股票', value: 'US-stocks' }, |
| | | { label: 'ETF', value: 'indices' }, |
| | | { label: '外汇', value: 'forex' }, |
| | | ] |
| | | const tradingPairs = ref([]) |
| | | const interval = ref(null) |
| | | const marketPage = ref(1) |
| | |
| | | function getPairIconUrl(pair) { |
| | | if (!pair) return '' |
| | | const tab = activeTab.value |
| | | if (tab === 'US-stocks' || tab === 'indices') return '' |
| | | if (tab === 'optional' && (pair.type === 'US-stocks' || pair.type === 'indices')) return '' |
| | | return pair.iconImg ? `${IMG_PATH}/symbol/${pair.iconImg}.png` : '' |
| | | } |
| | | |
| | | function switchTab(tab) { |
| | | if (activeTab.value === tab) return |
| | | activeTab.value = tab |
| | | fetchData() |
| | | } |
| | | |
| | | // 根据当前价与涨跌幅生成小型 K 线数据,与首页一致 |
| | |
| | | |
| | | // 获取交易数据;pageNo 页码,append 是否追加 |
| | | const fetchTradingData = async (pageNo = 1, append = false) => { |
| | | const type = 'cryptos' |
| | | const type = activeTab.value |
| | | |
| | | try { |
| | | const params = { |
| | |
| | | const basePrice = parseFloat(item.close || item.lastPrice || 0) |
| | | const changeRatio = item.changeRatio || 0 |
| | | const symbolStr = item.symbol || '--' |
| | | const symboltxt = item.enName |
| | | const symboltxt = item.enName || item.name || symbolStr |
| | | const iconImg = item.symbol_data || (symbolStr.includes('/') ? symbolStr.split('/')[0].toLowerCase() : symbolStr.replace(/USDT$/i, '').toLowerCase()) || symbolStr.toLowerCase() |
| | | const klineData = generateMiniKlineData(basePrice, changeRatio) |
| | | const spread = basePrice * 0.0001 |
| | |
| | | |
| | | return { |
| | | symbol: symbolStr, |
| | | symboltxt: symboltxt, |
| | | symboltxt, |
| | | price: basePrice.toFixed(4), |
| | | change: changeRatio, |
| | | sellPrice: sellPrice, |
| | | buyPrice: buyPrice, |
| | | klineData: klineData, |
| | | symbol: symbolStr, |
| | | type: type, |
| | | iconImg: iconImg, |
| | | price: basePrice.toFixed(4), |
| | | change: changeRatio, |
| | | sellPrice: sellPrice, |
| | | buyPrice: buyPrice, |
| | | klineData: klineData |
| | | sellPrice, |
| | | buyPrice, |
| | | klineData, |
| | | type, |
| | | iconImg |
| | | } |
| | | }) |
| | | if (append) { |
| | |
| | | } |
| | | |
| | | // 跳转到交易页 Options,与首页一致:/trade/options?symbol=xxx&activeTab=xxx |
| | | function goToOptions(symbol) { |
| | | function goToOptions(symbol, type) { |
| | | if (!symbol) return |
| | | router.push({ |
| | | path: '/trade/options', |
| | | query: { symbol, activeTab: 'cryptos' } |
| | | query: { symbol, activeTab: type || activeTab.value } |
| | | }) |
| | | } |
| | | |