vue智能搜索表单

先来张效果图

图片描述

第一步:引入写好的组件

<options-search :formObj="formObj" @data="getData"></options-search>

第二步:本身设置下传入的表单,其中selfDefine能够设置默认值,filterInfo是表单数组,field是数据库对应的字段名称,type是表单类型(input文本搜索框,time时间范围,radio单选框,checkbox复选框,change数值范围)

/**formObj格式以下:**/

 formObj: {
          selfDefine: true,
          filterInfo: [
            {
              field: 'companyName',
              type: 'input',
              name: '企业名称',
              value: ''
            },
            {
               field: 'time',
                type: 'time',
               name: '时间范围',
                 value: {
               startDate: '',
                  endDate: ''
             }
            },
            {
              field: 'companyType',
              type: 'radio',
              name: '单位类型',
              value: [{
                label: '生产',
                value: '生产'
              }, {
                label: '批发',
                value: '批发'
              }, {
                label: '燃放',
                value: '燃放'
              }, {
                label: '出口',
                value: '出口'
              }, {
                label: '长期零售',
                value: '长期零售'
              }, {
                label: '临时零售',
                value: '临时零售'
              }]
            },
            {
              field: 'companyStatus',
              type: 'checkbox',
              name: '单位状态',
              value: [{
                label: '有效',
                value: '有效'
              }, {
                label: '无效',
                value: '无效'
              }, {
                label: '注销',
                value: '注销'
              }, {
                label: '过时',
                value: '过时'
              }]
            },
            {
              field: 'province',
              type: 'radio',
              name: '省内外',
              value: [{
                label: '省内',
                value: '省内'
              }, {
                label: '省外',
                value: '省外'
              }]
            },
            {
              field: 'loginMoney',
              type: 'range',
              name: '注册资金(万元)',
              value: {
                min: '',
                max: ''
              }
            },
            {
              field: 'productCount',
              type: 'range',
              name: '产量(件)',
              value: {
                min: '',
                max: ''
              }
            }
          ]
        },

OptionsSeach.vue组件

<template>
  <div class="show-more-box">
    <div class="show-more" @click="clickMore()">+</div>
    <div class="show-more-child">
      <div class="more-header">
        <span class="more-title">智能筛选</span>
        <span class="close" @click="closeMore()"></span>
      </div>
      <div class="more-body">
        <el-col :span="24">
          <el-form label-width="120px" ref="form" :model="form" class="search-form">
            <div v-for="(item,index) in formObj.filterInfo" :key="index">
              <el-form-item :label="item.name" v-if="item.type==='input'" :prop="item.field">
                <el-autocomplete
                  size="mini"
                  v-model="form[item.field]"
                  :fetch-suggestions="querySearch"
                  placeholder="请输入内容"
                  :trigger-on-focus="false"
                  @select="handleSelect"
                ></el-autocomplete>
              </el-form-item>
              <el-form-item :label="item.name" v-else-if="item.type === 'time'" :prop="item.field">
                <div class="block">
                  <el-date-picker
                    v-model="form[item.field].startDate"
                    type="date"
                    size="mini"
                    style="width:140px;"
                    :editable=false
                    placeholder="选择开始日期">
                  </el-date-picker>
                  <el-date-picker
                    v-model="form[item.field].endDate"
                    type="date"
                    size="mini"
                    style="width:140px;"
                    :editable=false
                    placeholder="选择结束日期">
                  </el-date-picker>
                </div>
              </el-form-item>
              <el-form-item :label="item.name" v-else-if="item.type === 'range'" :prop="item.field">
                <el-input style="width:120px;" size="mini" type="number" v-model="form[item.field].min"></el-input>
                ~
                <el-input style="width:120px;" size="mini" type="number" v-model="form[item.field].max"></el-input>
              </el-form-item>
              <el-form-item :label="item.name" v-else-if="item.type === 'select'" :prop="item.field">
                <el-select v-model="form[item.field]" clearable placeholder="请选择" size="mini">
                  <el-option
                    v-for="k in item.value"
                    :key="k.value"
                    :label="k.label"
                    :value="k.value">
                  </el-option>
                </el-select>
              </el-form-item>
              <el-form-item :label="item.name" v-else-if="item.type==='radio'" :prop="item.field">
                <el-radio-group v-model="form[item.field]" size="mini">
                  <el-radio-button v-for="k in item.value" :label="k.value" :key="k.value">{{k.label}}
                  </el-radio-button>
                </el-radio-group>
              </el-form-item>
              <el-form-item :label="item.name" v-else-if="item.type === 'checkbox'" :prop="item.field">
                <el-checkbox-group v-model="form[item.field]" size="mini">
                  <el-checkbox-button v-for="k in item.value" :label="k.value" :key="k.value">{{k.label}}
                  </el-checkbox-button>
                </el-checkbox-group>
              </el-form-item>
            </div>
            <div class="m-b-15">
              <el-form-item>
                <el-button type="primary" size="mini" @click="onSubmitForm">搜索</el-button>
                <el-button type="warning" size="mini" @click="onResetForm('form')">重置</el-button>
              </el-form-item>
            </div>
          </el-form>
        </el-col>
      </div>
    </div>
  </div>
