搜索栏封装

使用element-ui弄了个简单的表单搜索栏组件,适用于一般的管理后台。效果如下:


效果
点击搜索按钮

1.重置按钮默认存在,如果不需要可以通过showResetBtn隐藏
2.通过设置formOptions来设置需要的表单内容
3.设置btnItems来设置按钮,并且默认点击的时候都会返回整个表单内容
4.需要返回值在callBack中写入参数即可

btnItems: [
        {
          txt: '搜索', // 按钮名称
          type: 'primary', 
          callBack: (val) => {
            _self.test(val)
          }, // 回调,可通过回调返回整个表单内容,回调方法写在methods中,通过重新定义this
        },
        {
          txt: '导出',
          type: 'primary',
          callBack: () => {
            _self.test2()
          }, // 不需要返回值
        }
      ], // 按钮数据

5.表单类型包括input/select/time/date,可以根据需求进行更改

组件页面
// search-column.vue
<template>
  <div class="search-column-box">
    <el-form :model="formData" ref="_form" :inline="true">
      <el-form-item
        v-for="(item, index) in formOptions"
        :key="index"
        :prop="item.prop"
        :label="item.label ? item.label + ':' : ''"
        :rules="item.rules"
        :label-width="labelWidth"
      >
        <!-- input -->
        <el-input
          v-if="item.element === 'el-input'"
          style="width: 199px"
          :size="item.size ? item.size : 'small'"
          :type="item.type"
          :disabled="item.disabled"
          v-model="formData[item.prop]"
          :placeholder="item.placeholder || '请输入'"
        ></el-input>

        <!-- select -->
        <el-select
          v-if="item.element === 'el-select'"
          style="width: 199px"
          :size="item.size ? item.size : 'small'"
          v-model="formData[item.prop]"
          :disabled="item.disabled"
          :clearable="item.clearable"
        >
          <el-option
            v-for="option in item.options"
            :key="option.value"
            :label="option.label"
            :value="option.value"
          ></el-option>
        </el-select>

        <!-- time-select -->
        <el-time-select
          v-if="item.element === 'el-time-select' && !item.isRange"
          :size="item.size ? item.size : 'small'"
          style="width: 199px"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          :picker-options="item.pickerOptions"
          :is-range="item.isRange"
          :disabled="item.disabled"
          placeholder="选择时间"
        >
        </el-time-select>

        <el-time-picker
          v-if="item.element === 'el-time-select' && item.isRange"
          :size="item.size ? item.size : 'small'"
          is-range
          :disabled="item.disabled"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          range-separator="至"
          start-placeholder="开始时间"
          end-placeholder="结束时间"
          placeholder="选择时间范围"
        >
        </el-time-picker>

        <!-- el-date-picker -->
        <el-date-picker
          v-if="item.element === 'el-date-picker' && !item.isRange"
          :size="item.size ? item.size : 'small'"
          style="width: 199px"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          :type="item.type"
          :disabled="item.disabled"
          clearable
          :format="item.format"
          :placeholder="item.placeholder || '请选择'"
        ></el-date-picker>

        <el-date-picker
          v-if="item.element === 'el-date-picker' && item.isRange"
          :size="item.size ? item.size : 'small'"
          v-model="formData[item.prop]"
          :value-format="item.valueFormat"
          type="daterange"
          :disabled="item.disabled"
          range-separator="至"
          start-placeholder="开始日期"
          end-placeholder="结束日期"
          :picker-options="item.pickerOptions"
        >
        </el-date-picker>
      </el-form-item>
      <el-form-item>
        <el-button
          @click="search"
          type="primary"
          icon="el-icon-search"
          size="mini"
          >搜索</el-button
        >
        <el-button
          v-if="showResetBtn"
          @click="reset"
          size="mini"
          icon="el-icon-refresh"
          >重置</el-button
        >
        <el-button
          size="mini"
          v-for="(item, index) in btnItems"
          plain
          :icon="item.icon"
          :key="index"
          :type="item.type"
          :v-hasPermi="item.hasPermi"
          @click="item.callBack(formData)"
        >
          {{ item.txt }}
        </el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "searchColumn",
  data() {
    return {
      formData: {},
    };
  },
  props: {
    formOptions: {
      type: Array,
      default() {
        return [];
      },
    }, // 表单数组
    btnItems: {
      type: Array,
      default() {
        return [];
      },
    }, // 按钮数组
    showResetBtn: {
      type: Boolean,
      default: false,
    }, // 重置按钮,默认显示
    labelWidth: {
      type: String,
      default: "",
    }, // label的宽
    rules: {
      type: Array,
      default() {
        return [];
      },
    }, // rules设置
  },
  mounted() {
    // 给表单添加属性
    this.formOptions.forEach((item) => {
      this.$set(
        this.formData,
        item.prop,
        item.default || item.default === 0 ? item.default : ""
      );
    });
  },
  methods: {
    // 搜索
    search() {
      this.$emit("search", this.formData);
    },
    // 重置
    reset() {
      this.$refs._form.resetFields();
      this.formOptions.forEach((item) => {
        this.$set(
          this.formData,
          item.prop,
          item.default || item.default === 0 ? item.default : ""
        );
      });
      this.$emit("search", this.formData);
    },
  },
};
</script>

<style lang="scss" scoped>
.search-column-box {
}
</style>
使用页
<template>
  <div>
    <search :formOptions="formOptions" :btnItems="btnItems" @reset="reset"/>
  </div>
</template>

<script>
  import search from './components/search'

export default {
  components: {
    search,
  },
 data() {
  const _self = this // 保存this,按钮回调用到
  const getPickerOptions = () => {
      let pickerOptions = {
        shortcuts: [{
          text: '最近一周',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近一个月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
            picker.$emit('pick', [start, end]);
          }
        }, {
          text: '最近三个月',
          onClick(picker) {
            const end = new Date();
            const start = new Date();
            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
            picker.$emit('pick', [start, end]);
          }
        }]
      }
      return pickerOptions
    }; // 日期快捷方式
  return {
     formOptions: [
        {
          label: '意见内容', // 文字
          prop: 'content', // 绑定值
          element: 'el-input', // 显示类型
          placeholder: '请输入意见内容',
        },
        {
          label: '类型',
          prop: 'type',
          element: 'el-select',
          default: 1, // 默认值
          options: [
            { label: '给点意见', value: '1' },
            { label: '售后问题', value: '2' },
          ], // 选项
        },
        {
          label: '提交时间',
          prop: 'timeRange',
          element: 'el-time-select',
          pickerOptions: {
            start: '07:30',
            step: '00:15',
            end: '18:30'
          }, // 起止、间隔时间
          isRange: true, // 范围
        },
        {
          label: '提交日期',
          prop: 'dateRange',
          element: 'el-date-picker',
          type: 'week',  
          format: 'yyyy 第 WW 周', // 显示样式
        },
        {
          label: '选择日期范围',
          prop: 'dateRange1',
          element: 'el-date-picker',
          isRange: true, // 范围
        },
        {
          label: '选择日期范围',
          prop: 'dateRange2',
          element: 'el-date-picker',
          isRange: true,
          pickerOptions: getPickerOptions(), // 日期快捷方式
        },
      ], // 表单数据
      btnItems: [
        {
          txt: '添加设备',
          icon: "el-icon-plus",
          type: 'primary',
          callBack: (formData) => {
            _self.test(formData)
          }, // 回调,可通过回调返回整个表单内容,回调方法写在methods中
        }
        }
      ], // 按钮数据
  }
},
methods: {
  test(val) {
      console.log('搜索---', val)
    },
    test2() {
      console.log('导出---')
    },
},
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容