| | |
| | | <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> |
| | |
| | | |
| | | <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"> |
| | |
| | | </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"; |