</template>
<script>
  import $ from 'jquery'

  export default {
    props: ['formObj'],
    data() {
      return {
        form: {}, // 搜索参数的表单
        companySuggest: [] // 煤矿名称提示框
      }
    },
    created() {
      let self = this
      if (self.formObj.selfDefine === false) { // 判断是否为自定义表单
        self.formObj.filterInfo = [
          {
            field: 'mineCompany',
            type: 'input',
            name: '煤矿企业',
            value: ''
          },
          {
            field: 'size',
            type: 'range',
            name: '产能区间(万吨)',
            value: {
              min: '',
              max: ''
            }
          },
//          {
//            field: 'timechange',
//            type: 'time',
//            name: '时间范围',
//            value: {
//                startDate: '',
//                endDate: ''
//            }
//          },
          {
            field: 'economy',
            type: 'radio',
            name: '显示关闭矿井',
            value: [{
              label: '是',
              value: '是'
            }, {
              label: '否',
              value: '否'
            }]
          }, {
            field: 'mineClassify',
            type: 'radio',
            name: '瓦斯等级',
            value: [{
              label: '低瓦斯矿井',
              value: '低瓦斯矿井'
            }, {
              label: '高瓦斯矿井',
              value: '高瓦斯矿井'
            }, {
              label: '突出矿井',
              value: '突出矿井'
            }, {
              label: '待定',
              value: '待定'
            }]
          }, {
            field: 'mineStatus',
            type: 'radio',
            name: '许可证状态',
            value: [{
              label: '未办证',
              value: '未办证'
            }, {
              label: '持证(正常)',
              value: '持证(正常)'
            }, {
              label: '持证(暂扣)',
              value: '持证(暂扣)'
            }, {
              label: '正常注销',
              value: '正常注销'
            }, {
              label: '吊销',
              value: '吊销'
            }]
          }, {
            field: 'standarLevel',
            type: 'radio',
            name: '标准化等级',
            value: [{
              label: '一级',
              value: '一级'
            }, {
              label: '二级',
              value: '二级'
            }, {
              label: '三级',
              value: '三级'
            }, {
              label: '未达标',
              value: '未达标'
            }, {
              label: '未评定',
              value: '未评定'
            }]
          }, {
            field: 'mineType',
            type: 'radio',
            name: '煤矿类型',
            value: [{
              label: '国有重点',
              value: '国有重点'
            }, {
              label: '地方国有',
              value: '地方国有'
            }, {
              label: '乡镇煤矿',
              value: '乡镇煤矿'
            }]
          }, {
            field: 'economicsType',
            type: 'select',
            name: '经济类型',
            value: [{
              label: '公有经济',
              value: '公有经济'
            }, {
              label: '国有经济',
              value: '国有经济'
            }, {
              label: '集体经济',
              value: '集体经济'
            }, {
              label: '非公有经济',
              value: '非公有经济'
            }, {
              label: '私有经济',
              value: '私有经济'
            }, {
              label: '港澳台经济',
              value: '港澳台经济'
            }, {
              label: '外商经济',
              value: '外商经济'
            }]
          }, {
            field: 'mineState',
            type: 'select',
            name: '矿井情况',
            value: [{
              label: '拟建矿井',
              value: '拟建矿井'
            }, {
              label: '新建矿井',
              value: '新建矿井'
            }, {
              label: '生产矿井',
              value: '生产矿井'
            }, {
              label: '改扩建矿井',
              value: '改扩建矿井'
            }, {
              label: '改建矿井',
              value: '改建矿井'
            }, {
              label: '扩建矿井',
              value: '扩建矿井'
            }, {
              label: '长期停产矿井',
              value: '长期停产矿井'
            }, {
              label: '停工矿井',
              value: '停工矿井'
            }, {
              label: '已关闭矿井',
              value: '已关闭矿井'
            }, {
              label: '正在实施关闭矿井',
              value: '正在实施关闭矿井'
            }, {
              label: '停建矿井',
              value: '停建矿井'
            }, {
              label: '长期停产矿井(长期没法联系)',
              value: '长期停产矿井(长期没法联系)'
            }]
          }, {
            field: 'mineLevel',
            type: 'radio',
            name: '矿井井型',
            value: [{
              label: '特大型煤矿',
              value: '特大型煤矿'
            }, {
              label: '大型矿井',
              value: '大型矿井'
            }, {
              label: '中型矿井',
              value: '中型矿井'
            }, {
              label: '小型矿井',
              value: '小型矿井'
            }]
          }, {
            field: 'methodType',
            type: 'radio',
            name: '开采类型',
            value: [{
              label: '露天',
              value: '露天'
            }, {
              label: '井工',
              value: '井工'
            }]
          }, {
            field: 'productMethods',
            type: 'select',
            name: '开拓方式',
            value: [{
              label: '立井',
              value: '立井'
            }, {
              label: '斜井',
              value: '斜井'
            }, {
              label: '平硐',
              value: '平硐'
            }, {
              label: '立井斜井混合',
              value: '立井斜井混合'
            }, {
              label: '平硐斜井混合',
              value: '平硐斜井混合'
            }, {
              label: '片盘斜井混合',
              value: '片盘斜井混合'
            }, {
              label: '其余',
              value: '其余'
            }, {
              label: '公路运输',
              value: '公路运输'
            }, {
              label: '固定坑线',
              value: '固定坑线'
            }]
          }, {
            field: 'transportMethod',
            type: 'radio',
            name: '运输方式',
            value: [{
              label: '皮带运输',
              value: '皮带运输'
            }, {
              label: '电机车牵引',
              value: '电机车牵引'
            }, {
              label: '调度绞车',
              value: '调度绞车'
            }, {
              label: '人力绞车',
              value: '人力绞车'
            }, {
              label: '人力手推矿车',
              value: '人力手推矿车'
            }, {
              label: '其余',
              value: '其余'
            }]
          }, {
            field: 'windMethod',
            type: 'select',
            name: '通风方式',
            value: [{
              label: '中央并列压入',
              value: '中央并列压入'
            }, {
              label: '中央分列压入',
              value: '中央分列压入'
            }, {
              label: '对角压入',
              value: '对角压入'
            }, {
              label: '中央并列推出',
              value: '中央并列推出'
            }, {
              label: '中央分列抽出',
              value: '中央分列抽出'
            }, {
              label: '对角抽出',
              value: '对角抽出'
            }, {
              label: '其余',
              value: '其余'
            }]
          }, {
            field: 'electricMethod',
            type: 'radio',
            name: '供电方式',
            value: [{
              label: '双回路',
              value: '双回路'
            }, {
              label: '双电源',
              value: '双电源'
            }, {
              label: '单回路',
              value: '单回路'
            }]
          }, {
            field: 'mineFire',
            type: 'radio',
            name: '煤层自燃倾向性',
            value: [{
              label: '不易自燃',
              value: '不易自燃'
            }, {
              label: '容易自燃',
              value: '容易自燃'
            }, {
              label: '自燃',
              value: '自燃'
            }, {
              label: '未检测',
              value: '未检测'
            }]
          }
        ]
      }
      let newForm = {}
      self.formObj.filterInfo.forEach(item => {
        if (item.type === 'range') {
          newForm[item.field] = {min: '', max: ''}
        } else if (item.type === 'time') {
          newForm[item.field] = {startDate: '', endDate: ''}
        } else if (item.type === 'checkbox') {
          newForm[item.field] = []
        } else {
          newForm[item.field] = ''
        }
      })
      // 获取搜索参数表单
      self.form = newForm
    },
    mounted() {
    },
    components: {},
    methods: {
      /**
       * 点击+,显示更多筛选
       * */
      clickMore() {
        $('.show-more-child').toggleClass('slow-show')
      },
      /**
       * 关闭更多筛选
       * */
      closeMore() {
        $('.show-more-child').toggleClass('slow-show')
      },
      /**
       * 点击智能搜索
       * */
      onSubmitForm() {
        let self = this
        let data = {}
        data.action = 'optionsSearch'
        data.data = self.form
        self.$emit('data', data)
      },
      /**
       * 重置搜索
       * */
      onResetForm(formName) {
        let self = this
        self.$refs[formName].resetFields()
        self.formObj.filterInfo.forEach(item => {
          if (item.type === 'range') {
            self.form[item.field] = {min: '', max: ''}
          } else if (item.type === 'time') {
            self.form[item.field] = {startDate: '', endDate: ''}
          }
        })
      },
      /**
       * 输入内容开始匹配,显示提示框
       * */
      querySearch(queryString, cb) {
        // 这里设置智能提示内容数组
        let restaurants = [
          {value: '北京联华矿业有限公司'}
        ]
        let results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants
        // 调用 callback 返回建议列表的数据
        cb(results)
      },
      /**
       * 检索搜索内容的匹配,只匹配开头===0或是含有!==-1
       * */
      createFilter(queryString) {
        return (restaurant) => {
          return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) !== -1)
        }
      },
      handleSelect(item) {
      }
    }
  }
