当前位置: 首页 > news >正文

Avue表单个别字段实现全选的思路

目录

  • 前言
  • 正文

前言

爬虫神器,无代码爬取,就来:bright.cn

Java基本知识:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

本文主要通过实战中 记录日常笔记

由于本架构是Avue下的,对应有些插件不支持更加灵活

比如tree格式 以及 seleect格式

后续通过官网发现checkBox格式支持:Form属性文档

在这里插入图片描述

正文

需求如下:全选对应的数据,反之联动另外一个字段

全集(后台设备字典) - 工作设备 = 停用设备

在这里插入图片描述

整体表单样式如下:

{label: "xxxxx",prop: "stopGantryCrane",multiple: true,  // ✅ 多选关键配置width:"250px",span: 24, // 表单中占一半宽度(24 栅格的一半)dicUrl: `${baseUrl}/info/queryByManyEqNoTeandId?eqNos=YC&tenantId=${website.tenantId}`,type: "tree",display: false, // 不在表单中显示search: false,searchSpan: 4,props: {label: 'equipmentNo',value: 'equipmentNo'}
},
  • 指定某些设备为“工作中”(workXXX)

  • 自动显示剩余设备为“停用中”(stopXXX)

🚀 全选联动与差集逻辑分离步骤
1️⃣ 加载全集:设备类型 → 对应设备编号全集

loadEquipmentOptions() {const eqMap = {A: 'workQuayCrane',B: 'workPortalCrane',C: 'workGantryCrane',D: 'workRailCrane'};// axios请求批量加载字典
}

2️⃣ 自动计算“停用设备”:全集 - 工作设备

getStopCraneFromWorkCrane(row) {const craneFields = [{ work: 'workGantryCrane', stop: 'stopGantryCrane', prefix: 'A' },...];craneFields.forEach(({ work, stop, prefix }) => {const allOptions = this.equipmentOptions[prefix] || [];const selected = (typeof row[work] === 'string' ? row[work].split(',') : row[work] || []).map(s => s.trim()).filter(Boolean);const uniqueWork = [...new Set(selected)];const stopList = allOptions.filter(eq => !uniqueWork.includes(eq));// 👇更新表单字段row[work] = uniqueWork.join(',');row[stop] = stopList.join(',');});
}

3️⃣ 排序和标准化,确保 work/stop 字段干净且有序

normalizeCraneFields(row) {// 数组转字符串 + 排序
}

总体代码如下:

// 全集减去work集合,但本身work和stop是相对的情况,否则更新的时候字段显示不及时
getStopCraneFromWorkCrane(row) {const craneFields = [{ work: 'workQuayCrane', stop: 'stopQuayCrane', prefix: 'A' },{ work: 'workPortalCrane', stop: 'stopPortalCrane', prefix: 'b' },{ work: 'workGantryCrane', stop: 'stopGantryCrane', prefix: 'c' },{ work: 'workRailCrane', stop: 'stopRailCrane', prefix: 'd' }];const getNumber = str => {const match = str.match(/\d+/);return match ? parseInt(match[0], 10) : 0;};craneFields.forEach(({ work, stop, prefix }) => {const allOptions = this.equipmentOptions[prefix] || [];// 标准化 work 字段const selected = (typeof row[work] === 'string' ? row[work].split(',') : row[work] || []).map(s => s.trim()).filter(Boolean);const uniqueWork = [...new Set(selected)].sort((a, b) => getNumber(a) - getNumber(b));const stopList = allOptions.filter(eq => !uniqueWork.includes(eq)).sort((a, b) => getNumber(a) - getNumber(b));row[work] = uniqueWork.join(',');row[stop] = stopList.join(',');});
},
// 排序
normalizeCraneFields(row) {// 1. 保证数组转换为字符串,本身 update的时候可能会以 | 进行分割,所以保证用逗号分割const craneFields = ['workQuayCrane','workPortalCrane','workGantryCrane','workRailCrane','stopQuayCrane','stopPortalCrane','stopGantryCrane','stopRailCrane'];// 数组转字符串craneFields.forEach(k => {if (Array.isArray(row[k])) {row[k] = row[k].join(',');}});// 2. 再次进行排序const fieldPrefixMap = {workQuayCrane: 'a',stopQuayCrane: 'A',workPortalCrane: 'B',stopPortalCrane: 'B',workGantryCrane: 'C',stopGantryCrane: 'C',workRailCrane: 'D',stopRailCrane: 'D'};const getNumber = str => {const match = str.match(/\d+/);return match ? parseInt(match[0], 10) : 0;};// 排序Object.keys(fieldPrefixMap).forEach(k => {if (typeof row[k] === 'string' && row[k].trim() !== '') {row[k] = row[k].split(',').map(s => s.trim()).sort((a, b) => {const numA = getNumber(a);const numB = getNumber(b);return numA - numB;}).join(',');}});
},// *****------- 以下是 新增以及更新
rowSave(row, done, loading) {this.getStopCraneFromWorkCrane(row);this.normalizeCraneFields(row); // 👈 添加这行,排序add(row).then(() => {this.onLoad(this.page);this.$message({type: "success",message: "操作成功!"});done();}, error => {loading();window.console.log(error);});
},rowUpdate(row, index, done, loading) {this.getStopCraneFromWorkCrane(row);this.normalizeCraneFields(row); // 👈 添加这行update(row).then(() => {this.onLoad(this.page);this.$message({type: "success",message: "操作成功!"});done();}, error => {loading();console.log(error);});
},
http://www.xdnf.cn/news/690607.html

相关文章:

  • 【Pandas】pandas DataFrame drop
  • Transformer核心技术解析LCPO方法:精准控制推理长度的新突破
  • Redis学习(十四)主从复制的工作原理、集群搭建(一主二从)
  • Android 云手机横屏模式下真机键盘遮挡输入框问题处理
  • [AD] Noxious LLMNR+DHCP+NTLMv2+Kerberos+SMB
  • 高精度导航 | RTK:2025年高精度导航算法综述,包括:原理,数据,公式,完整代码,开源代码链接
  • 网络协议之办公室网络是怎样的?
  • Mac M1编译OpenCV获取libopencv_java490.dylib文件
  • xcode 旧版本、历史版本下载
  • 【C/C++】高性能网络编程之Reactor模型
  • 网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)
  • git配置(1): 根据remote自动选择账号执行commit
  • MCU - SPI总线介绍 + W25Qx驱动设计
  • node-DeepResearch开源ai程序用于深入调查查询,继续搜索、阅读网页、推理,直到找到答案
  • SpringBoot项目快速打包与部署,War包⽅式打包部署与Jar包⽅式打包部署两种方式
  • 迁移学习模型构建指南(Python实现)
  • 云服务器系统盘满了,但是其他正常,是否可能是被攻击了
  • electron开发百度桌面应用demo及如何打包应用
  • SpringBoot 执行Lua脚本 服务端执行 减少性能损耗 优化性能 优化连接性能
  • linux使用服务添加一个开机启动脚本
  • 同一机器下通过HTTP域名访问其他服务器进程返回504问题记录
  • 服务器带宽线路的区别(GIA、CN2、BGP、CMI等)
  • Python教程(七)——错误和异常
  • Rust并发编程实践指南
  • Hadoop复习(一)
  • LVS-DR 负载均衡群集
  • LeetCode Hot100 (普通数组)
  • 深入解析 IP 代理:原理、应用场景与优化策略
  • ubuntu20.04安装NVIDIA显卡驱动(驱动官网下载安装包,解决开机启动黑屏问题,终极保姆式方案教程)
  • 51c~CUDA~合集1