Ant Design Vue Select 选择器 全选 功能

news2025/4/22 0:58:55

Vue.js的组件库Ant Design Vue Select 选择器没有全选功能,如下图所示:

在项目中,我们自己实现了全选清空功能,如下所示:

代码如下所示:

<!--
=========================================================
* 参数配置 - 风力发电 - 曲线图
* 猴王软件学院 - 大强
* 2025-3-23
=========================================================
-->
<template>
  <div>
    <div class="flex-container">
      <div class="flex-item">
        <a-select
          id="a-select-scene"
          :options="options_scene"
          mode="combobox"
          style="width: 200px; height:50px;"
          @change="proChange_scene"
          showArrow="true"
          placeholder="请选择场景"
          v-model="selected_scene"
        >
        </a-select>
      </div>
      <div class="flex-item">
        <a-select
          id="a-select-node"
          :options="options_node"
          mode="multiple"
          style="width: 200px; height:50px;"
          @change="proChange_node"
          showArrow="true"
          v-model:value="selected_node"
        >
          <template #dropdownRender="{ menuNode: menu }">
            <div>
              <a-button @click="allSelectedFun" type="primary" style="margin-right: 10px;">全选</a-button>
              <a-button @click="clearFun">清空</a-button>
              <a-divider style="margin: 5px 0;" />
              <v-nodes :vnodes="menu" />
            </div>
          </template>
        </a-select>
        <div class="my-ant-select-selection-placeholder">请选择节点</div>
      </div>
      <div class="flex-item">
        <a-select
          id="a-select-power"
          :options="options_power"
          mode="combobox"
          style="width: 200px; height:50px;"
          @change="proChange_power"
          showArrow="true"
          placeholder="请选择功率"
          v-model="selected_power"
        >
        </a-select>
      </div>
      <div class="flex-item">
        <a-button type="primary" preIcon="ant-design:search-outlined" @click="searchChart">查看</a-button>
      </div>
    </div>
    <div ref="chartRef" :style="{ height, width }"></div>
  </div>
</template>
<script lang="ts">
import {defineComponent, PropType, ref, Ref, reactive, watchEffect, unref, onMounted} from 'vue';
import {useECharts} from '/@/hooks/web/useECharts';
import {cloneDeep} from 'lodash-es';
import {Select} from "ant-design-vue";
import {initDictOptions} from "@/utils/dict";

