vue+el-select下拉实现:全选、反选、清空功能

news2024/10/5 21:13:32

问题描述:

el-select下拉框要求实现全选功能。具体功能包括:

  • 当选择【全选】时,所有选项全部被勾选;
  • 当选择【反选】时,已选择选项变为未选择选项,未选项变为已选项
  • 当选择【清空】时,所有选项变为未选

如下图:

解决方法:

1、给el-select增加【全选】【清空】【反选】按钮

2、为el-select绑定change事件和remove-tag事件,具体实现全选功能写在事件中

实例代码:

组件:

<el-form-item label="关联设备" v-if="node.nodeId != 11 && node.nodeId != 21 && node.nodeId != 22 ">
                        <el-select style="width: 100% " v-model="node.devices" size="small" multiple collapse-tags filterable placeholder="请选择" :filter-method="dataDevFilter">
                            <div class="select_up">
                                <el-button type="text" v-on:click="selectDevAll">
                                    <i class="el-icon-circle-check" />
                                    全选</el-button>
                                <el-button type="text" v-on:click="removeDevTag">
                                    <i class="el-icon-close" />
                                    清空</el-button>
                                <el-button type="text" v-on:click="selectDevReverse">
                                    <i class="el-icon-copy-document" />
                                    反选</el-button>
                            </div>
                            <div class="select_list">
                                <el-option
                                    v-for="item in devOptions"
                                    :key="item.deviceCode"
                                    :label="item.deviceName"
                                    :value="item.deviceCode">
                                </el-option>
                            </div>
                        </el-select>
                    </el-form-item>

 js方法:

//用户列表----start
            //清空操作
            removeTag() {
                this.node.users = []
            },
            //全选操作
            selectAll(val) {
                this.options.map(item => {
                    if(!this.node.users.includes(item.userName)){
                        this.node.users.push(item.userName)
                    }
                })
                console.log(this.node.users)
            },
            //反选操作
            selectReverse(val) {
                val = []
                this.options.map(item => {
                    let index = this.node.users.indexOf(item.userName);
                    //判断现有选中数据是否包含如果不包含则进行反选数据
                    if (index != -1) {
                    } else {
                        val.push(item.userName)
                    }
                })
                this.node.users = val
            },

            dataFilter(query) {
                // this.value = val //给绑定值赋值
        
                if(query == ''){            
                //val不存在还原数组
                this.options= this.userList
                }else{
                    let result = [] //存储符合条件的下拉选项
                    this.userList.forEach(val=>{
                        if(val.nickName.indexOf(query)!=-1) result.push(val)
                    })
                    this.options = result
                }
            },
            //用户列表----end

css样式:

<style>
    

    .el-select-dropdown__list {
        height: 100%;
        overflow: hidden;

    }

    .select_up {
        padding: 0 14px;
        font-size: 14px;
        position: absolute;
        z-index: 99999;
        background-color: white;
        top: 0px;
        width: 100%;
        border-radius: 5px 5px 0 0;

        ::v-deep .el-button {
            color: #bcbcbc;
            font-size: 14px;

            i {
                font-size: 14px;
            }
        }

        ::v-deep .el-button:hover {
            color: #409EFF;
        }

        .el-button+.el-button {
            margin-left: 6px;
        }
    }

    .select_list {
        margin-top: 25px;
    }
</style>

完整组件

子组件代码如下,请注意代码注释的讲解:

1、props里面需定义value(双向绑定默认的变量,可自定义),父组件通过v-model绑定的fatherValue 会传给子组件props的 value

2、子组件的input框添加@change事件触发sendMsg,sendMsg向父组件传递change事件(双向绑定默认事件,可自定义),同时传递childValue的值

3、添加value的watch监听,当value变化时传递最新值给childValue

<template>
    <div>
        <el-select style="width: 100% " 
        v-model="orgData" 
        size="small" 
        multiple 
        collapse-tags 
        filterable 
        placeholder="请选择" 
        :filter-method="dataFilter"
        @change="sendMsg()" >
            <div class="select_up">
                <el-button type="text" v-on:click="selectAll">
                    <i class="el-icon-circle-check" />
                    全选</el-button>
                <el-button type="text" v-on:click="removeTag">
                    <i class="el-icon-close" />
                    清空</el-button>
                <el-button type="text" v-on:click="selectReverse">
                    <i class="el-icon-copy-document" />
                    反选</el-button>
            </div>
            <div class="select_list">
                <el-option
                    v-for="item in options"
                    :key="item.userName"
                    :label="item.nickName"
                    :value="item.userName">
                </el-option>
            </div>
        </el-select>

    </div>
