From 8588fe30f17d0d28190a279aab8675de0dbf1a5b Mon Sep 17 00:00:00 2001
From: lxf <1371462558@qq.com>
Date: Wed, 16 Jul 2025 18:46:29 +0800
Subject: [PATCH] 个人添加图片
---
src/components/Transform/list-quotation/index.vue | 356 ++++++++++++++++++++++------------------------------------
1 files changed, 137 insertions(+), 219 deletions(-)
diff --git a/src/components/Transform/list-quotation/index.vue b/src/components/Transform/list-quotation/index.vue
index 4016eb9..1087cd5 100644
--- a/src/components/Transform/list-quotation/index.vue
+++ b/src/components/Transform/list-quotation/index.vue
@@ -1,261 +1,178 @@
<template>
<div class="list-quatation">
- <!-- <ex-tabs @tabs="onTabs"></ex-tabs> -->
<van-list>
- <!-- <van-cell>
- <div class="flex items-center w-full text-grey font-26">
- <p class="left text-left">
- <span>{{ $t('交易对') }}
- </span>
- </p>
- <p class="mid text-right">
- {{ $t('最新价') }}
- </p>
- <p class="right text-right">
- {{ active == 3 ? $t('成交额') : $t('24h涨跌幅') }}
- </p>
- </div>
- </van-cell> -->
<!-- 热门 -->
<div class="flex items-end justify-between" style="margin: 14px 0;">
- <div class="block text-22 font-medium" >{{$t('Market')}}</div>
+ <div class="block text-22 font-medium">{{ t('Market') }}</div>
<div class="relative text-13" @click="toggleDropdown">
- <div class="flex px-20 justify-between rounded-full bg-black text-white min-w-100 box-border">
- <div class="block">{{ $t(topTitle) }}</div>
- <van-icon name="play" style="align-content:center;transform: rotate(90deg);"/>
+ <div class="flex px-20 justify-between rounded-full bg-black text-white min-w-140 box-border">
+ <div class="block">{{ t(topTitle) }}</div>
+ <van-icon name="play" style="align-content:center;transform: rotate(90deg);" />
</div>
- <div class="px-16 py-20 bg-black text-white flex flex-col absolute min-w-100 box-border top-25 rounded-11 leading-28" style="z-index:999;margin-top: 0.8rem;" v-show="isTopShow">
- <div @click="changeType('币币交易', 1)">{{ $t('币币交易') }}</div>
- <div @click="changeType('外汇交割', 2)">{{ $t('外汇交割') }}</div>
- <!-- <div>期貨</div>
- <div>收藏</div> -->
+ <div
+ class="px-16 py-20 bg-black text-white flex flex-col absolute min-w-140 box-border top-25 rounded-11 leading-28"
+ style="z-index:999;margin-top: 0.8rem;" v-show="isTopShow">
+ <div @click="changeType(t('货币兑换'), 2)">{{ t('货币兑换') }}</div>
+ <div @click="changeType(t('外汇交易'), 1)">{{ t('外汇交易') }}</div>
</div>
</div>
</div>
<transition-group :name="type" tag="div">
- <div v-if="active == 0" :key="active">
- <van-cell v-for="item in listData" :key="item.id" style="background-color: #f0f0f0;margin-bottom: 10px;">
+ <div>
+ <van-cell v-for="item in showList" :key="item.id" style="background-color: #f0f0f0;margin-bottom: 10px;">
<ul class="flex justify-between w-full items-center" @click="onItemClick(item)">
<li class="flex items-center left">
<img
- :src="item.symbol ? `${HOST_URL}/symbol/${item.symbol_data}.png` : handleImage('../../../assets/loading-default.png')"
- alt="logo" class="w-72 h-72 rounded-full mr-16" />
+ :src="item.symbol ? `${HOST_URL}/symbol/${item.symbol_data}.png` : handleImage('@/assets/loading-default.png')"
+ alt="logo" class="w-72 h-72 mr-16" />
<p class="flex flex-col">
<span class="flex items-end font-32 flex items-center">
<span class="textColor font-600 font-30">{{ item.name || '--'
}}</span>
- <!-- <span class="font-24 text-grey" style="position: relative; top: 1px">
- /USDT
- </span> -->
- <!-- <span class="font-24 text-grey" style="position: relative; top: 1px">
- {{ item.name && item.name.replace(item.symbol.toUpperCase(), '') || '--' }}</span> -->
</span>
- <span class="font-24 text-grey text-left">{{ $t('成交量') + ' ' + (item.amount * 1).toFixed(2) }}</span>
+ <span class="font-24 text-grey text-left">{{ (item.amount * 1).toFixed(2) }}</span>
</p>
</li>
<li class="flex flex-col items-end mid">
<p class="textColor font-32 font-600">{{ item.close || '--' }}</p>
- <p class="font-24 text-grey">{{ currency.currency_symbol }}
- {{ item.close && item.symbol_data.toUpperCase() == 'SHIB' ? (item.close * currency.rate).toFixed(8) : (item.close *
- currency.rate).toFixed(2) || '--' }}</p>
</li>
<li class="right flex items-center justify-end">
- <p class="w-153 font-31 h-71 bg-green text-white border-0 text-center btn" v-if="item.change_ratio_str > 0 || item.change_ratio > 0">
- +{{ item.change_ratio || (item.change_ratio_str === 0 ? 0 : '--') }}%</p>
- <p class="w-153 font-31 h-71 bg-red text-white border-0 text-center btn" v-else>
- {{ item.change_ratio || (item.change_ratio_str === 0 ? 0 : '--') }}%</p>
- </li>
- </ul>
- </van-cell>
- </div>
- <div v-else :key="active">
- <van-cell v-for="item in showList" :key="item.id">
- <ul class="flex justify-between w-full items-center" @click="onItemClick(item)">
- <li class="flex items-center left">
- <img :src="`${HOST_URL}/symbol/${item.symbol_data}.png`" alt="logo"
- class="w-72 h-72 rounded-full mr-16" />
- <p class="flex flex-col">
- <span class="flex items-end font-32 flex items-center">
- <span class="textColor font-600 font-30">{{ item.symbol_data && item.symbol_data.toUpperCase() || '--'
- }}</span>
- <!-- <span class="font-24 text-grey" style="position: relative; top: 1px">
- {{ item.name && item.name.replace(item.symbol.toUpperCase(), '') || '--' }}</span> -->
- <!-- <span class="font-24 text-grey" style="position: relative; top: 1px">
- /USDT
- </span> -->
- </span>
- <span class="font-24 text-grey text-left">{{ $t('成交量') + ' ' + (item.amount * 1).toFixed(2) }}</span>
+ <p class="w-153 font-31 h-71 text-white border-0 text-center btn"
+ :class="item.change_ratio > 0 ? 'bg-green' : 'bg-red'">
+ {{ item.change_ratio === 0 ? 0 : item.change_ratio }}%
</p>
- </li>
- <li class="flex flex-col items-end mid">
- <p class="textColor font-32 font-600">{{ item.close }}</p>
- <p class="font-24 text-grey">{{ currency.currency_symbol }} {{ item.close && item.symbol_data.toUpperCase() == 'SHIB' ? (item.close * currency.rate).toFixed(8) : (item.close *
- currency.rate).toFixed(2) || '--' }}</p>
- </li>
- <li class="right flex items-center justify-end text-right">
- <div v-if="active == 3" class="textColor w-182 font-700 font-24">
- {{ (item.volume * 1).toFixed(2) }}
- </div>
- <template v-else>
- <p class="w-153 font-31 h-71 bg-green text-white border-0 text-center btn" v-if="item.change_ratio_str > 0 || item.change_ratio > 0">
- +{{ item.change_ratio || item.change_ratio_str }}%</p>
- <p class="w-153 font-31 h-71 bg-red text-white border-0 text-center btn" v-else>
- {{ item.change_ratio || (item.change_ratio_str === 0 ? 0 : '--') }}%</p>
- </template>
</li>
</ul>
</van-cell>
</div>
</transition-group>
</van-list>
- <!-- <div class="flex flex-col justify-center items-center pb-58 mt-20" @click="$router.push('/quotes/?active=3')" v-if="showMore">
- <p class="text-grey font-28 mb-8">{{ $t('查看') }}</p>
- <img src="./icon-arrow_more.png" alt="more" class="w-24 h-10"/>
- </div> -->
</div>
</template>
-<script>
-import { List, Cell } from 'vant'
-import { mapGetters, mapActions } from 'vuex'
+<script setup>
+import { ref, computed, onMounted, watch } from 'vue';
+import { useStore } from 'vuex';
+import { useI18n } from 'vue-i18n';
+import { useRouter } from 'vue-router';
+import { List, Cell, Icon } from 'vant';
import { fixDate, setStorage } from "@/utils";
import ExTabs from "@/components/Transform/ex-tabs/index.vue";
-import { HOST_URL } from '@/config'
+import { HOST_URL } from '@/config';
import { SET_CURRENCY } from "@/store/const.store";
-// import { useI18n } from "vue-i18n";
-// const t = useI18n()
-export default {
- name: 'ListQuotation',
- data() {
- return {
- fixDate,
- HOST_URL,
- active: 0,
- isTopShow: false,
- topTitle: '币币交易',
- topValue: 1,
- type: 'left' //left 从左往右 right 从有王座
- }
+
+// 状态定义
+const isTopShow = ref(false);
+const topTitle = ref('');
+const topValue = ref(2);
+const type = ref('left');
+const active = ref(0);
+const showList = ref([]);
+
+// 依赖注入
+const store = useStore();
+const { t } = useI18n();
+const router = useRouter();
+
+// Props定义
+const props = defineProps({
+ showMore: {
+ type: Boolean,
+ default: true
},
- props: {
- showMore: {
- type: Boolean,
- default: true
- },
- listData: {
- type: Array,
- default() {
- return []
- }
- },
- tabActive: {
- type: Number,
- default: 0
- },
+ listData: {
+ type: Array,
+ default: () => []
},
- computed: {
- ...mapGetters({ currency: 'home/currency' }),
- },
- components: {
- [List.name]: List,
- [Cell.name]: Cell,
- ExTabs
- },
- mounted() {
- this.SET_CURRENCY()
- },
- methods: {
- ...mapActions('home', [SET_CURRENCY]),
- changeType(tit, val){
- this.topTitle = tit
- this.topValue = val
- this.$emit('onfetchQList', val)
- },
- toggleDropdown(){
- if(this.isTopShow){
- this.isTopShow = false
- }else{
- this.isTopShow = true
- }
- },
- onItemClick(item) {
- if (this.topValue == 2) { //现货
- setStorage('symbol', item.symbol)
- this.$router.push({
- path: `/cryptos/perpetualContract/${item.symbol}`,
- query: { selectIndex: 2 }
- });
- } else {
- setStorage('symbol', item.symbol)
- // /cryptos/perpetualContract/btcusdt?selectIndex=2
- this.$router.push({
- path:`/cryptos/trade/${item.symbol}`,
- // path: `/cryptos/perpetualContract/${item.symbol}`,
- // query: { selectIndex: 2 }
- });
- // this.$router.push({
- // path: `/foreign/deliveryContract/${item.symbol}`,
- // query: { type: 'cryptos' }
- // });
- // this.$router.push({
- // path: `/cryptos/perpetualContract/${item.symbol}`,
- // query: { type: 'cryptos' }
- // });
- }
- },
- handleImage(url) {
- return new URL(url, import.meta.url).href
- },
- onTabs(val) {
- if (this.active < val) {
- this.type = 'right'
- } else {
- this.type = 'left'
- }
- this.active = val
- if (val == 0) {
- this.showList = [...this.listData];
- } else if (val == 1) {
- this.showList = [...this.listData].sort(this.compare("change_ratio_str", 'up'))
- } else if (val == 2) {
- this.showList = [...this.listData].sort(this.compare("change_ratio_str", 'down'))
- } else if (val == 3) {
- this.showList = [...this.listData].sort(this.compare("volume", 'up'))
- }
- },
- compare(p, type) { //这是比较函数
- return function (m, n) {
- var a = m[p];
- var b = n[p];
- if (a == b) {
- return
- }
- if (type == 'up') {
- return b - a; //升序
- } else if (type == 'down') {
- return a - b; //降序
- } else {
- return a - b;
- }
- }
- }
- },
- watch: {
- listData() {
- if (this.active == 0) {
- this.showList = [...this.listData];
- } else if (this.active == 1) {
- this.showList = [...this.listData].sort(this.compare("change_ratio_str", 'up'))
- } else if (this.active == 2) {
- this.showList = [...this.listData].sort(this.compare("change_ratio_str", 'down'))
- } else if (this.active == 3) {
- this.showList = [...this.listData].sort(this.compare("volume", 'up'))
- }
- this.$forceUpdate()
- }
+ tabActive: {
+ type: Number,
+ default: 0
}
-}
+});
+
+// Emits定义
+const emit = defineEmits(['onfetchQList']);
+
+// 计算属性
+const currency = computed(() => store.getters['home/currency']);
+
+// 生命周期
+onMounted(() => {
+ topTitle.value = t('货币兑换');
+ store.dispatch('home/' + SET_CURRENCY);
+ showList.value = [...props.listData];
+});
+
+// 方法定义
+const changeType = (tit, val) => {
+ topTitle.value = tit;
+ topValue.value = val;
+ emit('onfetchQList', val);
+};
+
+const toggleDropdown = () => {
+ isTopShow.value = !isTopShow.value;
+};
+
+const onItemClick = (item) => {
+ setStorage('symbol', item.symbol);
+ if (topValue.value === 2) {
+ router.push({
+ path: `/cryptos/perpetualContract/${item.symbol}`,
+ query: { selectIndex: 2 }
+ });
+ } else {
+ router.push({
+ path: `/cryptos/trade/${item.symbol}`
+ });
+ }
+};
+
+const handleImage = (url) => {
+ return new URL(url, import.meta.url).href;
+};
+
+const onTabs = (val) => {
+ type.value = active.value < val ? 'right' : 'left';
+ active.value = val;
+ sortListData(val);
+};
+
+const compare = (p, sortType) => {
+ return (m, n) => {
+ const a = m[p];
+ const b = n[p];
+ if (a === b) return 0;
+ return sortType === 'up' ? b - a : a - b;
+ };
+};
+
+const sortListData = (val) => {
+ switch(val) {
+ case 0:
+ showList.value = [...props.listData];
+ break;
+ case 1:
+ showList.value = [...props.listData].sort(compare('change_ratio_str', 'up'));
+ break;
+ case 2:
+ showList.value = [...props.listData].sort(compare('change_ratio_str', 'down'));
+ break;
+ case 3:
+ showList.value = [...props.listData].sort(compare('volume', 'up'));
+ break;
+ }
+};
+
+// 监听器
+watch(
+ () => props.listData,
+ () => {
+ sortListData(active.value);
+ },
+ { deep: true }
+);
</script>
<style lang="scss" scoped>
@import "@/assets/init.scss";
@@ -320,15 +237,16 @@
color: #242629;
}
-.text-grey{
+.text-grey {
// color: #8c8c8c;
}
-#cryptos .list-quatation .van-cell{
+#cryptos .list-quatation .van-cell {
padding: 24px !important;
border-radius: 1rem;
}
-.list-quatation{
+
+.list-quatation {
margin: 0 20px;
}
</style>
--
Gitblit v1.9.3