cashier_app/components/JeepayTableList/JeepayTableList.vue

120 lines
2.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
Jeepay 表格列表 支持 下滑 上滑刷新
业务页面最好也监听下 触底函数 否则H5无法监听到
import { onReachBottom } from '@dcloudio/uni-app'
onReachBottom(() => { })
@author terrfly
@site https://www.jeequan.com
@date 2022/11/16 15:55
-->
<template>
<view>
<template v-for="(record, i) in vdata.allData" :key="i">
<slot name="tableBody" :record="record" :index="i" />
</template>
</view>
<view class="list-null" v-if="!vdata.apiResData.hasNext && showListNull">暂无更多数据</view>
</template>
<script setup>
import { ref, reactive, onMounted } from 'vue';
import { onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app';
// 定义传入属性
const props = defineProps({
reqTableDataFunc: { type: Function, default: () => {} },
searchData: { type: Object, default: () => {} }, // 搜索条件参数
pageSize: { type: Number, default: 10 }, // 默认每页条数
initData: { type: Boolean, default: true }, // 初始化列表数据, 默认true
showListNull: { type: Boolean, default: true } //是否显示缺省 默认显示
});
const vdata = reactive({
allData: [], // app与web不同 app是每次查询到数据会拼接到后面
// 接口返回的数据
apiResData: { total: 0, records: [] },
// 分页参数
iPage: { pageNumber: 1, pageSize: props.pageSize }
});
onMounted(() => {
//初始化表数据
props.initData ? refTable(true) : undefined;
});
// 查询表格数据
function refTable(isToFirst = false) {
if (isToFirst) {
// 重新搜索, 第一页。
vdata.iPage.pageNumber = 1;
vdata.allData = []; //清空数据
}
// 更新检索数据
return props.reqTableDataFunc(Object.assign({}, vdata.iPage, props.searchData)).then(({ bizData }) => {
Object.assign(vdata.apiResData, bizData); // 列表数据更新
if (bizData.records) {
vdata.allData.push(...bizData.records); // 利用展开语法代替forEach
}
});
}
/** 追加下一页数据 **/
function addNext() {
// 包含下一页
if (vdata.apiResData.hasNext) {
vdata.iPage.pageNumber++;
refTable(false);
}
}
// 下拉刷新
onPullDownRefresh(() => {
refTable(true).then(() => {
uni.stopPullDownRefresh();
});
});
// 监听,触底事件。 查询下一页
onReachBottom(() => {
addNext();
});
// 将表格事件暴露出去 https://www.jianshu.com/p/39d14c25c987
defineExpose({ refTable, addNext });
</script>
<style lang="scss" scoped>
.list-null {
position: relative;
line-height: 110rpx;
text-align: center;
font-size: 26rpx;
color: #a6a6a6;
&::after,
&::before {
content: '';
display: block;
position: absolute;
top: 50%;
width: 30%;
height: 2rpx;
background-color: #ededed;
transform: translateY(-50%);
}
&::after {
left: 40rpx;
}
&::before {
right: 40rpx;
}
}
</style>