封装表单搜索+分页

62 阅读2分钟

主页面

<template>
  <div class="app-container-home">
    <div>
      <Statisticaltableheader
        @queryList="queryList"
        :type="'total'"
      ></Statisticaltableheader>
      <div class="cs"></div>
      <CustomPagination @change="CustomPaginationchange"></CustomPagination>
    </div>
  </div>
</template>

<script>
import Statisticaltableheader from "./InfectiousDiseaseStatistics/components/Statisticaltableheader.vue";
import CustomPagination from "./InfectiousDiseaseStatistics/components/CustomPagination.vue";

export default {
  name: "Index",
  components: {
    Statisticaltableheader,
    CustomPagination,
  },
  data() {
    return {
      // 版本号
      version: "3.6.3",
      searvhParams:{
        page:null,
        pageSizes:null
      }
    };
  },
  methods: {
    goTarget(href) {
      window.open(href, "_blank");
    },
    //表单组件触发
    queryList(val) {
      console.log("值来了", val);
      this.searvhParams = {
        ...searvhParams,
        ...val
      }
    },
    //分页组件
    CustomPaginationchange(val) {
      console.log("分页值来了", val);
      this.searvhParams = {
        ...searvhParams,
        ...val
      }
    },
  },
};
</script>

<style scoped lang="scss">
.app-container-home {
  margin: 10px;
  min-height: calc(100vh - 100px);
  background-color: #ffffff;
}
</style>

分页组件

<template>
  <div class="custom-pagination">
    <el-pagination
      :current-page="pagination.page"
      :page-sizes="pageSizes"
      :page-size="pagination.pageSize"
      layout="total, sizes, prev, pager, next, jumper"
      :total="total"
      background
      :style="paginationStyle"
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
    />
  </div>
</template>

<script>
export default {
  name: "CustomPagination",
  props: {
    paginationStyle: {
      type: Object,
      default: () => {},
    },
    total: {
      type: [Number, null],
      default: 0,
    },
  },
  data() {
    return {
      queryParams: {},
      pagination: { page: 1, pageSize: 10 },
      pageSizes: [10, 20, 30, 50, 100],
    };
  },
  methods: {
    handleSizeChange(pageSize) {
      console.log(pageSize, "pageSize");
      this.$emit("change", {
        ...this.pagination,
        pageSize
      });
    },
    handleCurrentChange(page) {
      console.log(page, "page");
      this.$emit("change", {
        ...this.pagination,
        page
      });
    }
  },
};
</script>

<style scoped>
.custom-pagination {
  background: #f7f7f7;
  padding: 10px;
  margin: 10px 0px;
  text-align: right;
}
</style>

表单搜索组件

<template>
  <div>
    <div class="search-form">
      <el-form
        ref="queryForm"
        :model="queryParams"
        size="small"
        :inline="true"
        label-width="85px"
      >
      <el-form-item label="报告日期:" prop="morbiditDate">
          <el-date-picker
            v-model="queryParams.morbiditDate"
            size="small"
            style="width: 240px"
            value-format="yyyy-MM-dd"
            placeholder="请选择本次报告日期"
          />
        </el-form-item>
        <el-form-item label="统计方式" prop="businessType">
          <el-select
            v-model="queryParams.businessType"
            placeholder="请选择"
            @change="changeBusinessTypeHandle"
          >
            <el-option
              v-for="item in businessOption"
              :key="item.dictValue"
              :label="item.dictLabel"
              :value="item.dictValue"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="年" prop="year">
          <el-date-picker
            v-model="queryParams.year"
            type="year"
            value-format="yyyy"
            placeholder="选择年"
          />
        </el-form-item>
        <el-form-item label="上下年度" prop="impactType">
          <el-select v-model="queryParams.impactType" placeholder="请选择">
            <el-option
              v-for="item in businessOption"
              :key="item.dictValue"
              :label="item.dictLabel"
              :value="item.dictValue"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="选择季度" prop="impactType">
          <el-select v-model="queryParams.impactType" placeholder="请选择">
            <el-option
              v-for="item in businessOption"
              :key="item.dictValue"
              :label="item.dictLabel"
              :value="item.dictValue"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="月" prop="month">
          <el-date-picker
            v-model="queryParams.month"
            type="month"
            value-format="yyyy"
            placeholder="选择年"
          />
        </el-form-item>
        <el-form-item label="周" prop="week">
          <el-date-picker
            v-model="queryParams.week"
            type="week"
            format="第 WW 周"
            placeholder="选择周"
          />
        </el-form-item>
        <el-form-item label="天:" prop="morbiditDate">
          <el-date-picker
            v-model="queryParams.morbiditDate"
            size="small"
            style="width: 240px"
            value-format="yyyy-MM-dd"
            placeholder="请选择本次报告日期"
          />
        </el-form-item>
        <el-form-item label="时间区间" prop="daterange" v-if="type!=='total'">
        <el-date-picker
                  v-model="queryParams.daterange"
                  type="daterange"
                  align="right"
                  value-format="yyyy-MM-dd"
                  unlink-panels
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期"
          />
        </el-form-item>
        <el-form-item label="现住址" prop="impactType">
          <el-select v-model="queryParams.impactType" placeholder="请选择">
            <el-option
              v-for="item in businessOption"
              :key="item.dictValue"
              :label="item.dictLabel"
              :value="item.dictValue"
            />
          </el-select>
        </el-form-item>
        <el-form-item label="现住址类型" prop="impactType">
          <el-select v-model="queryParams.impactType" placeholder="请选择">
            <el-option
              v-for="item in businessOption"
              :key="item.dictValue"
              :label="item.dictLabel"
              :value="item.dictValue"
            />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button
            type="primary"
            icon="el-icon-search"
            size="mini"
            @click="handleQuery"
          >
            查询
          </el-button>
          <el-button
            type="success"
            icon="el-icon-search"
            size="mini"
            @click="handleexcel"
          >
            导出
          </el-button>
          <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">
            重置
          </el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
import Vue from "vue";
import _ from "lodash";

export default Vue.extend({
  props: {
    type: {
      // 数据源
      type: String,
      default: '',
    },
  },
  created() {
    this.user = JSON.parse(sessionStorage.getItem("currentUser"));
  },
  watch: {

  },
  computed: {},
  data() {
    return {
      queryParams: {},
      businessOption:[
        {
            dictValue:'1',
            dictLabel:'参数1'
        },{
            dictValue:'2',
            dictLabel:'参数2'
        },{
            dictValue:'3',
            dictLabel:'参数3'
        },{
            dictValue:'4',
            dictLabel:'参数4'
        }
      ]
    };
  },
  methods: {
    //change
    changeBusinessTypeHandle() {
      console.log("改变了");
    },
    handleQuery() {
      console.log("搜索了");
      this.$emit('queryList', this.queryParams)
    },
    resetQuery() {
      console.log("重置了!");
      this.$refs.queryForm.resetFields();
    },
    handleexcel() {
       console.log("导出了!");
    }
  },
});
</script>

<style lang="scss" scoped>
.search-form {
  text-align: left;
  background: #fff;
  padding: 20px;
  box-sizing: border-box;
  .search-btn {
    margin-left: 20px;
  }
}
</style>