俩个el-select的联动选择

news2024/11/17 3:25:19

需求:

1.有俩个select下拉框,之后左边选中后右边根据左边的选择自动选择内容

2.右边自动选择之后可以取消。

3.右侧的下拉框只能选中左侧下拉框的内容,左边没选中的右边也不能被选中

4.左侧下拉添加全选功能

5.左侧选择右侧没选择就把右侧数据清空

1.效果

 

2.代码讲解(完整代码在最后)

主要是注意这俩个变量,这俩变量主要控制数据显示回填的

   leftValue: [],

   rightValue: []

1.leftOptions:左右下拉框的数据,要在同一个数据里面,之后做判断

2.rightDisabledOptions:控制右边的选择禁用的变量

3.selectData:选中后合并数据

4.updSelect:最终结果数据,使用深拷贝的方式。让updSelect和selectData之间不会相互影响

2.1左侧选中后触发函数

1.每次左侧选中之后都要清空数据,不然数据会堆叠

2.

  this.leftValue = this.leftOptions.map((option) => option.value);

  this.rightValue = this.leftOptions.map((option) => option.id);

这俩句就是数据回填,根据select绑定的value值的数据进行回填,改数据只需要改option.xx

遍历所有数据,之后判断左侧选中的数据是否包含所以数据中的value值,那么就让同样value值的右侧数据进行数据回填,并且把选中数据给selectData,不然就禁用掉数据

  this.leftOptions.forEach((option) => {
                    // 如果左侧选中的包含右侧的value值
                    if (this.leftValue.includes(option.value)) {
                        this.rightValue.push(option.id);
                        this.selectData.push(option);
                    } else {
                        this.rightDisabledOptions.push(option.value);
                    }
                });

2.2右侧数据讲解

updSelect就是为了让每次右侧选择或者是取消选择的时候数据进行一个切换,所以需要使用深拷贝的方式让updSelect不影响原始的selectData数据,之后判断如果没有选中就把数据更改为id:-1,name:""

handleRightChange(value) {
            this.updSelect = JSON.parse(JSON.stringify(this.selectData));
            this.updSelect.forEach((item) => {
                if (!value.includes(item.id)) {
                    item.id = -1;
                    item.name = '';
                }
            });
        }

3.完整代码

<template>
    <div class="content-box">
        <div class="container">
            <el-select v-model="leftValue" multiple placeholder="请选择" @change="handleLeftChange" collapse-tags>
                <el-option v-if="leftOptions.length !== 0" label="全选" value="all"></el-option>
                <el-option v-for="item in leftOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
            </el-select>

            <el-select
                style="margin-left: 20px"
                @change="handleRightChange"
                v-model="rightValue"
                multiple
                placeholder="请选择"
                collapse-tags
            >
                <el-option
                    v-for="item in leftOptions"
                    :key="item.value"
                    :label="item.name"
                    :value="item.id"
                    :disabled="rightDisabledOptions.includes(item.value)"
                ></el-option>
            </el-select>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            leftValue: [],
            rightValue: [],
            leftOptions: [
                { value: '1', label: '选项1', name: '右侧选项1', id: 1 },
                { value: '2', label: '选项2', name: '右侧选项2', id: 2 },
                { value: '3', label: '选项3', name: '右侧选项3', id: 3 }
            ],
            rightDisabledOptions: [],
            selectData: [],
            updSelect: [] //为了不影响原始数据,不然原始数据勾选几次值全改变了
        };
    },
    mounted() {},
    methods: {
        handleLeftChange(value) {
            // 清空右边下拉框的选中值和禁用选项
            this.rightValue = [];
            this.rightDisabledOptions = [];
            this.selectData = [];

            // 根据左边下拉框的选中值更新右边下拉框的选中值和禁用选项
            // 左右结构一定要有一样的值,不然联动不了
            // 如果是全选,就让所有的select被选中
            if (value.includes('all')) {
                this.leftValue = this.leftOptions.map((option) => option.value);
                this.rightValue = this.leftOptions.map((option) => option.id);
                this.selectData = this.leftOptions;
            } else {
                this.leftOptions.forEach((option) => {
                    // 如果左侧选中的包含右侧的value值
                    if (this.leftValue.includes(option.value)) {
                        this.rightValue.push(option.id);
                        this.selectData.push(option);
                    } else {
                        this.rightDisabledOptions.push(option.value);
                    }
                });
            }

            this.updSelect = JSON.parse(JSON.stringify(this.selectData));
        },
        // 右侧选择
        handleRightChange(value) {
            this.updSelect = JSON.parse(JSON.stringify(this.selectData));
            this.updSelect.forEach((item) => {
                if (!value.includes(item.id)) {
                    item.id = -1;
                    item.name = '';
                }
            });
            console.log(this.updSelect, '解决');
        }
    }
};
</script>

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

