vue+elementUI项目封装分页组件

34 篇文章 1 订阅
本文介绍了如何在Vue项目中使用Element UI的分页组件,并展示了如何配合表单筛选,实现会员膨胀券列表的动态加载和过滤。通过实例演示了el-pagination的配置和事件处理,同时提供了数据格式化和导出功能。
摘要由CSDN通过智能技术生成

src/components/pagination

<template>
<!--分页-->
<el-col :span="24" class="toolbar" :data-total="total" :data-size="pageSize" :data-pageSizes="pageSizes">
    <el-pagination
		layout="total, sizes, prev, pager, next, jumper"
		@size-change="handleSizeChange"
		@current-change="handleCurrentChange"
		:current-page="currentPage"
		:page-size="pageSize"
		:page-sizes="pageSizes"
		:total="total"
		class="pagination" >
    </el-pagination>
</el-col>
</template>
<script>
    export default {
        data() {
            return {

            }
        },
        props: {
            total: {
                default: 0
            },
            pageSize: {
                default: 10
            },
            currentPage: {
                default: 1
            },
            pageSizes: {
                default: function() {
                    return [5, 10, 20, 30, 40, 50, 100]
                }
            }
        },
        methods: {
            handleSizeChange(val) {
                this.$emit("loadData", this.currentPage, val);
            },
            handleCurrentChange(val) {
                this.$emit("loadData", val, this.pageSize);
            },
        }
    }
</script>
<style scoped lang="scss">
    .toolbar {
        text-align: center
    }

    .pagination {
        /deep/ .el-pager li,
        /deep/ button {
            background: none;
        }
    }
</style>

使用分页页面

<template>
  <div class="wrap">
    <el-row class = 'expPage'>
      <el-col :span="24" class="common-block">
        <el-row>
          <el-col :span="24">
            <el-form :inline="true" :model="filterData" ref="filterForm">
              <el-form-item label="会员编码:">
                <el-input v-model="filterData.userId" placeholder="会员编码">
                </el-input>
              </el-form-item>
              <el-form-item label="手机号码:">
                <el-input v-model="filterData.phone" placeholder="手机号码">
                </el-input>
              </el-form-item>
              <el-form-item label="券批次:">
                <el-input v-model="filterData.batchId" placeholder="券批次">
                </el-input>
              </el-form-item>
              <el-form-item label="选择膨胀时间:">
                <el-date-picker
                  v-model="filterData.time"
                  placeholder="请选择"
                  type="daterange"
                  :clearable='false'
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期"
                  value-format="yyyy-MM-dd HH:mm:ss"
                  :picker-options="pickerOptions"
                  :default-time="defaultTime"
                >
                </el-date-picker>
              </el-form-item>
              <!-- <el-form-item label="膨胀状态:">
                <el-select v-model="filterData.status" placeholder="请选择">
                  <el-option
                    v-for="item in statusOptions"
                    :key="item.value"
                    :label="item.text"
                    :value="item.value"
                  ></el-option>
                </el-select>
              </el-form-item> -->
              <el-form-item>
                <el-button type="primary" @click="queryList">查询</el-button>
                <el-button type="primary" @click="onReset">重置</el-button>
                <el-button
                :disabled="exportDisabled"
                type="primary" @click="exportExcel">导出</el-button>
              </el-form-item>
            </el-form> 
          </el-col>
        </el-row>
        <el-table :data="list" v-loading="listLoading" class="freight-tab">

          <el-table-column
            prop="memberCode"
            label="会员编号"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="memberPhone"
            label="手机号"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="batchId"
            label="膨胀券批次"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="dilateStartTime"
            label="膨胀开始时间"
            align="center"
          ></el-table-column>
          <el-table-column
            prop="dilateEndTime"
            label="膨胀到期时间"
            align="center"
          ></el-table-column>
        </el-table>
        <pagination
          :total="paginationData.total"
          :pageSize="paginationData.pageSize"
          :currentPage="paginationData.pageNo"
          @loadData="getPageListData"
        ></pagination>
      </el-col>
    </el-row>
  </div>
</template>

<script>
let lodash = require('lodash')
import pagination from "@/components/pagination/pagination";
import moment from "moment";
import {api,download} from '@/assets/js/util'
import { cityServiceRouter } from '../../router/modules';
import request from '@/assets/js/request'
import { validateEmpty } from "@/assets/js/validate";

