@@ -42,6 +42,7 @@
|
||||
:has-more="hasMore"
|
||||
:loading="loadingMore"
|
||||
:scroll-top-val="scrollTopVal"
|
||||
:scroll-height="productScrollHeight"
|
||||
@sub-select="selectSubCategory"
|
||||
@product-click="goDetail"
|
||||
@scroll-to-lower="onScrollToLower"
|
||||
@@ -108,7 +109,8 @@ export default {
|
||||
loadingMore: false,
|
||||
products: [],
|
||||
windowHeight: 667,
|
||||
scrollTopVal: 0
|
||||
scrollTopVal: 0,
|
||||
productScrollHeight: 400 // 商品滚动区高度(px),动态计算
|
||||
}
|
||||
},
|
||||
async onLoad() {
|
||||
@@ -123,6 +125,10 @@ export default {
|
||||
await this.initData()
|
||||
this.loadSubCategories('all')
|
||||
await this.loadGoods(1)
|
||||
// 首屏数据渲染完成后计算滚动区高度
|
||||
this.$nextTick(() => {
|
||||
this.calcScrollHeight()
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
async initData() {
|
||||
@@ -253,6 +259,11 @@ export default {
|
||||
this.hasMore = this.products.length < total
|
||||
this.loadingMore = false
|
||||
|
||||
// 数据变更后重算滚动区高度(筛选标签/子分类数量变化会影响上方占位高度)
|
||||
this.$nextTick(() => {
|
||||
this.calcScrollHeight()
|
||||
})
|
||||
|
||||
console.log(
|
||||
'[loadGoods] total=' + total +
|
||||
', page=' + currentPage +
|
||||
@@ -352,6 +363,41 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* 动态计算商品滚动区高度(px)。
|
||||
* 用 createSelectorQuery 测量 SearchBar / CountryBar / ActiveFilters / subCategories 的实际高度,
|
||||
* 用 windowHeight 依次减去,得到 scroll-view 可用的固定高度。
|
||||
* —— 完全符合 uni-app / 微信小程序官方文档「scroll-y 需给固定 height」的要求。
|
||||
*/
|
||||
calcScrollHeight() {
|
||||
const query = uni.createSelectorQuery().in(this)
|
||||
// 分别测量 4 个元素的 boundingClientRect
|
||||
query.select('#searchBar').boundingClientRect()
|
||||
query.select('#countryBar').boundingClientRect()
|
||||
query.select('#activeFilters').boundingClientRect()
|
||||
query.select('#subCategories').boundingClientRect()
|
||||
query.exec((res) => {
|
||||
// res[0]=searchBar, res[1]=countryBar, res[2]=activeFilters, res[3]=subCategories
|
||||
// 注意:v-if 为 false 时 res[i] 可能为 null
|
||||
const searchBarH = res[0] ? res[0].height : 0
|
||||
const countryBarH = res[1] ? res[1].height : 0
|
||||
const activeFiltersH = res[2] ? res[2].height : 0
|
||||
const subCategoriesH = res[3] ? res[3].height : 0
|
||||
|
||||
const totalUsed = searchBarH + countryBarH + activeFiltersH + subCategoriesH
|
||||
let h = this.windowHeight - totalUsed
|
||||
// 最小值保护:至少 200px,避免极端情况
|
||||
if (h < 200) h = 200
|
||||
if (h > this.windowHeight) h = this.windowHeight
|
||||
|
||||
this.productScrollHeight = Math.round(h)
|
||||
console.log('[calcScrollHeight] windowHeight=' + this.windowHeight +
|
||||
', searchBar=' + searchBarH + ', countryBar=' + countryBarH +
|
||||
', activeFilters=' + activeFiltersH + ', subCategories=' + subCategoriesH +
|
||||
' → scrollHeight=' + this.productScrollHeight)
|
||||
})
|
||||
},
|
||||
|
||||
async selectCountry(id) {
|
||||
// 如果点击的是已选中的国家 → 取消选中
|
||||
if (this.selectedCountry === id) {
|
||||
|
||||
Reference in New Issue
Block a user