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

这篇具有很好参考价值的文章主要介绍了vue+el-select下拉实现:全选、反选、清空功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:

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

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

如下图:

vue+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   也就不会反向传值文章来源地址https://www.toymoban.com/news/detail-496077.html

到了这里,关于vue+el-select下拉实现:全选、反选、清空功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue element 编辑下拉框el-select不能回显的问题

    本人的需求是点击表格里面的编辑按钮,把数据回显到弹窗内,其他的都能回显,但是就下拉框不能正常的回显 本人后端人员,有不对的地方,勿喷 这是因为点击编辑,收集到下拉框的value是一个数字导致的,传值应该是 ‘1’ 而不是 1 解决办法一:,给弹窗子组件传参的时

    2024年02月11日
    浏览(40)
  • vue拿到下拉框el-select的选择项的value和label

    1.单独一个下拉框时 2.el-table每行数据都有下拉框时   思路: 1.首先选择下拉框事件拿到选择的这行数据scope.row  2.其次去遍历绑定的下拉框数据,使用find()方法查找item.value === row.value  3.找到则返回对应的row.label   4.最后将label值以键值对形式加到row对象中 代码实例:

    2024年02月11日
    浏览(120)
  • vue2 - 详细介绍element UI中在el-select嵌套el-tree树形控件实现下拉选择树型结构数据的效果实例(组件封装)

    在项目上常用使用到 el-select 和 el-tree 组合实现,记录下两者结合的实现过程。(代码以及注释清晰明了,代码直接使用即可) 要求根据项目接口提供的数据,el-tree 里的数据是一次性返回来的,点击最后一层级时,请求接口,在点击层级下方追加数据追加的数据要显示勾

    2024年04月15日
    浏览(67)
  • el-select与el-tree结合使用,实现select框下拉使用树形结构选择数据

    使用el-select与el-tree,实现如下效果, 代码如下:  注意点:搜索input框的代码一点放在option上面,不要放在option里面,否则一点击搜索框,下拉框就会收起来,不能使用。

    2024年02月13日
    浏览(57)
  • Vue 当页面进入全屏状态时element-ui的el-select下拉菜单不显示问题

    在前两天进行页面全屏时,一切都还好好的,可当使用element-ui中的el-select时,下拉菜单却怎么也显示不出来,但只要退出全屏状态,立马就好。 非全屏时:  全屏时: 开始我以为是层级问题,所以给el-select的下拉菜单加z-index,却发现加到多大都没用。 后来去官方文档里找

    2024年01月17日
    浏览(74)
  • VUE element-ui 使用Screefull 页面全屏时el-select下拉菜单不显示(下拉框不显示无法选择)问题解决

    问题原因:elemrnt-ui会默认将弹出框插入至 body 元素;当设置了某个元素全屏时,会遮挡住原来的select下拉数据。

    2024年02月14日
    浏览(63)
  • 【Vue2 + ElementUI】更改el-select的自带的下拉图标为倒三角,并设置相关文字颜色和大小

    效果图 实现 总结 将el-select自带的下拉选择图标(如下图 1- 箭头),替换成自定义图标(如下图 2- 倒三角) (1)利用控制台找到 图 1 所在的位置,如下该图标是通过 伪类元素 添加的。 (2) 替换为 图 2   ① 只更改图标,不更改大小 在图标库(例 elementUI)找对应的图标

    2024年01月25日
    浏览(48)
  • Element-UI实现的下拉搜索树组件(el-select、el-input、el-tree组合使用)

    1、子组件封装 注意使用:正常使用 // 子组件使用 父组件调用

    2024年02月11日
    浏览(87)
  • el-select 无限下拉滚动加载数据

    template   div     el-form       ref=\\\"saveParameter\\\"       :model=\\\"saveParameter\\\"       inline       inline-message       style=\\\"margin:10px\\\"           el-form-item label=\\\"供应商\\\" prop=\\\"lngcustomerid\\\"         el-select           v-model=\\\"saveParameter.lngcustomerid\\\"           v-loadmore=\\\"loadMore()\\\"           styl

    2024年02月14日
    浏览(43)
  • element el-select下拉框选择失效

    2023.1.11今天我学习了使用element el-select组件下拉框选择数据失效的原因以及解决办法。 如图:   当我已经选择启用状态的时候,然后点击停用状态没反应。 是因为在配置表单的过程中,重复使用了这个字段。 如: 就是在表单中重复使用了status这个字段,然后导致选择失效。

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包