如图所示,这是个常见的多选todolist

不过这里多了个要求,弹窗上下页面切换的时候需要保留勾选结果

这其实也不难,但是如果每次都手动写一遍却有点恼人,这次捋一下思路,并把核心代码记录一下,方便下次翻找

核心思想

  1. 在服务器返回的数据之外再维护一个列表A,存储被钩上的数据
  2. 在请求接口时候给服务器返回数据钩上已选的
  3. 点击全选或者单个勾选(或取消勾选)时候再次把当前页面的勾选数据同步给列表A
  4. 那如何同步呢?重点,后面针对性说同步函数


弹窗封装


data数据说明

  • data对应的数据有;
  • params: 外部传入接口请求的参数;
  • single: 是否单选;
  • pickedArr:承接外部传入的已选中元素数组后变成已选元素数组
  • selectedItems:弹窗内已选中的元素数组;
  • form: 弹窗内查询列表的参数;


1.对外提供show方法来调用,接受几个参数,
1.1config.single是否支持单选
1.2.params 接口请求需要的额外参数
1.3.外面已选的列表(最好是完整列表,数组元素包括id和对应的文字)

1.4 根据1.3进行一些过滤(有时候弹窗是个二级弹窗,需要根据params参数进行置空或过滤)最后把过滤后的数组作为当前弹窗已勾选列表来存储数据


show函数程序入口

  • 初始化配置参数

  • 初始化已选数据

  • 请求列表

  • 显示弹窗

function show(config) {this.showMaterialPopup = true;const { params, single, pickedArr } = config;//配置参数覆盖// Array.isArray(filterids) ? (this.filterids = []) : (this.filterids = []);params ? (this.params = params) : (this.params = {});single ? (this.single = true) : (this.single = false);Array.isArray(pickedArr) ? (this.pickedArr = pickedArr) : (this.pickedArr = []);/////////初始化弹窗的已选数据///////const firstPickItem = this.pickedArr[0];//根据params和已选中的第一个做一些判断或者过滤//这里的代码是个二级弹窗,可以参考,if (firstPickItem && firstPickItem.materialId && firstPickItem.materialId == params.materialId) {//把传入已选上的元素的checked都钩上this.selectedItems = this.pickedArr.map((item) => {item.checked = true; //够上了return { ...item };});} else {//不符合要求的话,就忽略传入的已选中元素this.selectedItems = [];}//初始化列表查询数据this.form.pageNum = 1;//查询列表数据this.getList();
}

getList函数

  • 获取元素时候,给【服务器返回的数据list】做勾选初始化
  • 这里就处理了点击上下页面和第一次加载时候可以钩上已选数据
//获取元素时候,给【服务器返回的数据list】做勾选初始化
//这里就处理了点击上下页面和第一次加载时候可以钩上已选数据
function getlList() {//合并请求参数listAJAXFN({ ...this.form, ...this.params }).then((res) => {if (res.code == 200) {let { rows, total, size } = res.data;// 创建选中序列号的Set,用于O(1)快速查找//数组转set,方便快速判断const selectArrSet = new Set(this.pickedArr.map((item) => item.id));// 在单次迭代中处理所有行rows = rows.map((item) => {//如果已选元素里有这个元素,就钩上item.checked = selectArrSet.has(item.id);return item;});this.list = rows.filter((item) => !this.filterids.includes(item.id));}});
}

同步函数

  • 1.把本页勾选了的数据给外面传入已勾选的数据对应勾选上
  • 2.把本页存在且勾选了,但是外层传入的数组里面没有元素找出来合并到已选数据上面
  • 3.全选或者单个勾选(取消或者够上)时候调用就可以了