function generateDefaultFilterData() {
  return {
    // orderCode: "",
    userId: "",
    phone: "",
    batchId: "",
    time: [
      moment().format("YYYY-MM-DD 00:00:00"),
      moment().format("YYYY-MM-DD HH:mm:ss")
    ],
    // status: ""
  }
}
export default {
  data() {
    return {
      pickerOptions: {
        disabledDate: time => {
          return time.getTime() > new Date().getTime() + 60 * 60 * 24 * 1000;
        }
      },
      defaultTime: ["00:00:00", "23:59:59"],
      list: [],
      filterData: generateDefaultFilterData(),
      statusOptions: [
        { text: "全部", value: "" },
        { text: "未过期未使用", value: 0 },
        { text: "已过期未使用", value: 2 },
        { text: "已使用", value: 1 }
      ],
      listLoading: false,
      paginationData: {
        total: 0,
        pageSize: 10,
        pageNo: 1
      },
      exportDisabled: false,
    };
  },
  components: {
    pagination
  },
  methods: {
    queryList() {
      const reqData = this.getQueryListRequestData();
      this.getList(reqData);
    },
    async getList(reqData) {
      if (this.listLoading) { return false };
      this.setListLoading(true);
      try {
        const result = await this.fetchListData(reqData);
        this.dealListSuccess(result);
      } catch(e) {
        this.clearList();
        this.setListLoading(false);
      }
    },
    dealListSuccess(result) {
      this.setListLoading(false);
      const { data } = result;
      const { list, total } = data;
      let { paginationData } = this;
      this.paginationData = { ...paginationData, total };
      this.list = list;
    },
    getPageListData(pageNo, pageSize) {
      const pageData = { pageSize, pageNo };
      const reqData = this.getQueryListRequestData(pageData);
      this.getList(reqData)
    },
    formatStatus(row, column, cellValue, index) {
      const { statusOptions } = this;
      const targetOptions = statusOptions.filter(item => {
        return item.value === cellValue;
      });
      if (targetOptions.length > 0) {
        return targetOptions[0].text;
      } else {
        return "";
      }
    },
    setListLoading(status) {
      this.listLoading = status;
    },
    getFilterDataForRequest() {
      const { filterData } = this;
      const { orderCode, userId, phone, time, status, batchId } = filterData;
      const [dilateStartTime, dilateEndTime] = time;
      return {
        dilateStartTime,
        dilateEndTime,
        // orderCode,
        batchId,
        // orderStatus: status,
        memberCode: userId,
        memberPhone: phone
      }
    },
    getQueryListRequestData(paginationData = this.paginationData) {
      const { pageSize, pageNo } = paginationData;
      const filterRequestData = this.getFilterDataForRequest();
      return {
        pageSize,
        page: pageNo,
        ...filterRequestData
      }
    },
    fetchListData(reqData) {
      return api('/weapp/volume/activity/user/coupon/list', reqData, 'post');
    },
    clearList() {
      this.list = [];
    },
    navigateToRead({ id, activityCode }) {
      this.$router.push({ path: `/couponBuying/read/${activityCode}`, query: { type: 'code' } });
    },
    onReset() {
      const data = generateDefaultFilterData();
      this.filterData = data;
    },

    //   tapToSearch: lodash.debounce(function (event) {
    //     event.preventDefault();
    //   }, 300)

    exportExcel: lodash.debounce(function (event) {
      event.preventDefault();
      const config = this.getFilterDataForRequest();
      if (!validateEmpty(config)) {
        this.$message.warning('导出日期不能为空');
        return false
      }
    //   let between = moment(this.filterData.time[1]) - moment(this.filterData.time[0])
    //   if(between/86400000 > 1) {
    //     return this.$message.warning('导出日期间隔不能大于1天');
    //   }
    //   this.exportDisabled = true;
    //   var params = Object.keys(config).map(function (key) {
    //     return encodeURIComponent(key) + "=" + encodeURIComponent(config[key]);
    //   }).join("&");
    //   api(`/weapp/volume/activity/user/coupon/export?${params}`, '', "post", "blob","application/x-www-form-urlencoded;charset=utf-8").then(  
    //     res => {
    //       this.exportDisabled = false;
    //       download(res);
    //     },
    //     () => {
    //       this.exportDisabled = false;
    //     }
    //   );

      this.exportExpRecordList(config)
    },300),
     exportExpRecordList (data)  {
      request({
        url: '/volume/activity/user/coupon/export',
        method: 'post',
        timeout: null,
        responseType: 'blob',
        data
      })
    
    },   
  },
  created() {
    this.queryList();
  }
};
</script>

<style lang="scss" scoped>
.expPage .el-input {
        width: 150px !important;
    }
.row-label {
  display: inline-block;
  font-size: 14px;
  color: #333;
}
/deep/ .activity-code {
  user-select:all;
  span {
    white-space: break-spaces;
    user-select: all;
  }
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值