文章到此结束,希望对你有所帮助~

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

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

相关文章

如何避免 IDEA 每次重启都index

如何避免 IDEA 每次重启都index 在 IntelliJ IDEA 中&#xff0c;可以通过以下几个步骤来避免每次重启时索引&#xff1a; 打开 File -> Settings 菜单。在左侧的菜单栏中选择 “Appearance & Behavior” -> “System Settings” -> “Synchronization”。 在右…

与艺术同频!卡萨帝在海外崭露头角

在品牌全球化步伐日益加快的当下&#xff0c;高端品牌如何真正实现业务全球化、品牌全球化乃至用户圈层全球化&#xff1f; 作为国际高端家电引领者&#xff0c;卡萨帝今年以来在全球范围内展开了一系列的品牌布局活动。1月&#xff0c;卡萨帝于巴基斯坦召开品牌发布会&#x…

生产ERP管理系统源码 ERP系统源码

生产ERP管理系统 1、产品管理系统 产品资料系统包括两方面的内容&#xff1a;物料主文件和产品结构&#xff0c;ERP系统企业管理软件平台最基本的信息&#xff0c;绝大多数物流、制造、甚至财务类系统均要使用到产品资料的信息。 &#xff08;1&#xff09;、全方位描述物料…

网工实验笔记:匹配工具ACL的使用

一、概述 访问控制列表简称为ACL&#xff0c;它使用包过滤技术&#xff0c;在路由器上读取第3层及第4层包头中的信息&#xff0c;如源地址、目的地址、源端口和目的端口等&#xff0c;根据预告定义好的规则对包进行过滤从而达到访问控制的目的。ACL分很多种&#xff0c;不同场…

用ChatGPT+Midjourney 5分钟生成30条爆款小红书图文(内有详细教程)

本期是赤辰第35期AI项目教程&#xff0c;文章底部准备了粉丝福利&#xff0c;看完后可免费领取&#xff01;今天给大家讲一下如何5分钟生成30条爆款小红书图文先说个账号&#xff0c;这个应该有同学也看过&#xff0c;前几个月在小红书有个涨粉很快的AI绘画项目&#xff0c;就是…

python自动化操作邮箱

POP3、IMAP、SMTP&#xff0c;CardDAV、CalDAV协议特点 POP3 POP3是Post Office Protocol 3的简称&#xff0c;即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服…

微信小程序支持h5实现webrtc h264 h265低延迟传输渲染

微信小程序自成体系&#xff0c;自身也带了很强的rtc音视频能力&#xff0c;但是他捆绑了他自己的服务&#xff0c;开发也相对受限于他的api。基于以前的了解可以采webview的方式内嵌h5网址来实现自定义的webrtc.但实践起来并不轻松&#xff0c;主要是小程序的严格限制&#xf…

docker-compose Install hfish

前言hfish HFish是一款社区型免费蜜罐,侧重企业安全场景,从内网失陷检测、外网威胁感知、威胁情报生产三个场景出发,为用户提供可独立操作且实用的功能,通过安全、敏捷、可靠的中低交互蜜罐增加用户在失陷感知和威胁情报领域的能力。 HFish具有超过40种蜜罐环境、提供免费…

VS编译的时候不生成Release文件夹

方法描述&#xff1a; Build>Configuration Manager>Release 编译》配置管理》选择发布版本 再编译就有了 具体操作过程 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 特此记录 anlog 2023年10月12日

在线答题+考试出题小程序源码系统,轻松无忧,功能强大