//更新已选择的序列号
//在勾选过程中
function updateselectedSerialNumWhenPick() {//步骤一//判断有没有勾选上,针对外面已有选中数据// 合并checked属性到this.pickedArr中存在的元素this.pickedArr.forEach((aItem) => {//从本页勾选的数组中找到外层传入的勾选数据进行匹配//如果存在就给他勾选(因为进入页面后,用户可能取消掉了也有可能)//这里只勾选就好了,不需要管不勾选的,不勾选的也不是我们想要的const matchingBItem = this.list.find((bItem) => bItem.id === aItem.id);if (matchingBItem) {aItem.checked = matchingBItem.checked;}});//步骤二,针对本页勾选的,但是外层数据没有传入的数据,//要把它们找出来,并合并到一选数组里面// 获取当前页面中中有而a中没有的元素//够上了,且外面已勾选的没有它的数组const uniqueToB = this.list.filter((item) => item.checked).filter((bItem) => !this.pickedArr.some((aItem) => aItem.id === bItem.id));//更新已选中数据this.pickedArr = [...this.pickedArr, ...uniqueToB];
}

确认函数


把已选好的数组里面的checked过滤下,传递出去,外面直接接收就行了

onMulitComfirm() {//从已选元素里面拿const arr =this.pickedArr.filter((item) => item.checked);if (arr.length == 0) {this.$u.toast('请勾选序列号');return;}this.$emit('choose', this.material, arr);this.showMaterialPopup = false;
}

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享:一种为蓝牙、WIFI、U段音频发射设备提供ARC回传数字音频桥接功能的方案

随着智能电视、流媒体设备的普及,用户对高质量音频输出的需求激增。为解决多设备协同、无线化传输及ARC高保真音频传输的痛点,纳祥科技推出HDMI ARC音频转换方案:HDMI ARC音频转光纤/同轴/I2S/左右声道,桥接无线音频发射设备&…

在WPF项目中使用阿里图标库iconfont

使用阿里图标库的步骤: 1。从阿里图标库官方网站上下载图标。 2。把阿里图标库(WPF中支持.ttf字体文件)引入 3。在App.xaml中添加图标的全局样式。推荐在此处添加全局样式,为了保证图标可以在所有窗体中使用。 代码如下&#x…

vue3项目启动流程讲解

Vue 3 项目启动流程详解Vue 3 项目的启动流程相比 Vue 2 有了显著变化,采用了新的应用实例创建方式和组合式 API。下面我将详细讲解 Vue 3 项目的启动过程,并提供一个可视化演示。实现思路创建 Vue 3 应用实例配置根组件和必要的插件挂载应用到 DOM展示启…

【C++】LLVM-mingw + VSCode:Windows 开发攻略

