From 3f14ef500765c04405a0a1779fba20983c8f47a1 Mon Sep 17 00:00:00 2001 From: Kroytz Date: Sat, 18 Jul 2026 23:36:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=82=B9=E5=8D=95=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yshop-drink-uniapp-vue3/pages/menu/menu.vue | 32 +++++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/yshop-drink-uniapp-vue3/pages/menu/menu.vue b/yshop-drink-uniapp-vue3/pages/menu/menu.vue index 4b07822..c4d2a80 100644 --- a/yshop-drink-uniapp-vue3/pages/menu/menu.vue +++ b/yshop-drink-uniapp-vue3/pages/menu/menu.vue @@ -62,7 +62,7 @@ + v-for="(item, index) in filteredGoods" :key="index" @tap="handleMenuTap(item.id)"> {{ item.name }} {{ menuCartNum(item.id) }} @@ -74,7 +74,7 @@ - {{ item.name }} @@ -82,7 +82,7 @@ - @@ -118,6 +118,7 @@ + @@ -248,7 +249,8 @@ import { ref, computed, - nextTick + nextTick, + watch } from 'vue' import { useMainStore } from '@/store/store' import { storeToRefs } from 'pinia' @@ -318,8 +320,20 @@ const spread = computed(() => { //差多少元起送 if (orderType.value != 'takeout') return return parseFloat((store.value.minPrice - getCartGoodsPrice).toFixed(2)) }) -const isGoodVisible = (good) => !keyword.value || [good.storeName, good.storeInfo] - .filter(Boolean).join(' ').toLowerCase().includes(keyword.value.trim().toLowerCase()) +const filteredGoods = computed(() => { + const query = keyword.value.trim().toLowerCase() + if (!query) return goods.value + return goods.value.map(item => ({ + ...item, + goodsList: (item.goodsList || []).filter(good => [good.storeName, good.storeInfo, good.keyword] + .filter(Boolean).join(' ').toLowerCase().includes(query)) + })).filter(item => item.goodsList.length) +}) +watch(keyword, () => { + currentCateId.value = filteredGoods.value[0]?.id || 0 + cateScrollTop.value = 0 + sizeCalcState.value = false +}) const hasSpecialSpecs = (good) => (good.productAttr || []).some(attr => (attr.attrValueArr || []).length > 1) const defaultSpec = (good) => (good.productAttr || []).map(attr => attr.attrValueArr?.[0]).filter(Boolean).join(',') @@ -515,7 +529,7 @@ const handleMenuTap = (id) => { //点击菜单项事件 } currentCateId.value = id - nextTick(() => cateScrollTop.value = goods.value.find(item => item.id == id).top) + nextTick(() => cateScrollTop.value = filteredGoods.value.find(item => item.id == id)?.top || 0) } const handleGoodsScroll = ({ detail }) => { //商品列表滚动事件 if (!sizeCalcState.value) { @@ -525,7 +539,7 @@ const handleGoodsScroll = ({ detail }) => { //商品列表滚动事件 const { scrollTop } = detail - let tabs = goods.value.filter(item => item.top <= scrollTop).reverse() + let tabs = filteredGoods.value.filter(item => item.top <= scrollTop).reverse() if (tabs.length > 0) { currentCateId.value = tabs[0].id } @@ -542,7 +556,7 @@ const calcSize = () => { } }).exec() } - goods.value.forEach(item => { + filteredGoods.value.forEach(item => { let view = uni.createSelectorQuery().select(`#cate-${item.id}`) view.fields({ size: true