今天给大家分享一款在线答题小程序源码系统&#xff0c;功能强大&#xff0c;搭建起来也比较简单&#xff0c;同时还具有在线考试&#xff0c;轻松出题的功能&#xff0c;适用于各个行业。 功能展示具体罗列部分如下&#xff1a; 基础设置&#xff08;全局设置&#xff0c;…

信创办公–基于WPS的PPT最佳实践系列 (绘制自选图形)

信创办公–基于WPS的PPT最佳实践系列 &#xff08;绘制自选图形&#xff09; 目录 应用背景操作步骤1、记忆复制&#xff1a;CTRLD2、微移&#xff1a;CTRL四个方向键 应用背景 如果想将文字转为简单而形象的smartart图形&#xff0c;但是又找不到自己想要的图形&#xff0c;我…

14.2 Socket 反向远程命令行

在本节&#xff0c;我们将继续深入探讨套接字通信技术&#xff0c;并介绍一种常见的用法&#xff0c;实现反向远程命令执行功能。对于安全从业者而言&#xff0c;经常需要在远程主机上执行命令并获取执行结果。本节将介绍如何利用 _popen() 函数来启动命令行进程&#xff0c;并…

实现paho.mqtt.cpp库编译

编译环境 WIN10 VS2019 CMake 3.27.4 因为paho.mqtt.cpp依赖paho.mqtt.c 安装paho.mqtt.c 先下载paho.mqtt.c安装包&#xff0c;win下有安装包 地址: https://github.com/eclipse/paho.mqtt.c/releases/tag/v1.3.12 编译paho.mqtt.cpp 然后下载 paho.mqtt.cpp 源码Release…

【Python 零基础入门】 函数

【Python 零基础入门】第五课 函数 【Python 零基础入门】第五课 函数函数在生活中的类比函数为什么要使用函数函数的格式无参函数含参函数 参数形参实参 变量作用域局部变量全局变量 递归函数基本的递归斐波那契数列 Lambda 表达式高阶函数map 函数filter 函数reduce 函数结合…

COSCon'23 闪电演讲报名须知

各位新老朋友们&#xff0c;一年一度的中国开源年会&#xff08;COSCon&#xff09;拟于 2023 年 10 月 28 日&#xff08;星期六&#xff09;- 29 日&#xff08;星期日&#xff09;在四川省成都市高新区菁蓉汇举办。 本次大会将持续两天&#xff0c;我们策划的主题包括&#…

[探究] program break (chatgpt 协助)

文章目录 简介Unix早期和程序断点引入malloc安全顾虑和转向更新内存分配器新用法中的程序断点总结 简介 这里说的程序断点&#xff08;program break&#xff09;和 gdb调试时的断点&#xff08;运行断点&#xff09;&#xff0c;意思不同。 当深入研究Linux和类Unix操作系统…

Node历史版本下载及配置npm镜像

https://nodejs.org/en/download/releases 点击对应版本Release,选择合适的包&#xff0c;进行下载安装。 配置国内镜像 npm config set registry https://registry.npmmirror.com/

1600*C. Game On Leaves(博弈游戏树)

Problem - 1363C - Codeforces 解析&#xff1a; 我们将目标结点 x 当作树的根&#xff0c;显然&#xff0c;到当 x 的度为 1 的时候&#xff0c;此时行动的人胜利。 我们假设现在的情况为&#xff0c;只剩余三个点&#xff0c;再选择任意一个点&#xff0c;则对方获胜。但是两…

VisionMaster自定义模块

一、参考资料&#xff1a; 1、教学视频 2、VM服务管家【VM服务管家】VM4.x算法模块开发_4.3 联合Halcon开发-CSDN博客问题&#xff1a;有的用户在使用VisionMaster软件在开发视觉项目时&#xff0c;可能同时也使用HALCON&#xff0c;OpenCV等视觉算法库做一些图像的处理&#…

js事件循环详解

事件循环简介 JavaScript的事件循环是一种处理异步事件和回调函数的机制&#xff0c;它是在浏览器或Node.js环境中运行&#xff0c;用于管理任务队列和调用栈&#xff0c;以及在适当的时候执行回调函数。 事件循环的基本原理是&#xff0c;JavaScript引擎在空闲时等待事件的到…