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

web前端之vue+element+select实现多选、两个数组排序、保持源数据、查找索引、过滤、克隆、复制、findIndex、filter

MENU

  • 前言
  • 效果图
  • template
  • style
  • JavaScript


前言

1、代码段是一个Vue组件的模板、脚本和样式的完整实现。它结合element的一些组件(如el-select和el-radio-group),实现一个带有下拉选择、多选功能以及可选择“是/否”状态的组件。
2、组件实现一个复杂的选择和管理界面,用户可以从下拉列表中选择多个选项,选择后每个选项会在下方的radio-box中显示,并可以选择对应的“是/否”状态。通过handleCancel方法,用户可以移除某个选项,changeSelect方法则负责更新选项列表和状态。整个组件逻辑清晰,使用element提供的组件实现良好的用户交互体验。


效果图

新增


默认


激活


template

代码

<template><div class="box"><el-selectclass="select"v-model="formData.val"multiplecollapse-tagscollapse-tags-tooltip:max-collapse-tags="2"placeholder="请选择"@change="changeSelect"><el-optionv-for="item in options":key="item.id":label="item.label":value="item.id"/></el-select><div class="radio-box"><div v-for="item in valList" :key="item.id"><span @click="handleCancel(item)">{{ item.label }}</span><el-radio-group v-model="item.isType"><el-radio :label="true"></el-radio><el-radio :label="false"></el-radio></el-radio-group></div></div></div>
</template>

解析

1、<el-select>
1.1、v-model绑定formData.val,实现双向数据绑定。
1.2、multiple属性允许多选。
1.3、collapse-tagscollapse-tags-tooltip配合使用,提供选择项的折叠展示,超出指定数量时显示提示。
1.4、max-collapse-tags="2"设置最多折叠显示2个选项,其他选项折叠。
1.5、@change="changeSelect"监听选择变化事件,调用changeSelect方法。
1.6、v-for="item in options"遍历options数组,生成el-option子组件,item.id作为每个选项的唯一key,item.label作为显示的文本,item.id作为选项的值。


2、<div class=“radio-box”>
2.1、v-for="item in valList"遍历valList数组,生成每个选项的名称和对应的单选框组。
2.2、@click="handleCancel(item)"绑定点击事件,点击名称时会触发handleCancel方法,移除该选项。
2.3、el-radio-group使用v-model绑定item.isType,控制“是/否”状态。
2.4、el-radio组件的label分别设置为true或false,对应“是”和“否”。


style

代码

.box {margin: 0;padding: 28px;box-sizing: border-box;> .select {width: 100%;}.radio-box {width: 100%;> div {width: 100%;display: flex;justify-content: space-between;align-items: center;> span {cursor: pointer;}}}
}

解析

.box
1、包裹整个组件的容器。
2、设置padding: 28px;确保内部元素有一定的间距。
3、box-sizing: border-box;确保padding包含在元素宽度和高度内。


.select
1、将el-select设置为100%宽度,适应父容器。


.radio-box
1、包含所有单选框组的容器。
2、内部的每个div(对应valList中的一个选项)设置为flex布局,子元素(选项名称和单选框)水平排列。
3、> spancursor: pointer;使光标在悬停时变为指针样式,提示用户该元素可点击。


JavaScript

代码

const runClone = val => JSON.parse(JSON.stringify(val));export default {name: 'demo',data() {return {formData: {val: []},options: [{ id: 6, label: 'option-6', isType: true },{ id: 2, label: 'option-2', isType: true },{ id: 1, label: 'option-1', isType: true },{ id: 4, label: 'option-4', isType: true },{ id: 3, label: 'option-3', isType: true },{ id: 5, label: 'option-5', isType: true },{ id: 7, label: 'option-7', isType: true }],valList: [{ id: 6, label: 'option-6', isType: false },{ id: 3, label: 'option-3', isType: false },{ id: 7, label: 'option-7', isType: true }]};},created() {this.runInit();},methods: {handleCancel(row = {}) {let valList = runClone(this.valList);let list = valList.filter(item => item.id !== row.id);this.valList = list;this.formData.val = list.map(item => item.id);},changeSelect(e) {let options = runClone(this.options);let valList = runClone(this.valList);let list = [];for (let i = 0; i < e.length; i++) {let itemA = valList.filter(item => item.id === e[i])[0];let itemB = options.filter(item => item.id === e[i])[0];itemA ? list.push(itemA) : list.push(itemB);}list = list.sort((item1, item2) => {const a = options.findIndex(item => item.id === item1.id);const b = options.findIndex(item => item.id === item2.id);return a - b;});this.valList = runClone(list);},runInit() {this.formData.val = this.valList.map(item => item.id);}}
};

解析

runClone方法使用JSON.parse(JSON.stringify(val))深度克隆对象或数组。用于确保valList和options不被直接修改。


data()
1、formData.val保存用户在el-select中选择的选项的id。
2、options是可供选择的选项列表,每个选项有id、label和isType(表示“是/否”状态)。
3、valList保存当前已选中的选项及其isType状态。初始值为option-6、option-3和option-7,分别对应不同的isType值。


created生命周期钩子
1、调用runInit()方法,用于初始化formData.val。


handleCancel(row)
1、删除valList中与row.id匹配的选项。
2、更新formData.val使其同步。


changeSelect(e)
1、根据用户选择更新valList。
2、将新选择的选项按顺序添加到valList,并更新其中的isType值。
3、通过sort方法保持valList顺序与options顺序一致。


runInit()
1、初始化formData.val,确保它与valList中的选项一致。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ansible搭建+ansible常用模块
  • Python - sqlparse 解析库的基础使用
  • Spring Boot 集成 Elasticsearch 时,是使用 Java API 还是原生的 Elasticsearch API?
  • 2024 Testing Expo即将开幕,怿星科技展品大剧透!
  • .Net插件开发开源框架
  • Win 11用户全面中招,微软强制更新致性能下降45%
  • AtCoder Beginner Contest 367(ABCDEF题)视频讲解
  • 将iso格式的镜像文件转化成云平台能安装的镜像格式(raw/vhd/QCOW2/VMDK )亲测--图文详解
  • 优化Maven镜像配置:使用阿里云加速依赖下载
  • 【密码学】密钥管理:②密钥分配
  • 从零开始学习SLAM(五):极几何与极约束
  • 消息系统类型
  • <数据集>航拍牧场牛羊识别数据集<目标检测>
  • Python 字符串转对象
  • 【C语言】static和extern的作用
  • Cumulo 的 ClojureScript 模块已经成型
  • happypack两次报错的问题
  • HTML-表单
  • Java 最常见的 200+ 面试题:面试必备
  • Python 基础起步 (十) 什么叫函数?
  • Spring声明式事务管理之一:五大属性分析
  • webpack+react项目初体验——记录我的webpack环境配置
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 关于 Cirru Editor 存储格式
  • 欢迎参加第二届中国游戏开发者大会
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 检测对象或数组
  • 简单基于spring的redis配置(单机和集群模式)
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 马上搞懂 GeoJSON
  • 面试总结JavaScript篇
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 因为阿里,他们成了“杭漂”
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 如何在招聘中考核.NET架构师
  • 昨天1024程序员节,我故意写了个死循环~
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • # Redis 入门到精通(七)-- redis 删除策略
  • (4)事件处理——(7)简单事件(Simple events)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (python)数据结构---字典
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)计算机毕业设计高校学生选课系统
  • (计算机网络)物理层
  • (十) 初识 Docker file
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET MVC第三章、三种传值方式
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net Web项目创建比较不错的参考文章