<template>
  <van-pull-refresh v-model="refreshing" @refresh="refresh" class="flow-y-dhc flex-1-dhc" :style="{ width: dWidth + 'px' }">
    <van-list ref="list" v-model="loading" :finished="finished" :error="error" :offset="offset" :loading-text="loadingText" :finished-text="finishedText" :error-text="errorText" :immediate-check="immediateCheck" :direction="direction" @load="onLoad">
      <slot></slot>
      <slot :name="loading"></slot>
      <slot :name="finished"></slot>
      <slot :name="error"></slot>
    </van-list>
  </van-pull-refresh>
</template>

<script lang="ts">
import { Component, Vue, Prop, Watch } from "vue-property-decorator";
/**
 * @Description 列表封装,实现下拉刷新
 * @Author lbb
 * @Date 2021年12月15日15:47:15
 */
@Component({
  name: "BaseList",
})
export default class BaseList extends Vue {
  @Prop({ default: () => [] }) data: any[] | undefined; // 列表数据
  @Prop({ default: 100 }) offset: number | undefined; // 滚动条与底部距离小于 offset 时触发load事件
  @Prop({ default: "" }) loadingText: string | undefined; // 加载过程中的提示文案
  @Prop({ default: "" }) finishedText: string | undefined; // 加载完成后的提示文案
  @Prop({ default: "" }) errorText: string | undefined; // 加载失败后的提示文案
  @Prop({ default: false }) immediateCheck: boolean | undefined; // 是否在初始化时立即执行滚动位置检查
  @Prop({ default: "down" }) direction: string | undefined; // 滚动触发加载的方向,可选值为up
  @Prop({ default: 10 }) pageLines: number | undefined; // 分页查询数据的条数,默认10条数据,需要和传递给服务端的条数保持一致
  @Prop({ default: "" }) dWidth: string | undefined; // 横向滚动行宽 - 适配表格横向滚动

  @Watch("data")
  onData(value: any) {
    if (this.pageLines ? value.length <= this.pageLines : false) {
      this.finished = false;
    }
  }
  recordsLen = 0;
  loading = false;
  finished = false;
  error = false;
  refreshing = false;
  /**
   * 加载更多函数,滚动条与底部距离小于 offset 时触发
   */
  onLoad() {
    let pageNo = this.data && this.pageLines ? Math.round(this.data.length / this.pageLines) + 1 : 1; //当前页数
    this.recordsLen = this.data ? this.data.length : 0;
    this.loading = true;
    this.$emit("onLoad", pageNo, this);
  }
  /**
   * 数据加载时调用
   */
  onStoreLoad(data = this.data) {
    let count = data?.length,
      len = this.pageLines ? (this.recordsLen || 0) + this.pageLines : 1;
    this.finished = false; // 重置加载完成
    if (count === this.recordsLen) {
      //count(当前的数据) == this.recordsLen(之前的数据,就是没加10条数据时)
      this.finished = true;
    } else if (count && count < len) {
      this.finished = true;
    }
    this.loading = false;
  }
  //刷新
  refresh() {
    this.$emit("refresh", this);
  }
}
</script>

<style lang="scss" scoped></style>