This commit is contained in:
zpc 2025-07-25 13:27:18 +08:00
parent 9d9aa3d006
commit d98c40d8a2
3 changed files with 121 additions and 96 deletions

View File

@ -6,66 +6,72 @@
:hide-empty-view="hideEmptyView" :refresher-enabled="false" @contentHeightChanged="contentHeightChanged" :hide-empty-view="hideEmptyView" :refresher-enabled="false" @contentHeightChanged="contentHeightChanged"
:auto="false" :auto-clean-list-when-reload="false"> :auto="false" :auto-clean-list-when-reload="false">
<!-- 如果希望其他view跟着页面滚动可以放在z-paging标签内 --> <!-- 如果希望其他view跟着页面滚动可以放在z-paging标签内 -->
<view class="item" v-for="(item, index) in dataList" :key="index"> <view class="grid-container">
<view class="item-title">{{ item.title }}</view> <view v-for="(item, index) in dataList" :key="index">
<guyu-home-goods-item :goods-item="item" />
<!-- <view class="item-title">{{ item.title }}</view>
<view class="item-detail">{{ item.detail }}</view> <view class="item-detail">{{ item.detail }}</view>
<view class="item-line"></view> <view class="item-line"></view> -->
</view> </view>
</view>
</z-paging> </z-paging>
</view> </view>
</template> </template>
<script> <script setup>
export default { import { ref, watch, nextTick, defineProps, defineExpose } from 'vue';
data() {
return { // props
// v-model const props = defineProps({
dataList: [],
height: 0,
hideEmptyView: true,
completeFunc: null
}
},
props: {
// indexswiper // indexswiper
tabIndex: { tabIndex: {
type: Number, type: Number,
default: function () { default: 0
return 0
}
}, },
// swiperindex // swiperindex
currentIndex: { currentIndex: {
type: Number, type: Number,
default: function () { default: 0
return 0
} }
} });
},
watch: { // emit
currentIndex: { const emit = defineEmits(['heightChanged']);
handler(newVal) {
if (newVal === this.tabIndex) { //
// v-model
const dataList = ref([]);
const height = ref(0);
const hideEmptyView = ref(true);
const completeFunc = ref(null);
const paging = ref(null);
// currentIndex
watch(
() => props.currentIndex,
(newVal) => {
if (newVal === props.tabIndex) {
// item // item
this.$nextTick(() => { nextTick(() => {
setTimeout(() => { setTimeout(() => {
this.$refs.paging.reload(); paging.value.reload();
}, 100); }, 100);
}) });
} }
}, },
immediate: true { immediate: true }
} );
},
methods: { //
queryList(pageNo, pageSize) { //
// const queryList = (pageNo, pageSize) => {
// pageNopageSize // pageNopageSize
// //
const params = { const params = {
pageNo: pageNo, pageNo: pageNo,
pageSize: pageSize, pageSize: pageSize,
type: this.tabIndex + 1 type: props.tabIndex + 1
} }
let c = []; let c = [];
for (let i = 0; i < 10; i++) { for (let i = 0; i < 10; i++) {
@ -74,38 +80,47 @@ export default {
detail: '详情' + i detail: '详情' + i
}) })
} }
this.$refs.paging.complete(c); paging.value.complete(c);
this.hideEmptyView = false; hideEmptyView.value = false;
//使z-paging //使z-paging
if (this.completeFunc) { if (completeFunc.value) {
this.completeFunc(); completeFunc.value();
} }
}, };
//
reload(completeFunc) { //
const reload = (completeFn) => {
// //
this.completeFunc = completeFunc; completeFunc.value = completeFn;
// z-pagingreload // z-pagingreload
this.$refs.paging.reload(); paging.value.reload();
}, };
// swiper
contentHeightChanged(height) { // swiper
const finalHeight = this.dataList.length ? height : 0; const contentHeightChanged = (height) => {
const finalHeight = dataList.value.length ? height : 0;
// z-tabs使slot="top"viewminHeightslot="top"view // z-tabs使slot="top"viewminHeightslot="top"view
const minHeight = uni.getSystemInfoSync().windowHeight - uni.upx2px(80); const minHeight = uni.getSystemInfoSync().windowHeight - uni.upx2px(80);
this.$emit('heightChanged', Math.max(finalHeight, minHeight)); emit('heightChanged', Math.max(finalHeight, minHeight));
}, };
//
doLoadMore() { //
this.$refs.paging.doLoadMore(); const doLoadMore = () => {
}, paging.value.doLoadMore();
// };
clear() {
this.$refs.paging.clear(); //
this.hideEmptyView = true; const clear = () => {
} paging.value.clear();
} hideEmptyView.value = true;
} };
//
defineExpose({
reload,
doLoadMore,
clear
});
</script> </script>
<style> <style>
@ -140,4 +155,14 @@ export default {
width: 100%; width: 100%;
background-color: #eeeeee; background-color: #eeeeee;
} }
.grid-container {
width: 100%;
display: grid;
/* 3列等宽 */
grid-template-columns: repeat(2, 1fr);
/* 间距 */
gap: 20rpx;
padding: 20rpx 0rpx;
}
</style> </style>

View File

@ -2,8 +2,7 @@
<view class="tabs-container"> <view class="tabs-container">
<view class="tabs-wrapper"> <view class="tabs-wrapper">
<template v-for="(item, index) in slideLableList" :key="index"> <template v-for="(item, index) in slideLableList" :key="index">
<view class="tab-item-wrapper" @click="clickTab(index)" <view class="tab-item-wrapper" @click="clickTab(index)" :style="{ width: item.width }">
:style="{ width: item.width }">
<SlideLabel ref="slideLabels" :defaultColor="item.active ? '#F5D677' : '#fff'"> <SlideLabel ref="slideLabels" :defaultColor="item.active ? '#F5D677' : '#fff'">
<text class="tab-text myZt-500w">{{ item.name }}</text> <text class="tab-text myZt-500w">{{ item.name }}</text>
</SlideLabel> </SlideLabel>
@ -94,7 +93,7 @@ const getLableWidth = (name) => {
return t + "rpx"; return t + "rpx";
} }
const systemWidth = parseInt(uni.getSystemInfoSync().screenWidth * 0.96); const systemWidth = parseInt(uni.getWindowInfo().screenWidth * 0.96);
const emit = defineEmits(['change']); const emit = defineEmits(['change']);
let isClick = false; let isClick = false;
// //

View File

@ -188,6 +188,7 @@ defineExpose({
.right-cover { .right-cover {
height: 100%; height: 100%;
top: 0; top: 0;
/* border-radius: 25rpx; */
} }
.left-cover { .left-cover {