vue-element 表格组合查询 - fc-table-search 组件封装

开发目的

解决搜索form参数读取,配合异步请求,更新渲染数据;支持自适应高度,分页查询,搜索查询/重置。
额外提供formater类型:标签定义,金额,时间格式化,跨页勾选,静态分页等。
只需三个条件属性,满足大部分场景表格,搜索,分页组合业务场景和统一UI风格规范。
提高开发效率,代码优雅,可读性,方便维护。

示例效果:

代码:

<template>
  <div class="fc-table-search-demo">
    <fc-table-search
      className="searchListPage"
      ref='tableSearch'
      :form-items='formItems'
      :table-columns='tableColumns'
      v-model="formData"
      @requestMethod="getTableData"
      v-bind="searchOptions"
    >
      <!-- 搜索按钮区域-表单自定义 -->
      <template #propName="{form, attrs}">
        <el-form-item v-bind="attrs">
          <el-input v-model="form.ceshi"/>
        </el-form-item>
      </template>
      <template #handleLeft>
        <el-button @click="() => $refs.tableSearch.onRefresh()">通过ref调用onRefresh()重置刷新</el-button>
        <el-button @click="() => $refs.tableSearch.onRefresh(true)">通过ref调用onRefresh(true)当前刷新</el-button>
      </template>
      <!-- 操作表格区域 -->
      <template #handleRight>
      <el-button>导出</el-button>
      </template>
  </fc-table-search>
  </div>
</template>

<script>
export default {
  name: 'fc-table-search-demo',
  data () {
    return {
      formData: { date: [new Date(), new Date()],desc: { aa: { bb: { cc: '111' } } }, result: { code: '' }, resultType: null } // 收集查询
    }
  },
  computed: {
    // 搜索表单定义
    formItems () {
      return [
        { comp: 'date', prop: 'date', label: '日期范围', type: 'datetimerange', dateRangeKeys:['starts','ends'] },
        { comp: 'input', prop: 'result.code', label: '对账结果' },
        { comp: 'date', prop: 'date', label: '对账日期', type: 'datetimerange', dateRangeKeys:['starts','ends'], itemAttrs: {labelWidth: ''} },
        { comp: 'input', prop: 'desc.aa.bb.cc', label: '业务描述' },
        { comp: 'cascader', prop: 'cascader', label: '城市地区' },
        { comp: 'select', prop: 'resultType', label: '对账类型', placeholder: '自定义', options: [{label: '对账差异', value: 1}, {label: '对账1', value: 4}] }
      ]
    },
    // 表格定义
    tableColumns() {
      return [
        { type: 'selection'},
        { label: '对账结果', slotName: 'ceshi' },
        { prop: 'date', label: '对账日期', formatter: 'date' },
        { prop: 'status', label: '对账金额', formatter: 'money' },
        { prop: 'desc', label: '对账描述', width: 150, formatter: () => '213213业务/类型描述文本,业务类型/描述文本,业务类型描述文本,业务类型描述文本,' },
        {
          label: '操作',
          fixed: 'right',
          width: 100,
          render: (h, {row}) => {
            return <div>
              <el-button size="mini" type="text">详情</el-button>
            </div>
          }
        }
      ]
    },
    // 额外自定义配置
    searchOptions() {
      return {
        // 自定义表格配置
        'table-config': {
          height: 300,
          isPaging: false, // 是否启用静态分页
          isCrossCheck: true, // 是否启用跨页勾选
          'show-summary': true,
          'summary-method': () => {
            return ['', '合计']
          }
        },
        // 自定义分页配置
        'pagination-config': {},
        // 自定义form搜索配置
        'form-config': {
          'label-width': '70px'
        },
        // 是否自动高度
        autoHeight: false
        // 是否隐藏分页
        // pageHide: false,
        // 展示几行
        // formLine: 1
        // 自定义展示个数
        // formSpan: 4
        // 定义每个col的响应布局
        // formCol: { xl: '12' }
        // 是否包含折叠功能
        // isToggle: true
        // 自定义loading
        // setLoading: true
        // 标示key,用于跨页勾选
        // columnKey: 'id'
      }
    }
  },

  methods: {
    // 请求数据
    async getTableData ({ current, size, total, ...formData }, fn, options) {
      try {
        let { date, ...use } = formData
        const [start = '', end = ''] = date || []
        use.startDate = start
        use.endDate = end
        use.pageNum = current
        use.pageSize = size
        console.log('查询结果:', { current, size, total, ...formData }, 'options', options)
        setTimeout(() => {
          fn({
            data: Array(10).fill({status: 0, date: '2020-08-10', status: '9992342.448423', desc: '业务类型描述文本,业务类型描述文本,业务类型描述文本,业务类型描述文本,'}),
            total: 100
          })
        }, 1000)
      } catch (error) {
        fn({message: error.message})
      }
    }
  }
}
</script>

<style lang="less" scoped>
.fc-table-search-demo{
  width: 100%;
  background: #f6f6f6;
  padding:16px
}
</style>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web网页精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值