vue+elementUI 搜索栏公共组件封装,封装多搜索条件通用组件,超实用

项目中经常有这种搜索条件,每次都要写form 结构, 还要写查询,重置的方法,都是重复代码。
每次写起来都很繁琐、代码也夸张的多,而且多人开发情况下可控性太低;

所以考虑对 多条件搜索 做一个封装,统一配置引用,达到一次注册、全局使用,提升开发维护效率和界面统一的效果。

文末附加 一次注册全局使用 的方法。


image.png
image.png

对这种搜索条件进行了封装,支持在业务组件中异步加载下拉框数据。支持下拉框默认选中初始值。
添加了自动触发搜索的方法,能应对多种场景。

使用vue+elementUI,代码如下

BaseSearch.vue

<!-- 
    *名称:弹窗的搜索条件组件
    *功能:methods
      1.点击搜索的方法:@search
      2.搜索条件 props : formItemList
-->

<template>
    <div class="dialog-search">
        <el-form :inline="true" ref="ruleForm" :model="formInline" class="demo-form-inline">

             <el-form-item v-for="(item,index) in formItemList" :key="index" :label="item.label">
                <el-select v-if="item.type=='select'" v-model="formInline[item.param]" placeholder="请选择" size="mini">
                    <el-option v-for="(item2,index2) in item.selectOptions" :key="index2" :label="item2.name" :value="item2.value"></el-option>
                </el-select>
                <el-input v-if="item.type=='input'" v-model="formInline[item.param]" size="mini" placeholder="请输入"></el-input>
            </el-form-item>

            <el-form-item style="width:10rem">
                <el-button type="primary" size="mini" @click="onSubmit">查询</el-button>
                <el-button type="" size="mini" @click="resetForm('ruleForm')">重置</el-button> 
            </el-form-item>

            <!-- 可用于显示其他按钮 -->
            <slot></slot>
        </el-form>
    </div>
</template>

<script>
export default {
    name: "BaseSearch",
    props:{
        emitSearch:{   // 是否立即执行搜索
            type: Boolean,
            default: false
        },
        formItemList:{ 
            type: Array,
            default(){
                return [
                    {
                        label: '下拉框',
                        type: 'select',
                        selectOptions:[{name:111,value:111}],
                        param: 'company',
                        defaultSelect: "222",  // 下拉框默认选中项
                    },
                    {
                        label: '输入框',
                        type: 'input',
                        param: 'name'
                    }
                ]
            }
        }
    },
    data(){
        let formInline={}
        for(const obj of this.formItemList){
            formInline[obj.param] = obj.defaultSelect || "";
        }
        return{
            formInline,
        }
    },
    watch:{
        emitSearch(newVal,oldVal){  // 是否立即触发搜索  用在弹窗中异步请求下拉框后  或者给下拉框赋值默认值后  需要用到这个方法
            if(newVal){
                console.log("此时触发--立即执行搜索")
                this.$emit("search", this.formInline);
            }
        },
        formItemList:{  
            handler(newVal,oldVal){
                for(const obj of this.formItemList){
                    if(obj.defaultSelect){
                        formInline[obj.param] = obj.defaultSelect
                    }
                }
            },
            deep:true
        }
    },
    methods:{
        onSubmit() {
            // console.log('submit!',this.formInline);
            this.$emit('search',this.formInline)

        },
        resetForm(formName) {
            this.$refs[formName].resetFields();
            let formInline={}
            for(const obj of this.formItemList){
                // formInline[obj.param] = obj.defaultSelect || "";  // 重置时下拉框的默认值如果要保留就选用这个
                formInline[obj.param] = "";  // 所有筛选条件清空

            }
            this.formInline=formInline

            this.$emit('search',this.formInline)
        }
    }
}
</script>




<style lang="less" scoped>
.dialog-search{
    margin: 0 1rem;
    text-align: left;
    /deep/ .el-form-item__content{
        width: 16rem;
        .el-input{
            width: 16rem;
        }
        .el-select{
            .el-input__inner{
                // height: 3.2rem;
                width: 16rem;
            }
        }
    }
}
</style>

basesearch 组件大家也可以结合自己需要,再往里填充一些树形选择,单选框,复选框元素进去~~~


使用的时候只需要引入BaseSearch.vue
再传入formItemList,即能生成带下拉框和输入框的搜索条件,绑定search方法

<templete>
 <BaseSearch :formItemList="formItemList" :emitSearch="emitSearch"  @search="search" />

<BaseSearch :formItemList="formItemList"  @search="search" >
  <templete>
    <span>这里有个slot,可以在重置后放其他按钮,比如“导出”。</span>
  </templete>
</BaseSearch >

</templete>

<script>
 import BaseSearch from "@/components/BaseSearch.vue"
  export default {
    components:{
      BaseSearch
    },
    data() {
      return {
        dialogVisible: false,
        emitSearch: false,
        formItemList:[
          {
              label: '所属单位',
              type: 'select',
              selectOptions:[{name:111,value:111}],
              param: 'company'
          },
          {
              label: '化学品名称',
              type: 'input',
              param: 'name'
          },
          {
              label: '是否停用企业',
              type: 'select',
              selectOptions:[{name:111,value:111}],
              param: 'stop'
          },
       {
              label: '下拉框222',
              type: 'select',
              selectOptions:[{name:111,value:111}],
              param: 'parm222'
          },
        ],
       
      };
    },
  mounted(){
     // 此时请求下拉框的数据接口
    // axios。。。。
    //  this.formItemList[3].selectOptions = res.data
    // 其他下拉框的选项赋值
    //  这里判断 是否立即执行搜索
    // 全部下拉框的数据都塞进去后执行搜索
    // this.emitSearch=true

  },
    methods: {
      handleOpen(typeVal){
          this.dialogVisible=true
          this.formItemList[3].defaultSelect=typeVal || ""  // 打开弹窗时下拉框赋默认选中的值
        this.emitSearch=true
        
      },
      handleClose(done) {
        this.dialogVisible=false
      },
    search(params){  // 搜索条件改变时
        this.searchTableList(params)
      }
    }
  };
</script>


附加:全局注册组件的方法

全局注册后,不需要再引入BaseSearch ,直接用就行~

index.js

import BaseSearch from "./BaseSearch";

const array = [ BaseSearch];

const baseComponents = {
    install(vue) {
        for (let i = 0; i < array.length; i++) {
            vue.component(array[i].name, array[i]);
        }
    },
};

export default baseComponents;

main.js

import baseComponents from "./components/index";
Vue.use(baseComponents);

持续更新中·

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容