Vue + Element-UI管理系统中 Form查询 二次封装

本文封装的组件是在Element-UI 的el-form 基础之上封装的。

 

一.在components文件夹下,新建tableSearch文件

<template>
  <div class="app-container">
    <el-collapse v-model="activeNames" @change="filterChange" class='collapse'>
      <el-collapse-item name="1">
        <template slot="title">
          <span>{{showFilter?'收起筛选':'展开筛选'}}</span>
          <div class="filter-item-search">
            <el-button 
              v-for="(item,index) in form_config.operate" 
              :key="index" 
              :type="item.type" 
              size="small" 
              @click.stop="item.handleClick">
              {{item.label}}
            </el-button>
          </div>
        </template>
        <el-form ref="form" :model="formInfo" :label-width="form_config.labelWidth" class="filter-main">
          <template v-for="(value,key) in form_config.formItemList">
            <el-row :key="key">
              <template v-for="item in value">
                <el-col :span="6" :key="item.name">
                  <template v-if="item.type=== 'text' ">
                    <el-form-item :label="item.label">
                      <el-input
                        v-model="formInfo[item.name]"  
                        :clearable="item.clearable" 
                        :placeholder="item.placeholder" 
                      />
                    </el-form-item>
                  </template>
                  <template v-if=" ['data', 'daterange', 'datetimerange', 'datetime'].indexOf(item.type) !== -1 ">
                    <el-form-item :label="item.label">
                      <el-date-picker
                        v-model="formInfo[item.name]"
                        :type="item.type"
                        value-format="yyyy-MM-dd"
                        @change="item.callback && item.callback(formInfo[item.name])"
                        start-placeholder="开始时间"
                        end-placeholder="结束时间"
                        style="width:100%">
                      </el-date-picker>
                    </el-form-item>
                  </template>
                  <template v-if="item.type=== 'select' ">
                    <el-form-item :label="item.label">
                      <el-select 
                        v-model="formInfo[item.name]"
                        :clearable="item.clearable" 
                        :multiple="item.multiple" 
                        :collapse-tags="item.collapseTags"
                        :placeholder="item.placeholder" 
                        style="width:100%">
                        <el-option v-for="ele in item.optList" :key="ele.value" :value="ele.value" :label="ele.label"/>
                      </el-select>
                    </el-form-item>
                  </template>
                </el-col>
              </template>
            </el-row>
          </template>
        </el-form>
      </el-collapse-item>
    </el-collapse>
  </div>
</template>

<script>
export default {
  props: {
    config: {
      type: Object,
      default: () => {}
    },  
    formInfo: {
      type: Object,
      default: () => {}
    }
  },
  data() {
    return {
      activeNames: ['1'],
      showFilter: true,
      form_config: {
        labelWidth: '100px',
        formItemList: {},
        operate: []
      }
    }
  },
  watch: {
    // 监听传过来的config,进行初始化
    config: {
      handler(newVal) {
        if(newVal) {
          this.initConfig()
        }
      },
      immediate: true
    }
  },
  methods: {
    // 初始化配置
    initConfig() {
      for(let key in this.config) {
        if(Object.keys(this.form_config).includes(key)) {
          this.form_config[key] = this.config[key]
        }
      }
    },
    filterChange (val) {
      if (val.length <= 0) {
        this.showFilter = false
      } else {
        this.showFilter = true
      }
    }
  }
}
</script>

<style scoped>
.collapse >>> .el-collapse-item>div[role=tab] {
  padding: 0 200px;
  height: 50px;
  position: relative;
  border-top: 1px solid #ccc;
}
.collapse >>> .el-collapse-item__header{
  width: auto!important;
  border: 0;
  float: right;
  font-size: 14px;
  color: #409EFF;
}
.collapse .filter-item-search {
  position: absolute;
  right: 60px;
}

.filter-main{
  padding: 30px;
  background: #f3f4f9;
}
.collapse >>> .el-collapse-item__content{
  padding-bottom: 10px;
}
</style>

 

二、使用组件

1、import TableSearch from '@/components/tableSearch';

2、注册组件components: { TableSearch };

3、使用组件

<template>
  <div>
    <TableSearch 
      :config="form_config" 
      :formInfo="formInfo" 
    />
  </div> 
</template>

  

// 查询配置项
      form_config: {
        labelWidth: '120px',
        formItems: {
          1: [
            {
              label: '姓名',
              name: 'name',
              type: 'text',
              placeholder: '请输入姓名'
            },
            {
              label: '时间',
              name: 'time',
              type: 'daterange',
              callback: (data) => {
                console.log(data);
              }
            },
            {
              label: '角色',
              name: 'role',
              type: 'select',
              clearable: true,
              multiple: true,
              collapseTags: true,
              placeholder: '请选择角色',
              optList: [
                {label:'一号选手',value:1},
                {label:'二号选手',value:2},
                {label:'三号选手',value:3}
              ]
            },
            {
              label: '状态',
              name: 'status',
              type: 'select',
              clearable: true,
              placeholder: '请选择状态',
              optList: [
                {label:'停用',value:0},
                {label:'启用',value:1}
              ]
            },
          ]
        },
        operate: [
          {
            label: '查询',
            type: 'primary',
            handleClick: this.handleSearch
          },
          {
            label: '重置',
            type: 'primary',
            handleClick: this.handleReset
          }
        ]
      }

 

三、参数说明 

form_config:查询配置项
参数 说明 类型 默认值
labelWidth
表单域标签的宽度 string -
formItems
formItems:{1:[]}
object {}
operate
操作项 array []
 
 
formItems
参数 说明 类型 默认值
label
标签文本 string -
name
表单域 model 字段 string -
type
类型(input、select、daterange等) string text
clearable
是否可清空 boolean false
multiple
是否可多选 boolean false
collapseTags
多选时是否将选中值按文字的形式展示 boolean false
placeholder
占位符 string -
optList
下拉框列表 array []

 

Methods

方法名 说明 参数
callback
回调函数 -
handleClick
操作方法 -

 

源码

如果你感兴趣的话,请前往 GitHub 查看源码和完整文档。

https://github.com/wangibook/my-table-component

 

 
posted @ 2022-04-08 15:17  王大师  阅读(974)  评论(0编辑  收藏  举报