首页 > 其他分享 >vue封装搜索组件,自定义elment搜索组件

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

时间:2023-10-08 18:58:10浏览次数:37  
标签:obj 自定义 param label 搜索 value 组件 formInline children

组件案例

<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: 张大碗 [email protected]
 * @Date: 2023-09-06 16:49:57
 * @LastEditors: 张大碗 [email protected]
 * @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>

 

标签:obj,自定义,param,label,搜索,value,组件,formInline,children
From: https://www.cnblogs.com/web-jscss-dabao/p/17749863.html

相关文章

  • vue3子组件页面不更新
    写在前面这是一次滑铁卢,整整找了半天时间...项目结构我有一个组件A,A中定义了一个属性data:Object,A中将data赋值给了一个reactive类型的对象R。页面中均使用R。现象描述当调用A的父组件P更新了A的data后,A的页面不更新问题分析P更新A后,A是一个新的对象,但R仍然引用旧对象,导致产......
  • 闹着玩下网已屏蔽百度搜索引擎
    自从发表百度App的问题后,闹着玩下网似乎被K了,本来就想屏蔽百度,不过除了淘宝,一般很少有网站会去主动屏蔽搜索引擎,那差不多是断了流量来源,个人博客几乎不会这么做,为什么建议屏蔽呢?因为百度出个文心一言,这个所谓的文心一言大模型其实是通过读取搜索引擎内容训练学习,文心一言默认强制......
  • 【短道速滑十】非局部均值滤波的指令集优化和加速(针对5*5的搜索特例,可达到单核1080P灰
        非局部均值滤波(NonLocalMeans)作为三大最常提起来的去燥和滤波算法之一(双边滤波、非局部均值、BM3D),也是有着很多的论文作为研究和比较的对象,但是也是有着致命的缺点,速度慢,严重的影响了算法的应用范围。目前在已有的文献中尚未看到在不对算法的本质原理上做更改的情况......
  • 文字组件里的表格为什么分到两页
    问题:完全可以显示在一页上的表格为什么会分成两页解决方法:选取整个表格》开始》段落》换行和分页》分页组中除孤行控制以外全部取消》确定......
  • pytorch 自定义dataset类
    实现模版classour_dataset(Dataset):def__init__(self,···):super(our_dataset,self).__init__()#初始化,可以自定义添加参数def__getitem__(self,index):···returnimg,label#根据索引(0,len(dataset)-1)获取......
  • OPPO主题组件开发 - 组件内容自适应
    OPPO桌面有3*5、3*6、4*5、4*6、5*5、5*6等布局,随着布局不同,组件大小也会发生改变;不同型号手机分辨率不同,组件大小也不一致。这就要求组件内容做到自适应。说明OPPO主题组件自适应有两种表现方式,如下图所示。可以很明显的看到,第一种是根据宽高等比例缩放内容,第二种是固定内......
  • [转]oracle listener.ora中PLSExtPro 和ExtProc的作用(过时组件,官方建议删除以避免漏
    默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字通常是ExtProc或PLSExtProc,但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了,在不使用外部程序时,oracle也是建议删除的。PLSEx......
  • C# Model 自定义检验
    使Model实现IValidatableObject接口并重写Validate方法即可publicclassAuditIPKeepRecordApply_In:IValidatableObject{///<summary>///IP备案申请表主键id///</summary>[Required(ErrorMessage="IP备案申请表主键id不可为空"......
  • .Net7自定义GC垃圾回收器
    1.前言CLR和GC高度耦合,.Net7里面分离CLR和GC,则比较容易实现这件事情。本篇来看下,自定义一个GC垃圾回收器。2.概述这里首先演示下自定义GC垃圾回收后的效果。1.下载Custom.dll2.找到当前.Net目录,比如这里的7.0.10C:\ProgramFiles\dotnet\shared\Microsoft.NETCore.App\7.0.1......
  • 【Vue】自己编写排名组件
    一、需求分析这里我是用Echarts的柱状图,倒置下y轴x轴就实现了,然后产品说跟UI不一致我一看UI这种又给我整不会了,然后想拿Echarts改改参数搞定,同事和群友都是说自己做,不要用Echarts改 二、实现思路同事劝我用ElementUI的进度条组件来实现,进度条见:https://element.eleme.io/......