fix(menu): 分类第一次无法点击

This commit is contained in:
Kroytz committed 2026-07-24 14:13:29 +08:00
1 parent 140afd88a1
commit 15f3b09f6d
1 file changed
+37 -32
+37 -32
View File
@@ -566,7 +566,10 @@ const getShopList = async(res) => {
refreshCart(); refreshCart();
} }
console.log('goods:',mygoods) console.log('goods:',mygoods)
nextTick(() => measureMenuLayout()) nextTick(() => {
measureMenuLayout()
calcSize()
})
} }
} }
} finally { } finally {
@@ -689,20 +692,21 @@ const takein = (force = false) => {
} }
} }
const handleMenuTap = (id) => { //点击菜单项事件 const handleMenuTap = async (id) => { //点击菜单项事件
if (!sizeCalcState.value) {
calcSize()
}
menuClickLock.value = true menuClickLock.value = true
if (menuClickLockTimer) clearTimeout(menuClickLockTimer) if (menuClickLockTimer) clearTimeout(menuClickLockTimer)
currentCateId.value = id currentCateId.value = id
menuScrollIntoView.value = `menu-${id}` menuScrollIntoView.value = `menu-${id}`
// 首次点击时分类高度尚未测完,必须等测量完成再滚动
if (!sizeCalcState.value) {
await calcSize()
}
const targetTop = filteredGoods.value.find(item => item.id == id)?.top || 0 const targetTop = filteredGoods.value.find(item => item.id == id)?.top || 0
nextTick(() => { await nextTick()
// 同一 scroll-top 重复赋值不会触发滚动,做微小偏移确保生效 // 同一 scroll-top 重复赋值不会触发滚动,做微小偏移确保生效
cateScrollTop.value = cateScrollTop.value === targetTop ? targetTop + 0.01 : targetTop cateScrollTop.value = cateScrollTop.value === targetTop ? targetTop + 0.01 : targetTop
})
// scroll-with-animation 期间屏蔽 scroll 回写,动画结束后再放开 // scroll-with-animation 期间屏蔽 scroll 回写,动画结束后再放开
menuClickLockTimer = setTimeout(() => { menuClickLockTimer = setTimeout(() => {
menuClickLock.value = false menuClickLock.value = false
@@ -724,29 +728,30 @@ const handleGoodsScroll = ({ detail }) => { //商品列表滚动事件
} }
} }
const calcSize = () => { const calcSize = () => {
let h = 10 return new Promise((resolve) => {
let view = uni.createSelectorQuery().select('#ads') const list = filteredGoods.value
if (view) { if (!list.length) {
view.fields({ sizeCalcState.value = true
size: true resolve()
}, data => { return
if (data) { }
h += Math.floor(data.height) const query = uni.createSelectorQuery()
} list.forEach((item) => {
}).exec() query.select(`#cate-${item.id}`).boundingClientRect()
} })
filteredGoods.value.forEach(item => { query.exec((rects) => {
let view = uni.createSelectorQuery().select(`#cate-${item.id}`) let h = 0
view.fields({ list.forEach((item, index) => {
size: true const rect = rects?.[index]
}, data => { const height = rect?.height || 0
console.log('h3:',h) item.top = h
item.top = h h += height
h += data.height item.bottom = h
item.bottom = h })
}).exec() sizeCalcState.value = true
resolve()
})
}) })
sizeCalcState.value = true
} }
const handleAddToCart = (cate, newGood, num) =>{ //添加到购物车 const handleAddToCart = (cate, newGood, num) =>{ //添加到购物车
isCartShow.value = true isCartShow.value = true