</template>
<script>
export default {
    props: {
        value: {
            type: Array,
            required: []
        },
        userList: {
            type: Array,
            required: []
        },
        options: {
            type: Array,
            required: []
        },
    
    },
    watch: {
        //监听value变化(slect控件不是必要,暂时不明)
        value(newValue, oldValue) {
            this.orgData = newValue;
        }
    },
    data() {
        return {
            orgData: [],//选中数据
        }
    },
    methods: {
        //用户列表----start
            //清空操作
            removeTag() {
                this.orgData = []
            },
            //全选操作
            selectAll(val) {
                this.options.map(item => {
                    if(!this.orgData.includes(item.userName)){
                        this.orgData.push(item.userName)
                    }
                })
                console.log(this.orgData)
            },
            //反选操作
            selectReverse(val) {
                val = []
                this.options.map(item => {
                    let index = this.orgData.indexOf(item.userName);
                    //判断现有选中数据是否包含如果不包含则进行反选数据
                    if (index != -1) {
                    } else {
                        val.push(item.userName)
                    }
                })
                this.orgData = val
            },

            dataFilter(query) {
                // this.value = val //给绑定值赋值
        
                if(query == ''){            
                //val不存在还原数组
                this.options= this.userList
                }else{
                    let result = [] //存储符合条件的下拉选项
                    this.userList.forEach(val=>{
                        if(val.nickName.indexOf(query)!=-1) result.push(val)
                    })
                    this.options = result
                }
            },
            //用户列表----end

        sendMsg(){
            //input是默认双向绑定事件,select控件也可以用input给父组件传递数据
            this.$emit('input',this.orgData)
        }


        
    }
}
</script>
<style scoped lang="scss">
    .el-select-dropdown__list {
        height: 100%;
        overflow: hidden;

    }

    .select_up {
        padding: 0 14px;
        font-size: 14px;
        position: absolute;
        z-index: 99999;
        background-color: white;
        top: 0px;
        width: 100%;
        border-radius: 5px 5px 0 0;

        ::v-deep .el-button {
            color: #bcbcbc;
            font-size: 14px;

            i {
                font-size: 14px;
            }
        }

        ::v-deep .el-button:hover {
            color: #409EFF;
        }

        .el-button+.el-button {
            margin-left: 6px;
        }
    }

    .select_list {
        margin-top: 25px;
    }
</style>

父组件引用

