vue需要近期研究的项目web

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

2021-11-17  本文已影响0人  爱学习的小仙女早睡早起

项目中经常有这种搜索条件,每次都要写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);

持续更新中·

上一篇下一篇

猜你喜欢

热点阅读