From ef52095f5e9f0a9fe2da779bb1573947d77d75b6 Mon Sep 17 00:00:00 2001
From: jhzh <1628036192@qq.com>
Date: Fri, 22 May 2026 10:53:01 +0800
Subject: [PATCH] 1

---
 src/views/quotes/List.vue |   97 +++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 90 insertions(+), 7 deletions(-)

diff --git a/src/views/quotes/List.vue b/src/views/quotes/List.vue
index 55bed5d..58d092a 100644
--- a/src/views/quotes/List.vue
+++ b/src/views/quotes/List.vue
@@ -1,23 +1,52 @@
 <template>
-  <div class="quotes-list pt-5 pb-60 pl-5 pr-5" id="cryptos">
-
-    <Head></Head>
-    <list-quatation :listData="qList" :tabActive="2" />
+  <div class="quotes-list-wrap">
+    <!-- 头部:All / Spot / Futures + 搜索图标 -->
+    <div class="quotes-header">
+      <div class="quotes-header-tabs">
+        <span
+          v-for="(tab, idx) in headerTabs"
+          :key="idx"
+          class="quotes-header-tab"
+          :class="{ 'quotes-header-tab--active': headerActive === idx }"
+          @click="headerActive = idx"
+        >
+          {{ tab }}
+        </span>
+      </div>
+      <div class="quotes-header-search" @click="onSearchClick">
+        <van-icon name="search" size="22" />
+      </div>
+    </div>
+    <div class="quotes-list pb-60 pl-5 pr-5" id="cryptos">
+      <list-quatation :listData="qList" :tabActive="2" :tabShow="false" />
+    </div>
   </div>
 </template>
 
 <script setup>
 import { ref, computed, onBeforeUnmount } from 'vue';
 import { useStore } from "vuex";
+import { useRouter } from 'vue-router';
+import { useI18n } from 'vue-i18n';
 import { _getHomeList } from '@/service/cryptos.api'
 import { TIME_OUT } from "@/config";
 import ListQuatation from "@/components/Transform/list-quotation/index.vue";
-import Head from './components/head.vue'
 
+const { t } = useI18n();
+const router = useRouter();
 const store = useStore();
+
+const headerActive = ref(2);
+const headerTabs = computed(() => [t('全部'), t('现货'), t('永续')]);
+
+const onSearchClick = () => {
+  router.push('/optional/search');
+};
 
 //#region 行情数据----------------------------------------
 let qList = ref([])
+let qListCope = ref([]) // 备份数据
+let key = ref('') // 搜索关键词
 let timeout = ref(null)
 const coinArr = computed(() => store.getters['home/coinArr']);
 
@@ -28,7 +57,16 @@
   if (!(list instanceof Array)) {
     return
   }
-  qList.value = list;
+
+  // 通过关键字进行筛选
+  if (key.value) {
+    qList.value = list.filter(item => {
+      return item.symbol_data.toLowerCase().includes(key.value.toLowerCase()) || item.name.toLowerCase().includes(key.value.toLowerCase())
+    })
+  } else {
+    qList.value = list
+  }
+  qListCope.value = list; // 备份数据
 
   if (timeout.value) {
     clearTimeout(timeout.value)
@@ -45,10 +83,55 @@
   }
 })
 //#endregion----------------------------------------------
+
+// 搜索
+const onSearch = (val) => {
+  key.value = val
+
+  if (!val) {
+    qList.value = qListCope.value
+    return
+  }
+  let newList = qListCope.value.filter(item => {
+    return item.symbol_data.toLowerCase().includes(val.toLowerCase()) || item.name.toLowerCase().includes(val.toLowerCase())
+  })
+  qList.value = newList
+}
 </script>
 <style lang="scss" scoped>
+.quotes-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 16px 20px 16px 16px;
+  background: #f0f0f0;
+}
+
+.quotes-header-tabs {
+  display: flex;
+  align-items: center;
+  gap: 24px;
+}
+
+.quotes-header-tab {
+  font-size: 16px;
+  color: #999;
+  cursor: pointer;
+  font-weight: 500;
+}
+
+.quotes-header-tab--active {
+  color: #5e2bc8;
+  font-weight: 600;
+}
+
+.quotes-header-search {
+  color: #999;
+  cursor: pointer;
+  padding: 4px;
+}
+
 .quotes-list {
-  background: $mainbgWhiteColor;
   min-height: 100vh;
 
   :deep(.active) {

--
Gitblit v1.9.3