export default defineComponent({
  name: 'LineMulti',
  components: {Select,
    VNodes: (_, { attrs }) => {
      return attrs.vnodes;
    },
  },
  props: {
    chartData: {
      type: Array,
      default: () => [],
      required: true,
    },
    option: {
      type: Object,
      default: () => ({}),
    },
    type: {
      type: String as PropType<string>,
      default: 'line',
    },
    width: {
      type: String as PropType<string>,
      default: '100%',
    },
    height: {
      type: String as PropType<string>,
      default: 'calc(100vh - 78px)',
    },
  },
  emits: ['click'],
  setup(props, {emit}) {
    const chartRef = ref<HTMLDivElement | null>(null);
    const {setOptions, getInstance} = useECharts(chartRef as Ref<HTMLDivElement>);
    const option = reactive({
      tooltip: {
        trigger: 'axis',
        axisPointer: {
          type: 'shadow',
          label: {
            show: true,
            backgroundColor: '#333',
          },
        },
      },
      legend: {
        top: 30,
      },
      grid: {
        top: 60,
      },
      xAxis: {
        name: '时间(小时)',
        type: 'category',
        data: [],
      },
      yAxis: {
        name: '功率(万千瓦)',
        type: 'value',
      },
      series: [],
    });

    // 功率
    let options_power = ref<any>([]);
    let selected_power = ref('');

    // 场景
    let options_scene = ref<any>([]);
    let selected_scene = ref('');

    // 节点
    let options_node = ref<any>([]);
    // let selected_node = ref('');
    let selected_node = ref([]);

    /**
     * 功率改变函数
     * @param val
     */
    function proChange_power(val) {
      selected_power.value = val;
    }

    /**
     * 场景改变函数
     * @param val
     */
    function proChange_scene(val) {
      selected_scene.value = val;
    }

    /**
     * 节点改变函数
     * @param val
     */
    function proChange_node(val) {
      selected_node.value = val;
    }

    // 全选函数
    function allSelectedFun() {
      options_node.value.forEach((item) => {
        let index = selected_node.value.indexOf(item.value);
        if (index == -1) {
          selected_node.value.push(item.value);
        }
      });
    };
    
    // 清空函数
    function clearFun() {
      selected_node.value.splice(0, selected_node.value.length);
    };

    /**
     * 查看图表
     */
    function searchChart() {
      if (selected_scene.value == '') {
        alert("请选择场景!")
        return
      }
      if (selected_node.value == '') {
        alert("请选择节点!")
        return
      }
      if (selected_power.value == '') {
        alert("请选择功率!")
        return
      }

      if (props.option) {
        Object.assign(option, cloneDeep(props.option));
      }
      //节点
      let nodeArr = Array.from(new Set(props.chartData.map((item) => item.nodeName)));
      //轴数据
      let xAxisData = Array.from(new Set(props.chartData.map((item) => item.index)));
      let seriesData = [];
      nodeArr.forEach((node) => {
        selected_node.value.forEach((value) => {
          if (node === value) {
            let obj: any = {name: node, type: props.type};
            // update-begin-author:liusq date:2023-7-12 for: [issues/613] LineMulti 在数据不对齐时,横坐标计算错误
            let data = [];
            xAxisData.forEach((x) => {
              let dataArr = props.chartData.filter((item) =>
                x == item.index &&  // 索引
                selected_power.value == item.power &&  // 功率
                selected_scene.value == item.scene &&  // 场景
                node == item.nodeName // 节点
              );
              if (dataArr && dataArr.length > 0) {
                data.push(dataArr[0].value);
              } else {
                data.push(null);
              }
            });
            // update-end-author:liusq date:2023-7-12 for: [issues/613] LineMulti 在数据不对齐时,横坐标计算错误
            //data数据
            obj['data'] = data;
            seriesData.push(obj);
          }
        });
      });
      option.series = seriesData;
      option.xAxis.data = xAxisData;
      // option.legend.show = false;
      option.legend.selector = [
        {
          // 全选
          type: 'all',
          // 可以是任意你喜欢的标题
          title: '全选'
        },
        {
          // 反选
          type: 'inverse',
          // 可以是任意你喜欢的标题
          title: '反选'
        }
      ];
      option.legend.selectedMode = false;
      option.legend.orient = 'vertical';
      option.legend.right = '0px';
      // option.legend.top = '-50px';
      console.log('option', option);
      setOptions(option);
      getInstance()?.off('click', onClick);
      getInstance()?.on('click', onClick);
    }

    function onClick(params) {
      emit('click', params);
    }

    /**
     * 初始化字典选项
     */
    async function initDictConfig() {
      options_power.value = await initDictOptions('power');
      options_scene.value = await initDictOptions('scene');
      options_node.value = await initDictOptions('node');
    }

    onMounted(() => {
      //初始化字典选项
      initDictConfig();
    });

    return {
      options_power, options_scene, options_node,
      selected_power, selected_scene, selected_node,
      proChange_power, proChange_scene, proChange_node, chartRef, searchChart,
      allSelectedFun, clearFun
    };
  },
});
</script>

<style>
.flex-container {
  display: -webkit-flex;
  display: flex;
}

.flex-item {
  width: 210px;
}

.ant-select-multiple .ant-select-selection-overflow-item {
  flex: none;
  align-self: center;
  max-width: 100%;
  display: none;
}

.my-ant-select-selection-placeholder {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  flex: 1;
  color: rgba(0, 0, 0, 0.65);
  pointer-events: none;
  margin-top: -45px;
  margin-left: 20px;
  position: relative;
}
</style>

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

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

相关文章

