vue封装搜索组件,自定义elment搜索组件

发布时间 2023-10-08 18:36:26作者: 前端张大碗
组件案例
<template>
    <div class="dialog-search">
        <el-form :inline="true" ref="ruleForm" :model="formInline" class="demo-form-inline top-screen">
            <div class="top-screen-left">
                <el-form-item v-for="(item, index) in formItemList" :key="index">
                    <!-- 下拉选择框 -->
                    <el-select
                        v-if="item.type == 'select'"
                        v-model="formInline[item.param]"
                        :multiple="item.multiple"
                        :placeholder="'请选择' + item.label"
                        size="mini"
                        clearable
                        @clear="()=>clear(formInline[item.param],item.param)"
                    >
                        <el-option
                            v-for="(item2, index2) in item.selectOptions"
                            :key="index2"
                            :label="item2.text"
                            :value="item2.value"
                        ></el-option>
                    </el-select>
                    <!-- 下拉选择框end -->
                    <!-- 输入框 -->
                    <el-input
                        v-if="item.type == 'input'"
                        v-model="formInline[item.param]"
                        size="mini"
                        :placeholder="'请输入' + item.label"
                        @clear="()=>clear(formInline[item.param],item.param)"
                        clearable
                    ></el-input>
                    <!-- 输入框 -->
                    <!-- 日期范围选择框 -->
                    <el-date-picker
                        v-if="item.type == 'daterange' || item.type == 'datetimerange' || item.type == 'date' || item.type == 'datetime'"
                        v-model="formInline[item.param]"
                        :value-format="item.valueFormat || 'yyyy-MM-dd'"
                        :format="item.format || 'yyyy-MM-dd'"
                        clearable
                        :type="item.type || ''"
                        :range-separator="item.rangeSeparator || '至'"
                        :start-placeholder="item.startPlaceholder"
                        :end-placeholder="item.endPlaceholder"
                        :placeholder="'请选择' + item.label"
                        :startPlaceholder="item.label+'开始日期'"
                        :endPlaceholder="item.label+'结束日期'"
                        size="mini"
                         @clear="()=>clear(formInline[item.param],item.param)"
                    >
                    </el-date-picker>
                    <!-- 日期范围选择框end -->
                    <!-- 级联选择器 -->
                    <el-cascader
                        v-if="item.type == 'cascader'"
                        v-model="formInline[item.param]"
                        size="mini"
                        :options="item.options"
                        :props="item.props"
                        :placeholder="'请选择' + item.label"
                        clearable
                         @clear="()=>clear(formInline[item.param],item.param)"
                    ></el-cascader>
                    <!-- 级联选择器end -->
                </el-form-item>
                <slot name="formItem"></slot>
            </div>
            <div class="top-screen-right">
                <el-form-item v-if="isShowDefault">
                    <el-button
                        type=""
                        size="mini"
                        @click="resetForm('ruleForm')"
                        class="top-right-bottom top-right-Reset-bottom top-right-bottom-I"
                        >重置</el-button
                    >
                    <el-button type="primary" size="mini" @click="onSubmit" class="top-right-bottom top-right-bottom-I">查询</el-button>
                </el-form-item>

                <!-- 可用于显示其他按钮 -->
                <slot name="formButton" :item="formInline"></slot>
            </div>
        </el-form>
    </div>
</template>