</script>
<style rel="stylesheet/scss" lang="scss">
  .show-more-box {
    display: inline-block;
    width: 40px;
    margin-left: 30px;
    margin-top: 15px;
    height: 40px;
    position: relative;
    color: #fff;
    .show-more {
      display: inline-block;
      width: 40px;
      height: 40px;
      color: #fff;
      font-size: 2em;
      text-align: center;
      line-height: 35px;
      border-radius: 15px;
      background: rgba(51, 69, 255, 0.8);
      cursor: pointer;
    }
    .show-more-child {
      width: 600px;
      background: radial-gradient(ellipse at center, #4266C1 0%, #0A339A 47%, rgba(21, 42, 95, 1) 100%);
      /*background: rgba(21, 42, 95, 1);*/
      transform: scale(0);
      transform-origin: top left;
      transition: all 0.5s;
      position: absolute;
      top: 0;
      left: 0px;
      z-index: 9;
      border-radius: 15px;
    }
    .more-header {
      background: #20a0ff;
      height: 50px;
      border-top-left-radius: 15px;
      border-top-right-radius: 15px;
    }
    .more-title {
      line-height: 50px;
      margin-left: 20px;
      color: #fff;
      font-size: 1em;
    }
    .more-body {
      border-bottom-left-radius: 15px;
      border-bottom-right-radius: 15px;
      border: 1px solid #20a0ff;
    }
    .search-form {
      margin-top: 15px;
      .el-form-item {
        margin-bottom: 0px;
      }
      label {
        color: #fff;
      }
      input {
        background: transparent;
        border: 1px solid #20a0ff;
        color: #fff;
      }
      .el-radio-button__inner {
        background: transparent;
        border: 1px solid #20a0ff;
        color: #fff;
      }
      .el-checkbox-button__inner {
        background: transparent;
        border: 1px solid #20a0ff;
        color: #fff;
      }
      .is-active {
        .el-radio-button__inner {
          background: #20a0ff;
          border: 1px solid #20a0ff;
          color: #fff;
        }
        span {
          border: none;
        }
      }
      .is-checked {
        .el-checkbox-button__inner {
          background: #20a0ff;
          border: 1px solid #20a0ff;
          color: #fff;
        }
        span {
          border: none;
        }
      }
      .date-picker {
        width: 94%;
        margin: 0;
        .el-form-item {
          margin-bottom: 0;
        }
      }
      input[type=number] {
        -moz-appearance: textfield;
      }
      input[type=number]::-webkit-inner-spin-button,
      input[type=number]::-webkit-outer-spin-button {
        -webkit-appearance: none;
        margin: 0;
      }
    }
    .close {
      color: #fff;
      border-radius: 12px;
      line-height: 20px;
      text-align: center;
      height: 20px;
      width: 20px;
      font-size: 22px;
      padding: 5px;
      top: 10px;
      right: 10px;
      position: absolute;
      transition: all 0.5s;
    }
    .close::before {
      content: "\2716";
    }
    .close:hover {
      /*background: rgba(51, 69, 255, 0.8);*/
      background: #ED1C24;
    }
    .slow-show {
      transform: scale(1);
    }
    .m-b-15 {
      margin-bottom: 15px;
    }
  }
</style>

图片描述

相关文章
相关标签/搜索