elementui form字段筛选展示

背景

在crm系统中,有时form表单字段非常多,而实际需要查询的条件只有几个,一是占用空间多,二是从非常多的字段中不太好寻找,所以,需要做一个字段筛选模版,只选择有效的字段展示。效果如图:


image.png

在此,给其封装成一个组件。

如何使用

在父级里,
1、引入组件

import FilterFields from "@/components/filterFields/index"

2、注册组件

components: {
    FilterFields
  },

3、调用组件

<FilterFields ref="filterFields" :filterColumns.sync="filterForm"></FilterFields>

4、初始化数据

      filterForm: {
        tableName: 'param',
        filtrateVisible: false,
        checkedColumn: ['ids', 'title', 'sourceId', 'country', 'language', 'status', 'sourceType', 'firstTag', 'sublibraries', 'sourceUserId', 'authorId', 'createStartTime', 'publishTime', 'durationMin'],
        defaultShow: true,
        showColumnsKey: 'APOLLO_miniVideo_form_columns'
      }

mounted() {
    this.$refs.filterFields.initFormFields('param') 
 },

param表示父表单的ref值

5、模板中使用

<el-button type="primary" @click="filterForm.filtrateVisible = !filterForm.filtrateVisible">more</el-button>
    <el-form-item 
            v-if="filterForm.defaultShow || filterForm.checkedColumn.indexOf('ids') !== -1" 
            prop="ids"
            checkLabel="IDS">
            <el-input
              v-model="param.ids"
              :clearable="true"
              :placeholder="$t('shortVideo.id')"
              type="textarea"
              rows="1"
            ></el-input>
          </el-form-item>

点击more按钮,表单条件筛选框显示。filterForm.checkedColumn控制表单条件是否展示。注意:一定要写上prop="ids" checkLabel="IDS"。

组件具体实现

<template>
  <div>
    <el-dialog :visible.sync="filterColumns.filtrateVisible" width="800px" class="filtrate-dialog">
      <el-checkbox :indeterminate="filtrateIsIndeterminate" v-model="filtrateCheckAll" @change="handleCheckAllChange" class="select-all">{{ $t("common.select_all") }}</el-checkbox>
      <el-checkbox-group v-model="filterColumns.checkedColumn" @change="handleCheckedFiltateChange">
        <template v-for="column in columnList">
          <el-checkbox v-if="column.property" :label="column.property" :key="column.id" :title="column.label">{{ column.label }}</el-checkbox>
        </template>
      </el-checkbox-group>
    </el-dialog>
  </div>
</template>
<script>
const ls = localStorage;
export default ({
  props: {
    filterColumns: {
      type: Object
    }
  },
  data () {
    return {
      filtrateIsIndeterminate: true,
      filtrateCheckAll: true,
      columnList: []
    }
  },
  methods: {
    /** 初始化表格展示箱 */
    initFormFields(table) {
      // console.log('---ref---', this.$parent.$refs[table])
      this.$parent.$refs[table].fields.forEach(((field) => {
        if (field.prop) {
          this.columnList.push({
            id: field.id,
            property: field.prop,
            label: field.$attrs.checkLabel
          })
        }
      }))
      this.$parent.filterForm.defaultShow = false;
      this.filterColumns.checkedColumn = JSON.parse(ls.getItem(this.filterColumns.showColumnsKey)) || this.filterColumns.checkedColumn;
    },
    /** 表格列显示控制 */
    handleCheckAllChange(val) {
      this.filterColumns.checkedColumn = val ? this.columnList.map((column) => column.property) : [];
      this.filtrateIsIndeterminate = false;
      ls.setItem(this.filterColumns.showColumnsKey, JSON.stringify(this.filterColumns.checkedColumn));
    },
    /** 表格列显示项选中变化 */
    handleCheckedFiltateChange(val) {
      const checkedCount = val.length;
      this.filtrateCheckAll = checkedCount === this.columnList.length;
      this.filtrateIsIndeterminate = checkedCount > 0 && checkedCount < this.columnList.length;
      ls.setItem(this.filterColumns.showColumnsKey, JSON.stringify(this.filterColumns.checkedColumn));
    },
  }
})
</script>
<style lang="scss">
.el-checkbox {
  width: 120px;
}
</style>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容