lxf
2025-07-16 8588fe30f17d0d28190a279aab8675de0dbf1a5b
src/components/Transform/list-quotation/index.vue
@@ -3,17 +3,17 @@
    <van-list>
      <!-- 热门 -->
      <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-140 box-border">
            <div class="block">{{ $t(topTitle) }}</div>
            <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-140 box-border top-25 rounded-11 leading-28"
            style="z-index:999;margin-top: 0.8rem;" v-show="isTopShow">
            <div @click="changeType('货币兑换', 2)">{{ $t('货币兑换') }}</div>
            <div @click="changeType('外汇交易', 1)">{{ $t('外汇交易') }}</div>
            <div @click="changeType(t('货币兑换'), 2)">{{ t('货币兑换') }}</div>
            <div @click="changeType(t('外汇交易'), 1)">{{ t('外汇交易') }}</div>
          </div>
        </div>
      </div>
@@ -21,11 +21,11 @@
      <transition-group :name="type" tag="div">
        <div>
          <van-cell v-for="item in listData" :key="item.id" style="background-color: #f0f0f0;margin-bottom: 10px;">
          <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')"
                  :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">
@@ -51,135 +51,128 @@
    </van-list>
  </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: this.$t('货币兑换'),
      topValue: 2,
      type: 'left' //left 从左往右 right 从有王座
    }
  },
  props: {
    showMore: {
      type: Boolean,
      default: true
    },
    listData: {
      type: Array,
      default() {
        return []
      }
    },
    tabActive: {
      type: Number,
      default: 0
    },
// 状态定义
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
  },
  computed: {
    ...mapGetters({ currency: 'home/currency' }),
  listData: {
    type: Array,
    default: () => []
  },
  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)
        this.$router.push({
          path: `/cryptos/trade/${item.symbol}`,
        });
      }
    },
    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";