<script>
    import userSelect from '@/views/processEngine/unit/userSelect'

    export default {
        components: {
            userSelect,deviceSelect
        },


</script>
<el-form-item label="关联人员">
    <userSelect v-model="node.users" :userList="userList" :options="userList" ></userSelect>
</el-form-item>

注意:

        当传值的时候,v-model触发了input事件, 而组件中的props属性默认就使用传入的value值,   但是回传的时候  是通过emit触发的input事件。  如果没有emit, 那么就不会触发input   也就不会反向传值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/642866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot进阶学习?看这篇就够了

相信从事Java开发的朋友都听说过SSM框架&#xff0c;老点的甚至经历过SSH&#xff0c;说起来有点恐怖&#xff0c;比如我就是经历过SSH那个时代未流。当然无论是SSM还是SSH都不是今天的重点&#xff0c;今天要说的是Spring Boot&#xff0c;一个令人眼前一亮的框架&#xff0c;…

作用域详解

作用域详解 1、概念2、分类2.1 全局作用域2.2 局部作用域2.2.1 函数作用域2.2.2 块级作用域2.2.3 块级作用域与函数声明 1、概念 JavaScript中的作用域是指变量、函数和对象在代码中可访问的范围。作用域规定了代码中的标识符&#xff08;变量名、函数名等&#xff09;在何处和…

ansible自动部署zabbix监控平台

目录 ansible端部署 使用ansible配置zabbix-mysql端 使用ansible配置zabbix-server端 使用ansible配置zabbix-agent端 一键部署zabbix Ansible是一款开源的自动化运维工具&#xff0c;可以通过SSH协议远程自动化地执行一些复杂的IT工作&#xff0c;例如程序部署、配置管理、…

Python自动化测试——postman,jmeter接口测试

关于众所postman&#xff0c;jmeter&#xff0c;做自动化测试的我想对这两个词并不陌生。大家都知道postman用来做接口测试很方便,下面我们就用一些例子来演示一下它该如何进行接口测试&#xff1a; 首先我们来介绍一下接口测试的概念&#xff1a; 1、什么是接口测试&#xf…

【裸机开发】内核时钟 PLL1 配置实验(一)—— 寄存器分析篇

本章主要会回答以下问题 &#xff1f; imx6u 的时钟源来自于哪 &#xff1f;为什么一个起始时钟源&#xff0c;最终分成了多路&#xff1f;不同的时钟源是如何与外设对应起来的&#xff1f;&#xff08;时钟树&#xff09;要配置内核时钟频率 有哪些步骤 &#xff1f;涉及到哪…

NLP学习笔记十一-word2vec模型

NLP学习笔记十一-word2vec模型 再介绍word2vec模型之前&#xff0c;我们需要先介绍一些背景知识。 我们只知道&#xff0c;NLP这一领域在ward2vec出现之前肯定也是有很大程度发展的&#xff0c;那么想要用将自然语言用计算机进行处理&#xff0c;进行计算&#xff0c;我们必须…

JQuery全部详细笔记-下

JQuery全部详细笔记-下 jQuery 的 DOM 操作 查找节点, 修改属性 查找属性节点: 查找到所需要的元素之后, 可以调用 jQuery 对象的 attr() 方法来获取它的各种属性值 应用实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

RK3288 Android8.1添加lvds以及gt9触摸屏(二)

现在先说gt9触摸屏如何配置 首先拿到硬件厂商提供的cfg以及gt9xx文件夹 驱动源码路径&#xff1a;kernel/drivers/input/touchscreen/gtxx 注&#xff1a;可以自己定义最后把gt9xx.h以及gt9xx.c文件放在哪&#xff0c;放在哪就在makefile里指定对应位置 1.touchscreen文件夹…

耗时108天,阿里P8总结了 1000 道 Java 工程师面试题

半年前还在迷茫该学什么&#xff0c;怎样才能走出现在的困境&#xff0c;半年后已经成功上岸阿里&#xff0c;感谢在这期间帮助我的每一个人。 面试中总结了 1000 道经典的 Java 面试题&#xff0c;里面包含面试要回答的知识重点&#xff0c;并且我根据知识类型进行了分类&…

写一个自定义View你都需要注意什么

本文主要是记录一下继承子View&#xff0c;所需要实现的方法&#xff0c;以及对自己的知识做一下梳理和记录&#xff0c;其中不少内容觉得自己应该是会的&#xff0c;但是实际写起来&#xff0c;还是遇到不少阻碍 构造方法 首先构造先了解一下构造方法&#xff0c;一般来说&a…

和悦未来社区:助力共同富裕,三思打造智慧社区新样板

“共同富裕是社会主义的本质要求&#xff0c;是中国式现代化的重要特征&#xff0c;是人民群众的共同期盼。” 2021年5月20日&#xff0c;《中共中央 国务院关于支持浙江高质量发展建设共同富裕示范区的意见》正式发布。 浙江省作为共同富裕先行示范省份&#xff0c;行而不辍…

SpringCloud microservice-student-consumer-80服务消费者项目建立(四)

新建一个服务器提供者module子模块&#xff0c;类似前面建的common公共模块&#xff0c;名称是 microservice-student-consumer-1001 pom.xml修改&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSc…

01 UML概述

UML概述 (1) 规约系统的制品–UML适用于对所有重要的分析、设 计和实现决策进行详细描述 (2) 构造系统的制品–UML描述的模型可与各种编程语言直接相关联 UML应用范围 (1)可用于对象方法和构件方法&#xff1b; (2)可用于 ●所有应用领域(例如&#xff0c;航空航天、财政、通…

重生之我测阿里云U1实例(通用算力型实例)

官方福利&#xff01;&#xff01;&#xff01;&#xff01;大厂羊毛你确定不薅&#xff1f;&#xff1f;&#xff1f; 参与ECSU实例评测&#xff0c;申请免费体验机会&#xff1a;https://developer.aliyun.com/mission/review/ecsu 参与ECSU实例评测&#xff0c;申请免费体验…

CVPR 2023 | 基于金字塔模型的异常检测方法

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2211.11317 0.背景&#xff1a; 工业异常检测旨在发现产品的异常区域&#xff0c;在工业质量检测中发挥着重要作用。在工业场景中&#xff0c;很容易获得大量的正…

阿里云RAM凭据插件应用纪实

官方传送 官方文档传送门 官方源码传送门 记录日期 2023-06-13 背景简介 项目中主要使用了OSS&#xff0c;本文记录在OSS SDK中的使用方法 引入依赖 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactI…

一波未平一波又起!加密市场静候利率决议!美联储将会如何演绎?

过去一周&#xff0c;加密市场主要根据SECvs币安&Coinbase的诉讼案件做出反应&#xff0c;但本周市场行情或将以宏观事件为主导&#xff0c;市场短期内仍看不到明确的方向。 因通胀意外反弹&#xff0c;曾暂停加息的澳大利亚央行、加拿大央行近期宣布继续加息&#xff0c;让…

企业软文投稿流程是怎样的,投稿有什么要求?

随着互联网的快速发展&#xff0c;传统的线下推广已经不再是企业宣传的唯一选择。越来越多的企业开始关注线上平台&#xff0c;尤其是软文投稿。那么&#xff0c;企业软文投稿流程是怎样的&#xff1f;投稿有什么要求呢&#xff1f;本文伯乐网络传媒将为大家详细介绍。 1.确定投…

GORM---高级查询

文章目录 构建Demo数据模型定义数据表 高级查询子查询选择字段排序数量偏移总数Group & Having连接 Pluck扫描 构建Demo数据 模型定义 type Users struct {Id uint64 gorm:"primary_key;NOT NULL"EmailId uint64 gorm:"foreignKey:email_id;referenc…

python + pytest 接口自动化 —— 参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。 比如&#xff1a;B接口的某个或某些请求参数是…