<script>
export default {
    name: 'BaseSearch',
    props: {
        emitSearch: {
            // 是否立即执行搜索
            type: Boolean,
            default: false
        },
        isShowDefault:{
            //是否展示默认按钮
             default: true
        },
        formItemList: {
            type: Array,
            default() {
                return [
                    {
                        label: '下拉框',
                        type: 'select',
                        selectOptions: [{ text: 111, value: 111 }],
                        param: 'company',
                        defaultSelect: '222', // 下拉框默认选中项
                        multiple: false
                    },
                    {
                        label: '输入框',
                        type: 'input',
                        param: 'name'
                    },
                    {
                        label: '日期范围',
                        type: 'daterange',
                        param: 'createtime'
                    },
                    {
                        label: '级联选择器',
                        type: 'cascader',
                        param: 'cascader',
                        options: [],
                        props: { multiple: false }
                    }
                ];
            }
        }
    },
    data() {
        let formInline = {};
        for (const obj of this.formItemList) {
            formInline[obj.param] = obj.defaultSelect || null;
        }
        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: {
        clear(e,param){
            if(e===''){
                this.formInline[param]=null
            }
        },
        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] = null; // 所有筛选条件清空
            }
            this.formInline = formInline;

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

<style lang="scss" scoped>

.dialog-search {
    // margin: 0 1rem;
    // margin: 20px;
    // padding: 20px;
    // background-color: white;
    // 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>

引用方法

<!--
 * @Author: 张大碗 zhangjunhui@mangocosmos.com
 * @Date: 2023-09-06 16:49:57
 * @LastEditors: 张大碗 zhangjunhui@mangocosmos.com
 * @LastEditTime: 2023-09-08 14:59:20
 * @FilePath: 引用案例说明
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<template>
    <div class="divBox">
        <BaseSearch :formItemList="formItemList" @search="search">
            <div slot="formButton">
                <el-button type="primary" size="mini" @click="add">新增</el-button>
                <el-button type="primary" size="mini">操作按钮</el-button>
            </div>
        </BaseSearch>
    </div>
</template>

<script>
import BaseSearch from '@/components/searchCustom/index.vue';

export default {
    name: 'ceshi',
    components: { BaseSearch },
    data() {
        return {
            formItemList: [
                {
                    label: '下拉框单选:',
                    type: 'select',
                    selectOptions: [{ text: 111, value: 111 }],
                    param: 'company'
                },
                {
                    label: '化学品名称:',
                    type: 'input',
                    param: 'name'
                },
                {
                    label: '下拉框多选:',
                    type: 'select',
                    selectOptions: [],
                    multiple: true,
                    param: 'parm222'
                },
                {
                    label: '日期范围',
                    type: 'daterange',
                    param: 'createtime',
                    startPlaceholder: '开始日期',
                    endPlaceholder: '结束日期'
                },
                {
                    label: '级联选择器',
                    type: 'cascader',
                    param: 'cascader',
                    options: [
                        {
                            value: 'zhinan',
                            label: '指南',
                            children: [
                                {
                                    value: 'shejiyuanze',
                                    label: '设计原则',
                                    children: [
                                        {
                                            value: 'yizhi',
                                            label: '一致'
                                        },
                                        {
                                            value: 'fankui',
                                            label: '反馈'
                                        },
                                        {
                                            value: 'xiaolv',
                                            label: '效率'
                                        },
                                        {
                                            value: 'kekong',
                                            label: '可控'
                                        }
                                    ]
                                },
                                {
                                    value: 'daohang',
                                    label: '导航',
                                    children: [
                                        {
                                            value: 'cexiangdaohang',
                                            label: '侧向导航'
                                        },
                                        {
                                            value: 'dingbudaohang',
                                            label: '顶部导航'
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            value: 'zujian',
                            label: '组件',
                            children: [
                                {
                                    value: 'basic',
                                    label: 'Basic',
                                    children: [
                                        {
                                            value: 'layout',
                                            label: 'Layout 布局'
                                        },
                                        {
                                            value: 'color',
                                            label: 'Color 色彩'
                                        },
                                        {
                                            value: 'typography',
                                            label: 'Typography 字体'
                                        },
                                        {
                                            value: 'icon',
                                            label: 'Icon 图标'
                                        },
                                        {
                                            value: 'button',
                                            label: 'Button 按钮'
                                        }
                                    ]
                                },
                                {
                                    value: 'form',
                                    label: 'Form',
                                    children: [
                                        {
                                            value: 'radio',
                                            label: 'Radio 单选框'
                                        },
                                        {
                                            value: 'checkbox',
                                            label: 'Checkbox 多选框'
                                        },
                                        {
                                            value: 'input',
                                            label: 'Input 输入框'
                                        },
                                        {
                                            value: 'input-number',
                                            label: 'InputNumber 计数器'
                                        },
                                        {
                                            value: 'select',
                                            label: 'Select 选择器'
                                        },
                                        {
                                            value: 'cascader',
                                            label: 'Cascader 级联选择器'
                                        },
                                        {
                                            value: 'switch',
                                            label: 'Switch 开关'
                                        },
                                        {
                                            value: 'slider',
                                            label: 'Slider 滑块'
                                        },
                                        {
                                            value: 'time-picker',
                                            label: 'TimePicker 时间选择器'
                                        },
                                        {
                                            value: 'date-picker',
                                            label: 'DatePicker 日期选择器'
                                        },
                                        {
                                            value: 'datetime-picker',
                                            label: 'DateTimePicker 日期时间选择器'
                                        },
                                        {
                                            value: 'upload',
                                            label: 'Upload 上传'
                                        },
                                        {
                                            value: 'rate',
                                            label: 'Rate 评分'
                                        },
                                        {
                                            value: 'form',
                                            label: 'Form 表单'
                                        }
                                    ]
                                },
                                {
                                    value: 'data',
                                    label: 'Data',
                                    children: [
                                        {
                                            value: 'table',
                                            label: 'Table 表格'
                                        },
                                        {
                                            value: 'tag',
                                            label: 'Tag 标签'
                                        },
                                        {
                                            value: 'progress',
                                            label: 'Progress 进度条'
                                        },
                                        {
                                            value: 'tree',
                                            label: 'Tree 树形控件'
                                        },
                                        {
                                            value: 'pagination',
                                            label: 'Pagination 分页'
                                        },
                                        {
                                            value: 'badge',
                                            label: 'Badge 标记'
                                        }
                                    ]
                                },
                                {
                                    value: 'notice',
                                    label: 'Notice',
                                    children: [
                                        {
                                            value: 'alert',
                                            label: 'Alert 警告'
                                        },
                                        {
                                            value: 'loading',
                                            label: 'Loading 加载'
                                        },
                                        {
                                            value: 'message',
                                            label: 'Message 消息提示'
                                        },
                                        {
                                            value: 'message-box',
                                            label: 'MessageBox 弹框'
                                        },
                                        {
                                            value: 'notification',
                                            label: 'Notification 通知'
                                        }
                                    ]
                                },
                                {
                                    value: 'navigation',
                                    label: 'Navigation',
                                    children: [
                                        {
                                            value: 'menu',
                                            label: 'NavMenu 导航菜单'
                                        },
                                        {
                                            value: 'tabs',
                                            label: 'Tabs 标签页'
                                        },
                                        {
                                            value: 'breadcrumb',
                                            label: 'Breadcrumb 面包屑'
                                        },
                                        {
                                            value: 'dropdown',
                                            label: 'Dropdown 下拉菜单'
                                        },
                                        {
                                            value: 'steps',
                                            label: 'Steps 步骤条'
                                        }
                                    ]
                                },
                                {
                                    value: 'others',
                                    label: 'Others',
                                    children: [
                                        {
                                            value: 'dialog',
                                            label: 'Dialog 对话框'
                                        },
                                        {
                                            value: 'tooltip',
                                            label: 'Tooltip 文字提示'
                                        },
                                        {
                                            value: 'popover',
                                            label: 'Popover 弹出框'
                                        },
                                        {
                                            value: 'card',
                                            label: 'Card 卡片'
                                        },
                                        {
                                            value: 'carousel',
                                            label: 'Carousel 走马灯'
                                        },
                                        {
                                            value: 'collapse',
                                            label: 'Collapse 折叠面板'
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            value: 'ziyuan',
                            label: '资源',
                            children: [
                                {
                                    value: 'axure',
                                    label: 'Axure Components'
                                },
                                {
                                    value: 'sketch',
                                    label: 'Sketch Templates'
                                },
                                {
                                    value: 'jiaohu',
                                    label: '组件交互文档'
                                }
                            ]
                        }
                    ]
                }
            ]
        };
    },
    mounted() {
        // 此时请求下拉框的数据接口
        // 请求字典,把每个下拉option赋值
        this.formItemList.forEach(element => {
            switch (element.param) {
                case 'parm222':
                    element.selectOptions = [
                        { text: 111, value: 111 },
                        { text: 222, value: 222 }
                    ];
                    break;

                default:
                    break;
            }
        });

        this.getList();
    },

    methods: {
        getList(num) {},
        search(params) {
            console.log(params);
            // 搜索条件改变时
        },
        deleteHandle() {},
        add() {
            console.log('新增');
        },
        close() {
            console.log('关闭');
        }
    }
};
</script>

<style lang="scss" scoped></style>