hookehuyr

✨ feat: 个人首页列表新增分页功能

...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
4 <div class="info"> 4 <div class="info">
5 <van-row> 5 <van-row>
6 <van-col> 6 <van-col>
7 - <van-image v-if="userInfo.avatar" round width="50" height="50" :src="userInfo.avatar" style="padding-right: 1rem;" /> 7 + <van-image v-if="userInfo.avatar" round width="50" height="50" :src="userInfo.avatar"
8 + style="padding-right: 1rem;" />
8 <van-image v-else round width="50" height="50" :src="icon_avatar" style="padding-right: 1rem;" /> 9 <van-image v-else round width="50" height="50" :src="icon_avatar" style="padding-right: 1rem;" />
9 </van-col> 10 </van-col>
10 <van-col class="text-wrapper" span="18"> 11 <van-col class="text-wrapper" span="18">
...@@ -40,17 +41,23 @@ ...@@ -40,17 +41,23 @@
40 <div class="title">发布作品</div> 41 <div class="title">发布作品</div>
41 </van-col> 42 </van-col>
42 <van-col span="12" offset="6" style="text-align: right; color: #626262;"> 43 <van-col span="12" offset="6" style="text-align: right; color: #626262;">
43 - <div style="padding-top: 0.5rem;">{{ userInfo.prod?.length }}个作品</div> 44 + <div style="padding-top: 0.5rem;">{{ userInfo.prod_num }}个作品</div>
44 </van-col> 45 </van-col>
45 </van-row> 46 </van-row>
46 </div> 47 </div>
47 <div> 48 <div>
48 - <template v-for="item in userInfo.prod" :key="item"> 49 + <!-- <template v-for="item in userInfo.prod" :key="item">
49 <video-card :item="item" /> 50 <video-card :item="item" />
50 - </template> 51 + </template> -->
52 + <van-list v-model:loading="loading" :finished="finished" :finished-text="finishedTextStatus ? '没有更多了' : ''"
53 + @load="onLoad">
54 + <template v-for="item in prod" :key="item">
55 + <video-card :item="item" />
56 + </template>
57 + </van-list>
51 <div style="height: 8rem;" /> 58 <div style="height: 8rem;" />
52 </div> 59 </div>
53 - <div class="donate-bar"> 60 + <div v-if="donateInfo" class="donate-bar">
54 <div class="text"> 61 <div class="text">
55 <span style="font-size: 0.85rem; color: #999999;">收到小红花&nbsp;</span> 62 <span style="font-size: 0.85rem; color: #999999;">收到小红花&nbsp;</span>
56 <van-icon :name="icon_flower" color="#c5c5c5" size="1.25rem" style="margin: 0 auto;" /> 63 <van-icon :name="icon_flower" color="#c5c5c5" size="1.25rem" style="margin: 0 auto;" />
...@@ -92,20 +99,64 @@ const emptyStatus = ref(false); ...@@ -92,20 +99,64 @@ const emptyStatus = ref(false);
92 const donateInfo = ref({}) 99 const donateInfo = ref({})
93 onMounted(async () => { 100 onMounted(async () => {
94 // 获取表演者信息 101 // 获取表演者信息
95 - const { data } = await perfInfoAPI({ perf_id: $route.query.perf_id }); 102 + // const { data } = await perfInfoAPI({ perf_id: $route.query.perf_id });
96 - if (!data.prod.length) { 103 + // if (!data.prod.length) {
97 - emptyStatus.value = true; 104 + // emptyStatus.value = true;
98 - } else { 105 + // } else {
106 + // _.each(data.prod, (item) => {
107 + // item.type = 'read-only' // 特殊标识,判断入口 为keepAlive使用
108 + // })
109 + // userInfo.value = data;
110 + // emptyStatus.value = false;
111 + // }
112 + const donateData = await prepareDonateAPI({ perf_id: $route.query.perf_id });
113 + donateInfo.value = donateData.data;
114 +});
115 +
116 +/******** ******/
117 +
118 +// 绑定页面数据
119 +// tslint:disable-next-line: variable-name
120 +const prod = ref([]);
121 +const limit = ref(30)
122 +const offset = ref(0)
123 +
124 +// 处理书籍下作品列表
125 +const loading = ref(false);
126 +const finished = ref(false);
127 +
128 +// 因为不能让空图标提前出来的写法
129 +const finishedTextStatus = ref(false);
130 +
131 +/**
132 + * 向下滚动查询数据
133 + */
134 +const onLoad = async () => {
135 + // 异步更新数据
136 + const { data, code } = await perfInfoAPI({ perf_id: $route.query.perf_id, limit: limit.value, offset: offset.value })
137 + if (code === 1) {
99 _.each(data.prod, (item) => { 138 _.each(data.prod, (item) => {
100 item.type = 'read-only' // 特殊标识,判断入口 为keepAlive使用 139 item.type = 'read-only' // 特殊标识,判断入口 为keepAlive使用
101 }) 140 })
102 userInfo.value = data; 141 userInfo.value = data;
103 - emptyStatus.value = false; 142 + prod.value = _.concat(prod.value, data.prod);
143 + prod.value = _.uniqBy(prod.value, 'id');
144 + offset.value = prod.value.length;
145 + loading.value = false;
146 + // 数据全部加载完成
147 + if (prod.value.length === data.prod_num) {
148 + // 加载状态结束
149 + finished.value = true;
150 + }
151 + // 空数据提示
152 + if (!prod.value.length) {
153 + finishedTextStatus.value = false;
154 + }
155 + emptyStatus.value = Object.is(prod.value.length, 0);
104 } 156 }
105 - const donateData = await prepareDonateAPI({ perf_id: $route.query.perf_id }); 157 +};
106 - donateInfo.value = donateData.data;
107 -});
108 158
159 +/******** ********/
109 // 弹出捐赠弹框模块 160 // 弹出捐赠弹框模块
110 const showDonate = ref(false); 161 const showDonate = ref(false);
111 162
...@@ -173,6 +224,7 @@ setTimeout(() => { ...@@ -173,6 +224,7 @@ setTimeout(() => {
173 // background-image: url('@images/bg@2x.png'); 224 // background-image: url('@images/bg@2x.png');
174 background-image: url('http://gyzs.onwall.cn/bg%402x.png'); 225 background-image: url('http://gyzs.onwall.cn/bg%402x.png');
175 background-size: cover; 226 background-size: cover;
227 +
176 .info { 228 .info {
177 padding: 2rem; 229 padding: 2rem;
178 padding-right: 0; 230 padding-right: 0;
...@@ -249,6 +301,7 @@ setTimeout(() => { ...@@ -249,6 +301,7 @@ setTimeout(() => {
249 background-color: white; 301 background-color: white;
250 padding: 1rem; 302 padding: 1rem;
251 box-shadow: 0px -2px 4px 0px rgba(0, 0, 0, 0.07); 303 box-shadow: 0px -2px 4px 0px rgba(0, 0, 0, 0.07);
304 +
252 .text { 305 .text {
253 display: flex; 306 display: flex;
254 // flex-direction: column; 307 // flex-direction: column;
......