【sgTransfer】自定义组件:带有翻页、页码、分页器的穿梭框组件,支持大批量数据的穿梭显示。

 

特性: 

  1. 表格宽度可以自定义
  2. 翻页器显示控件可以自定义
  3. 列配置项可以设置显示字段列名称、宽度、字段名
  4. 可以配置搜索框提示文本,支持搜索过滤
  5. 穿梭框顶部标题可以自定义
  6. 左右箭头按钮文本可以设置

sgTransfer源码

<template><div :class="$options.name"><div class="sg-start " :style="{ width: width }"><div class="sg-title" v-if="titles">{{ titles[0] }}</div><div class="sg-search"><el-input style="width: 100%;" v-model.trim="inputSearchValue_start" maxlength="20" :show-word-limit="false":placeholder="filterPlaceholder || `请输入搜索内容...`" clearable @keyup.native.enter="initListStart"@clear="initListStart"><el-button slot="append" icon="el-icon-search" @click="initListStart" /></el-input></div><div class="sg-table"><el-table ref="table_start" :data="tableData_start" :header-cell-style="{ background: '#f5f7fa' }":height="'300px'" style="width: 100%" stripe @selection-change="selection_start_change":row-class-name="row_class_name" @row-click="row_click_start"><el-table-column type="selection" minWidth="50" :selectable="selectable" /><el-table-column v-for="(a, i) in tableItems_start" :key="i" :prop="a.prop" :label="a.label":width="a.width || false" :minWidth="a.minWidth || false" show-overflow-tooltip /></el-table></div><div class="sg-pagination"><el-pagination background :hidden="startPage.total <= 10" :layout="layout" :page-sizes="[10, 20, 50]":pager-count="5" :current-page.sync="startPage.currentPage" :page-size.sync="startPage.pageSize":total="startPage.total" @size-change="pageChange" @current-change="pageChange" /></div></div><div class="sg-center "><el-button :disabled="disabledLeftButton" @click="remove" type="primary" icon="el-icon-arrow-left">{{buttonTexts ? buttonTexts[0] : ''}}</el-button><el-button :disabled="disabledRightButton" @click="add" type="primary">{{ buttonTexts ? buttonTexts[1] : '' }}<iclass="el-icon-arrow-right" style="margin-left: 5px;"></i></el-button></div><div class="sg-end " :style="{ width: width }"><div class="sg-title" v-if="titles">{{ titles[1] }}</div><div class="sg-search"><el-input style="width: 100%;" v-model.trim="inputSearchValue_end" maxlength="20" :show-word-limit="false":placeholder="filterPlaceholder || `请输入搜索内容...`" clearable@keyup.native.enter="initListEnd({ currentPage: 1 })" @clear="initListEnd"><el-button slot="append" icon="el-icon-search" @click="initListEnd({ currentPage: 1 })" /></el-input></div><div class="sg-table"><el-table ref="table_end" :data="tableData_end" :header-cell-style="{ background: '#f5f7fa' }":height="'300px'" style="width: 100%" stripe @selection-change="selection_end_change"@row-click="row_click_end"><el-table-column type="selection" minWidth="50" /><el-table-column v-for="(a, i) in tableItems_end" :key="i" :prop="a.prop" :label="a.label":width="a.width || false" :minWidth="a.minWidth || false" show-overflow-tooltip /></el-table></div><div class="sg-pagination"><el-pagination background :hidden="endPage.total <= 10" :layout="layout" :page-sizes="[10, 20, 50]":pager-count="5" :current-page.sync="endPage.currentPage" :page-size.sync="endPage.pageSize":total="endPage.total" @size-change="initListEnd" @current-change="initListEnd" /></div></div></div>
</template><script>
export default {name: 'sgTransfer',data() {return {width: '200px',layout: `total, sizes, prev, pager, next, jumper`,disabledForm: false,inputSearchValue_start: '',inputSearchValue_end: '',tableItems_start: [],//表格列配置项tableItems_end: [],//表格列配置项tableData_start: [],//呈现的当前页数据tableData_end: [],//呈现的当前页数据tableData_end_bk: [],//最终选择的数据selection_start: [],selection_end: [],startPage: { currentPage: 1, pageSize: 10, total: 0, },endPage: { currentPage: 1, pageSize: 10, total: 0, },}},props: ["value","data",/*格式说明data: {width: '400px',//表格宽度layout: `total, sizes, prev, next, jumper`,//翻页器显示控件// 列配置项tableItems: [{ prop: 'ID', label: '工号', minWidth: '50' },{ prop: 'XM', label: '姓名', minWidth: '50' },{ prop: 'YHM', label: '用户名', minWidth: '50' },],tableData: [],//表格显示内容startPage: { total: 0, },//实际总数}, */"titles","buttonTexts","filterPlaceholder",],computed: {disabledLeftButton(d) {return this.selection_end.length === 0;},disabledRightButton(d) {// 在左边表格选中项里面,遍历每一项,如果在右侧表格中都能找到匹配项就truereturn this.selection_start.every(row => this.tableData_end_bk.some(v => this.isSameItem(v, row)));},},watch: {value: {handler(d) {if (d) {this.tableData_end = d || [];this.initListEnd();}}, deep: true, immediate: true,},data: {handler(d) {if (d) {d.width && (this.width = d.width);d.layout && (this.layout = d.layout);this.tableData_start = d.tableData;this.tableItems_start = d.tableItems_start || d.tableItems;this.tableItems_end = d.tableItems_end || d.tableItems;this.startPage.total = (d.startPage || {}).total || 0;}}, deep: true, immediate: true,},tableData_end_bk: {handler(d) {this.$emit(`input`, d);this.initListEnd();if (this.tableData_end.length === 0) {this.inputSearchValue_end = '';this.endPage.currentPage = Math.round(this.tableData_end_bk.length / this.endPage.pageSize);}}, deep: true, //immediate: true,},},created() {this.initListStart();},methods: {row_click_start(row, column, event) { this.$refs.table_start.toggleRowSelection(row); },row_click_end(row, column, event) { this.$refs.table_end.toggleRowSelection(row); },pageChange(d) { this.initListStart(); this.$nextTick(() => { this.refreshCheckStatus() }); },refreshCheckStatus() {this.tableData_start.forEach(row => this.$refs.table_start.toggleRowSelection(row, this.tableData_end_bk.some(v => this.isSameItem(v, row))));},selectable(row) { return !this.tableData_end_bk.some(v => this.isSameItem(v, row)); },row_class_name({ row, rowIndex }) { return this.tableData_end_bk.find(v => this.isSameItem(v, row)) ? 'selected' : ''; },isSameItem(a_obj, b_obj) {let isSame = true; Object.keys(a_obj).forEach(k => a_obj[k] !== b_obj[k] && (isSame = false));return isSame},remove(d) {let selection_end = this.selection_end.map(v => JSON.stringify(v));this.tableData_end_bk = this.tableData_end_bk.filter(v => !selection_end.includes(JSON.stringify(v)));this.$nextTick(() => { this.refreshCheckStatus() });},add(d) {this.selection_start.forEach(row => this.tableData_end_bk.some(v => this.isSameItem(v, row)) || this.tableData_end_bk.push(row));},selection_start_change(selection) {this.selection_start = selection;},selection_end_change(selection) {this.selection_end = selection;},someTableItem({ keyword, obj }) {return Object.keys(obj).some(k => obj[k].toString().includes(keyword));},initListStart() {this.$emit('init', {keyword: this.inputSearchValue_start,currentPage: this.startPage.currentPage,pageSize: this.startPage.pageSize,});},initListEnd({keyword = this.inputSearchValue_end,currentPage = this.endPage.currentPage,pageSize = this.endPage.pageSize,} = {}) {this.endPage.currentPage = currentPage;this.endPage.pageSize = pageSize;let results = this.tableData_end_bk.filter(obj => keyword ? this.someTableItem({ keyword, obj }) : true);this.endPage.total = results.length;this.tableData_end = results.slice((currentPage - 1) * pageSize, (currentPage) * pageSize);},},
};
</script><style lang="scss" scoped>
.sgTransfer {display: flex;align-items: center;flex-wrap: nowrap;white-space: nowrap;&>.sg-start,&>.sg-end {border: 1px solid #ebeef5;border-radius: 4px;overflow: hidden;background: #fff;display: inline-block;vertical-align: middle;max-height: 100%;box-sizing: border-box;position: relative;.sg-title {height: 40px;line-height: 40px;background: #f5f7fa;margin: 0;padding-left: 15px;border-bottom: 1px solid #ebeef5;box-sizing: border-box;color: #000;}.sg-search {box-sizing: border-box;padding: 10px;}.sg-table {}.sg-pagination {height: 50px;display: flex;justify-content: center;width: 100%;box-sizing: border-box;padding: 10px;}}&>.sg-center {margin: 0 10px;}&>.sg-end {}
}>>>.el-table {tr.selected {filter: brightness(0.95);pointer-events: none;}.el-table__cell.gutter {border-bottom: 1px solid #EBEEF5;background-color: #f5f7fa;}
}
</style>

用例

<template><div><sgTransfer v-model="transferValue" :data="transferData" :titles="['所有用户', '本组成员']" :button-texts="['到左边', '到右边']":filter-placeholder="`请输入工号、姓名…`" @init="initTransfer" /><hr><div><h1>勾选的数据transferValue:</h1><div v-html="JSON.stringify(transferValue).replace(/\,\{/g, ',\n{')"style="word-wrap: break-word;word-break: break-all;white-space: break-spaces;"> </div></div></div>
</template><script>
import sgTransfer from "@/vue/components/admin/sgTransfer";export default {components: { sgTransfer },data() {return {// 穿梭框配置项transferValue: [],transferData: {width: '400px',//表格宽度layout: `total, sizes, prev, next, jumper`,//翻页器显示控件// 列配置项tableItems: [{ prop: 'ID', label: '工号', minWidth: '50' },{ prop: 'XM', label: '姓名', minWidth: '50' },{ prop: 'YHM', label: '用户名', minWidth: '50' },],tableData: [],//表格显示内容startPage: { total: 0, },//实际总数},// 渲染数据tableData: [],tableData_bk: [],userList: [{ key: 1, label: '梁冰露' },{ key: 2, label: '吴梵听' },{ key: 3, label: '卢令美' },{ key: 4, label: '韩宛曼' },{ key: 5, label: '郝海冬' },{ key: 6, label: '傅优悦' },{ key: 7, label: '郝幻莲' },{ key: 8, label: '江嘉云' },{ key: 9, label: '梁秋芳' },{ key: 10, label: '郝悦颖' },{ key: 11, label: '廖芝蓉' },{ key: 12, label: '胡傲丝' },{ key: 13, label: '赵珺琦' },{ key: 14, label: '石心诺' },{ key: 15, label: '丁翠芙' },{ key: 16, label: '李夏河' },{ key: 17, label: '范水悦' },{ key: 18, label: '郑凝雪' },{ key: 19, label: '李亦玉' },{ key: 20, label: '袁三春' },{ key: 21, label: '赵红叶' },{ key: 22, label: '曹安琪' },{ key: 23, label: '谭琴音' },{ key: 24, label: '钟湛蓝' },{ key: 25, label: '陆之柔' },{ key: 26, label: '吕孒凡' },{ key: 27, label: '熊野雪' },{ key: 28, label: '曹叶澜' },{ key: 29, label: '韩粟梅' },{ key: 30, label: '孔杏儿' },{ key: 31, label: '宋若彤' },{ key: 32, label: '于淼淼' },{ key: 33, label: '潘欣跃' },{ key: 34, label: '石雅辰' },{ key: 35, label: '白念珍' },{ key: 36, label: '文爱茹' },{ key: 37, label: '王如曼' },{ key: 38, label: '宋丝琪' },{ key: 39, label: '王凝荷' },{ key: 40, label: '郑雨雪' },{ key: 41, label: '梁映阳' },{ key: 42, label: '徐新雨' },{ key: 43, label: '毛恬雅' },{ key: 44, label: '侯若蕊' },{ key: 45, label: '杨云蔚' },{ key: 46, label: '史之卉' },{ key: 47, label: '胡千束' },{ key: 48, label: '冯冷荷' },{ key: 49, label: '金语心' },{ key: 50, label: '江恬默' },{ key: 51, label: '高香馨' },{ key: 52, label: '江凌晴' },{ key: 53, label: '梁列琴' },{ key: 54, label: '邹鸾瑶' },{ key: 55, label: '夏素洁' },{ key: 56, label: '范秋玉' },{ key: 57, label: '钟北嘉' },{ key: 58, label: '谭水云' },{ key: 59, label: '顾山柏' },{ key: 60, label: '龙曼蔓' },{ key: 61, label: '钟双儿' },{ key: 62, label: '林林娜' },{ key: 63, label: '邹溪儿' },{ key: 64, label: '顾妙彤' },{ key: 65, label: '傅茵茵' },{ key: 66, label: '卢念露' },{ key: 67, label: '罗冷亦' },{ key: 68, label: '胡秋颖' },{ key: 69, label: '姜怡月' },{ key: 70, label: '傅和暄' },{ key: 71, label: '赖布凡' },{ key: 72, label: '郝念蕾' },{ key: 73, label: '邱天欣' },{ key: 74, label: '汤莉莉' },{ key: 75, label: '段靖易' },{ key: 76, label: '周之云' },{ key: 77, label: '董映秋' },{ key: 78, label: '汤玲琅' },{ key: 79, label: '田雁梅' },{ key: 80, label: '石雨雪' },{ key: 81, label: '任君雅' },{ key: 82, label: '蔡小谷' },{ key: 83, label: '孟忆之' },{ key: 84, label: '姜闲丽' },{ key: 85, label: '文忆香' },{ key: 86, label: '戴运虹' },{ key: 87, label: '王玄穆' },{ key: 88, label: '刘绿柳' },{ key: 89, label: '萧梦丝' },{ key: 90, label: '谭忆山' },{ key: 91, label: '方榕嫣' },{ key: 92, label: '徐欣合' },{ key: 93, label: '夏雨南' },{ key: 94, label: '尹沙羽' },{ key: 95, label: '万梦玉' },{ key: 96, label: '谢灵枫' },{ key: 97, label: '曾源源' },{ key: 98, label: '赖谷枫' },{ key: 99, label: '彭子童' },],}},created() {this.createTableData()},methods: {// 初始化、翻页、切换每页显示数量的时候触发initTransfer({ keyword = '', currentPage = 1, pageSize = 10 } = {}) {// 模拟接口调用----------------------------------------let results = this.tableData_bk.filter((v, i, ar) => keyword ? v.XM.includes(keyword) || v.ID.includes(keyword) : true);this.transferData.startPage.total = results.length;this.transferData.tableData = results.slice((currentPage - 1) * pageSize, (currentPage) * pageSize);// ----------------------------------------},// 构建数据createTableData(d) {this.tableData_bk = this.userList.map(v => {let ID = this.$g.getRandomID();return { ID, XM: v.label, YHM: `user${ID}`, }});this.initTransfer();},}
}
</script>

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

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

相关文章

Http 1.0 1.1 2.0 3.0 版本差别

Http 1.0 发布年份&#xff1a;1996 非官方标准 短链接&#xff1a;每一次请求都对应一次TCP的连接与释放 开销大&#xff1a;每次请求都要TCP的连接与释放队头阻塞&#xff1a;每次请求都必须等上一次请求获得响应之后&#xff0c;才可以发送&#xff1b;效率低下 缓存&…

flutter自定义按钮-文本按钮

目录 前言 需求 实现 前言 最近闲着无聊学习了flutter的一下知识&#xff0c;发现flutter和安卓之间&#xff0c;页面开发的方式还是有较大的差异的&#xff0c;众所周知&#xff0c;android的页面开发都是写在xml文件中的&#xff0c;而flutter直接写在代码里&#xff08;da…

Unity 之利用 localEulerAngle与EulerAngle 控制物体旋转

文章目录 概念讲解localEulerAngle与EulerAngle的区别 概念讲解 欧拉角&#xff08;Euler Angles&#xff09;是一种常用于描述物体在三维空间中旋转的方法。它使用三个角度来表示旋转&#xff0c;分别绕物体的三个坐标轴&#xff08;通常是X、Y和Z轴&#xff09;进行旋转。这…

数据分享|R语言用lme4多层次(混合效应)广义线性模型(GLM),逻辑回归分析教育留级调查数据...

全文链接:http://tecdat.cn/?p22813 本教程为读者提供了使用频率学派的广义线性模型&#xff08;GLM&#xff09;的基本介绍。具体来说&#xff0c;本教程重点介绍逻辑回归在二元结果和计数/比例结果情况下的使用&#xff0c;以及模型评估的方法&#xff08;点击文末“阅读原文…

Vue3 学习 组合式API setup语法糖 响应式 指令 DIFF(一)

文章目录 前言一、Composition Api二、setup语法糖三、响应式refreactive 四、其他一些关键点v-prev-oncev-memov-cloak 五、虚拟Dom五、diff算法 前言 本文用于记录学习Vue3的过程 一、Composition Api 我觉得首先VUE3最大的改变就是对于代码书写的改变&#xff0c;从原来选择…

Kafka3.0.0版本——Follower故障处理细节原理

目录 一、服务器信息二、服务器基本信息及相关概念2.1、服务器基本信息2.2、LEO的概念2.3、HW的概念 三、Follower故障处理细节 一、服务器信息 三台服务器 原始服务器名称原始服务器ip节点centos7虚拟机1192.168.136.27broker0centos7虚拟机2192.168.136.28broker1centos7虚拟…

怎样做一个知识库网站

经济和信息技术的蓬勃发展&#xff0c;知识资源成为了企业非常重要的无形资产。 当前&#xff0c;企业的核心竞争力不仅取决于硬件设备、财务实力、资源多寡、人员数量等生产因素&#xff0c;更加取决于企业对于知识的掌握、运用、传承和创新。 制作企业知识库&#xff0c;传…

IDEA快速设置全局JDK

出bug 了 JDK 不识别了&#xff0c;才想起来要设置jdk &#xff0c;现在一般查到的都是setting 设置全局的idea设置。但是老玩家的我怎么会不知道有一个设置全局jdk 的一个设置 setings 设置是对idea 的基础设置。 但是还有一个隐藏页面快捷键【CtrlAltShiftS】 接下来自己研究…

JVM内存管理、内存分区:堆、方法区、虚拟机栈、本地方法栈、程序计数器

内存管理 内存分区 线程共享 堆 存放实例&#xff0c;字符串常量&#xff08;直接引用&#xff09;&#xff0c;静态变量&#xff0c;线程分配缓冲区&#xff08;TLAB线程私有&#xff09;。垃圾收集器管理的区域 方法区 非堆&#xff0c;和堆相对的概念。存储已被虚拟机加载的…

Qt 解析XML文件 QXmlStreamReader

如何使用QXmlStreamReader来解析格式良好的XML&#xff0c;Qt的文档中指出&#xff0c;它是一种更快、更方便的Qt自己的SAX解析器&#xff08;QXmlSimpleReader&#xff09;的替代&#xff0c;它也较快&#xff0c;在某种情况下&#xff0c;比DOM&#xff08;QDomDocument&…

【MySQL系列】-ORDER BY……HAVING详解及limit

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

MongoDB实验——在Java应用程序中操作 MongoDB 数据

在Java应用程序中操作 MongoDB 数据 1. 启动MongoDB Shell 2. 切换到admin数据库&#xff0c;使用root账户 3.开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为MongoJava File --> New --> Java Project 4.在MongoJava项目下新建包&#xff0c;包名为mo…

Android scrollTo、scrollBy、以及scroller详解 自定义ViewPager

Scroller VelocityTracker VelocityTracker 是一个速度跟踪器&#xff0c;通过用户操作时&#xff08;通常在 View 的 onTouchEvent 方法中&#xff09;传进去一系列的 Event&#xff0c;该类就可以计算出用户手指滑动的速度&#xff0c;开发者可以方便地获取这些参数去做其他…

【期末复习笔记】计算机操作系统

计算机操作系统 进程的描述与控制程序执行进程进程的定义与特征相关概念定义特征进程与程序的区别 进程的基本状态和转换PCBPCB中的信息作用PCB的组织方式 线程进程与线程的比较 处理机调度与死锁处理机调度处理机调度的层次 调度算法处理机调度算法的目标处理机调度算法的共同…

大语言模型之五 谷歌Gemini

近十年来谷歌引领着人工智能方向的发展&#xff0c;从TensorFlow到TPU再到Transformer&#xff0c;都是谷歌在引领着&#xff0c;然而&#xff0c;在大语言模型上&#xff0c;却被ChatGPT&#xff08;OpenAI&#xff09;抢了风头&#xff0c;并且知道GPT-4&#xff08;OpenAI&a…

7.Oracle视图创建与使用

1、视图的创建与使用 在所有进行的SQL语句之中&#xff0c;查询是最复杂的操作&#xff0c;而且查询还和具体的开发要求有关&#xff0c;那么在开发过程之中&#xff0c;程序员完成的并不是是和数据库的所有内容&#xff0c;而更多的是应该考虑到程序的设计结构。可以没有一个项…

【教程分享】Docker搭建Zipkin,实现数据持久化到MySQL、ES

1 拉取镜像 指定版本&#xff0c;在git查看相应版本&#xff0c;参考&#xff1a; https://github.com/openzipkin/zipkin 如2.21.7 docker pull openzipkin/zipkin:2.21.7 2 启动 Zipkin默认端口为9411。启动时通过-e server.portxxxx设置指定端口 docker run --name zi…

无涯教程-Android - RadioGroup函数

RadioGroup类用于单选按钮集。 如果我们选中属于某个单选按钮组的一个单选按钮,它将自动取消选中同一组中以前选中的任何单选按钮。 RadioGroup属性 以下是与RadioGroup控制相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关…

可视化工具 netron pt 转 onnx 格式

用于学习记录 文章目录 前言一、Netron 在线使用二、pt 格式转换为 ONNX 格式总结 前言 Netron 是一个开源的网络可视化工具&#xff0c;可以帮助开发人员和数据科学家可视化、理解和调试深度学习模型。它支持多种常见模型格式&#xff0c;如 TensorFlow、PyTorch、ONNX、Caff…

企业网络安全:威胁情报解决方案

什么是威胁情报 威胁情报是网络安全的关键组成部分&#xff0c;可为潜在的恶意来源提供有价值的见解&#xff0c;这些知识可帮助组织主动识别和防止网络攻击&#xff0c;通过利用 STIX/TAXII 等威胁源&#xff0c;组织可以检测其网络中的潜在攻击&#xff0c;从而促进快速检测…