系统与网络安全------网络应用基础(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 TCP/IP协议及配置 概述 TCP/IP协议族 计算机之间进行通信时必须共同遵循的一种通信规定 最广泛使用的通信协议的集合 包括大量Internet应用中的标准协议 支持跨网络架构、跨操作系统平台的数据通信 主机…

JDK 24 发布,新特性解读!

一、版本演进与技术格局新动向 北京时间3月20日&#xff0c;Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本&#xff0c;其技术革新力度远超预期——共集成24项JEP提案&#xff0c;相当于Java 22&#xff08;12项&#xff09;与Java 23&#xff08;12项&#…

k8s中service概述(二)NodePort

NodePort 是 Kubernetes 中一种用于对外暴露服务的 Service 类型。它通过在集群的每个节点上开放一个静态端口&#xff08;NodePort&#xff09;&#xff0c;使得外部用户可以通过节点的 IP 地址和该端口访问集群内部的服务。以下是关于 NodePort Service 的详细说明&#xff1…

Oracle归档配置及检查

配置归档位置到 USE_DB_RECOVERY_FILE_DEST&#xff0c;并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

Vue3 实战:基于 mxGraph 与 WebSocket 的动态流程图构建

本文将详细介绍如何在 Vue3 项目中集成 mxGraph 可视化库&#xff0c;并通过 WebSocket 实现画布元素的实时更新。适合有 Vue 基础的前端开发者学习参考。 一、技术栈准备 Vue3&#xff1a;采用 Composition API 开发mxGraph&#xff1a;JavaScript 流程图库&#xff08;版本 …

Ubuntu AX200 iwlwifi-cc-46.3cfab8da.0.tgz无法下载的解决办法

文章目录 前言一、检查网卡是否被识别二、确认内核模块是否可用1.AX200 wifi 要求内核5.12.检查 iwlwifi.ko 是否存在&#xff1a;3.如果未找到&#xff0c;可能是内核模块未正确生成。尝试安装 linux-modules-extra&#xff1a;4.再次检查 iwlwifi.ko 是否存在&#xff1a;5.确…

蓝桥杯,利用 Vue.js 构建简易任务管理器

在日常开发中&#xff0c;我们经常需要处理各种任务和计划。一个简单且高效的任务管理器可以帮助我们更好地组织和安排时间。今天&#xff0c;我将向大家展示如何使用 Vue.js 构建一个简易的任务管理器。这个项目不仅能够帮助我们更好地理解 Vue.js 的基本语法和功能&#xff0…

Elasticsearch + Docker:实现容器化部署指南

Elasticsearch是一款强大的分布式搜索和分析引擎&#xff0c;广泛应用于日志分析、全文检索、实时数据分析等场景。而Docker作为一种轻量级的容器化技术&#xff0c;能够帮助开发者快速部署和管理应用。将Elasticsearch与Docker结合&#xff0c;不仅可以简化部署流程&#xff0…

win32汇编环境,网络编程入门之十一

;win32汇编环境,网络编程入门之十一 ;在上一教程里&#xff0c;我们学习了如何读取大容量的网页内容&#xff0c;在这一教程里&#xff0c;我们学习一下如何在wininet或winhttp机制中提取网页中的超链接 ;>>>>>>>>>>>>>>>>>…

穿越之程序员周树人的狂人日记Part3__人机共生纪元

穿越之程序员周树人的狂人日记Part3__人机共生纪元 代码知识点&#xff1a;协程、内存管理、版本控制 故事一【协程陷阱】择偶标准的多核运算 故事二【内存泄漏】中产幻觉的垃圾回收 故事三【版本控制】人设仓库的强制推送 故事四【容器化生存】&#xff1a;员工生存之现状 静夜…

后端——AOP异步日志

需求分析 在SpringBoot系统中&#xff0c;一般会对访问系统的请求做日志记录的需求&#xff0c;确保系统的安全维护以及查看接口的调用情况&#xff0c;可以使用AOP对controller层的接口进行增强&#xff0c;作日志记录。日志保存在数据库当中&#xff0c;为了避免影响接口的响…

循环查询指定服务器开放端口(Python)

循环查询指定服务器开放端口列表 # Time : 2025/3/22 # Author : cookie # Desc :import socket import concurrent.futures from datetime import datetime# 设置目标IP和端口范围 target_ip input("请输入目标IP地址: ") start_port int(input("请输入…

【STM32】第一个工程的创建

目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包&#xff0c;在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件&#xff0c;或者到 KEIL 的官网下载&a…

SpringBoot+策略模式+枚举类,优雅消除if-else

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架 一&#xff0c;platform1.1 platform框架&#xff08;设备树下&#xff09;1.2 platform框架&#xff08;配置设备函数&#xff09; 二&#xff0c;MISC字符驱动框架三&#xff0c;input框架 一&#xff0c;platfor…

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…

常见中间件漏洞:Jboss篇

CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 过程 访问网址&#xff0c;存在页面说明接口存在且存在反序列化漏洞 http://8.130.17.222:8080/invoker/JMXInvokerServlet 2.下载 ysoserial ⼯具进⾏漏洞利⽤…

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法&#xff08;Tornado optimizer with Coriolis force&#xff09;是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;11.7&#xff09;的2025年智能优化算法 01.引言 当自然界的狂暴之力&#xff0c;化身数字世界的智慧引擎&…