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 |  358 +++++++++++++++++++++++------------------------------------
 1 files changed, 138 insertions(+), 220 deletions(-)

diff --git a/src/components/Transform/list-quotation/index.vue b/src/components/Transform/list-quotation/index.vue
index 3f0a2e4..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.symbol_data && item.symbol_data.toUpperCase() || '--'
+                    <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