LLVM-mingw 是一个基于 LLVM 项目的开源工具链,用于在类 Unix 系统(如 Linux 或 macOS)上为 Windows 平台交叉编译应用程序,它结合了 LLVM 编译器基础设施(包括 Clang C/C/Objective-C 编译器和 LLD 链接器&#xff0c…

AI内容标识新规实施后,大厂AI用户协议有何变化?(六)科大讯飞

科大讯飞也是国产老将,当年OpenAI横空出世,国内唯有文心和星火能与之一战,早期效果感觉甚至是优于文心的,只是后面再也没有什么大动静出来。讯飞也算大厂了,但跟百度阿里这些老牌互联网门阀相比,还是不够持…

Error: MiniProgramError{“errMsg“:“navigateTo:fail webview count limit exceed“}

这个错误 "navigateTo:fail webview count limit exceed" 是微信小程序中常见的页面栈溢出问题,原因是微信小程序对页面栈深度有默认限制(通常为10层),当使用 navigateTo 连续跳转页面导致页面栈超过限制时就会触发。解…

少即是多:从 MPTCP 看优化干预的边界

“对待端到端传输,信息不足就要少干预,越干预越糟糕”,这是我的信条,这次再来说说 MPTCP。 Linux 内核 MPTCP 最好的调度算法就是 default 算法,没有之一,因为它以代价最小,最自然的方式做到了保…

“开源AI智能名片链动2+1模式S2B2C商城小程序”在直播公屏引流中的应用与效果

摘要:本文聚焦于直播公屏引流场景,探讨“开源AI智能名片链动21模式S2B2C商城小程序”如何通过技术赋能与模式创新,重构直播电商的流量获取与转化路径。研究结合案例分析与实证数据,揭示该方案在提升用户互动、优化供应链管理、降低…

基于大数据挖掘的药品不良反应知识整合与利用研究

标题:基于大数据挖掘的药品不良反应知识整合与利用研究内容:1.摘要 随着医疗数据的爆炸式增长,大数据挖掘技术在医疗领域的应用日益广泛。本研究旨在利用大数据挖掘技术对药品不良反应知识进行整合与利用,以提高药品安全性监测和管理水平。通过收集多源异…

国产时序数据库选型指南-从大数据视角看透的价值

摘要:大数据时代时序数据库崛起,工业物联网场景下每秒百万级数据点写入成为常态。Apache IoTDB凭借单节点1000万点/秒的写入性能、毫秒级查询响应和20:1超高压缩比脱颖而出,其树形数据模型完美适配工业设备层级结构。相比传统数据库&#xff…

教你使用服务器如何搭建数据库

数据库是存储和管理数据的核心组件,无论是网站、应用还是企业系统,都离不开数据库的支持。本文将以 莱卡云服务器 为例,教你如何快速搭建常用数据库服务。一、准备工作服务器环境推荐操作系统:Ubuntu 20.04 / Debian 11 / CentOS …

西门子 S7-200 SMART PLC 核心指令详解:从移位、上升沿和比较指令到流水灯控制程序实战

对于 PLC 初学者来说,“流水灯” 是绕不开的经典入门案例 —— 它看似简单,却浓缩了 PLC 编程的核心逻辑:初始化、时序控制、指令应用与状态判断。今天我们就以 S7-200 SMART 为例,逐行拆解一段 8 位流水灯控制程序,带…

P4342 [IOI 1998] Polygon -普及+/提高

P4342 [IOI 1998] Polygon 题目描述 题目可能有些许修改,但大意一致。 Polygon 是一个玩家在一个有 nnn 个顶点的多边形上玩的游戏,如图所示,其中 n4n 4n4。每个顶点用整数标记,每个边用符号 (加)或符号 *…

枚举算法和排序算法能力测试

枚举算法题目 1&#xff1a;找出 1-20 中既是偶数又是 3 的倍数的数题目描述&#xff1a;小明想找出 1 到 20 中既能被 2 整除又能被 3 整除的数字&#xff0c;帮他列出来吧。 代码&#xff1a;cpp运行#include <iostream> using namespace std; int main() {int a;for (…

大数据电商流量分析项目实战:Hadoop初认识+ HA环境搭建(二)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/…

【Linux】Linux进程概念(上)

一、冯诺依曼体系结构我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器。它们大部分都遵守冯诺依曼体系。截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一个个硬件组件组成。输入单元&#xff1a;键盘、鼠标、扫描仪、写板等中央处…

GESP C++ 一~二级拓展课(一)

课题及解析建议用时60分钟&#xff0c;作业及讲解建议用时50分钟。 课题及解析&#xff1a; 4003&#xff1a;【GESP2303二级】画三角形 【题目描述】 输入一个正整数 n&#xff0c;请使用大写字母拼成一个这样的三角形图案&#xff08;参考样例输入输出&#xff09;&#xff…

Kubernetes Ingress:使用 Apache APISIX 进行外部流量路由

什么是 Ingress&#xff1f; 在 Kubernetes 中&#xff0c;随着微服务架构的广泛应用&#xff0c;集群中的服务需要暴露到外部&#xff0c;以便供用户或其他服务访问。如何高效、安全地管理这些流量&#xff0c;成为了一个重要的议题。Ingress 作为 Kubernetes 提供的一种资源&…

Elasticsearch的理解与使用

在大数据与云计算时代&#xff0c;“高效检索” 与 “实时分析” 成为业务突破的关键能力。Elasticsearch&#xff08;简称 ES&#xff09;作为一款开源分布式搜索与分析引擎&#xff0c;凭借其低延迟、高可扩、强灵活的特性&#xff0c;已成为日志分析、全文检索、业务监控等场…

利用FFmpeg自动批量处理m4s文件

缓存了一些视频m4s文件&#xff0c;只能用指定的软件打开&#xff0c;网上查了一下&#xff0c;需要去掉m4s文件开头的9个0&#xff0c;还要用FFmpeg将两个文件合并成一个文件。 经仔细研究缓存目录和其中文件&#xff0c;发现以下特点&#xff1a;“缓存目录”中有很多“数字文…