【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, },mainKey: null,//主键}},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 && !JSON.stringify(JSON.parse(JSON.stringify(this.tableData_end_bk)).sort()) === JSON.stringify(JSON.parse(JSON.stringify(d)).sort())) {this.inputSearchValue_start = '';this.inputSearchValue_end = '';this.startPage.currentPage = 1;this.endPage.currentPage = 1;this.tableData_end_bk = d || [];this.initListStart();}}, 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.mainKey = (this.tableItems_start.find(v => v.mainKey) || {}).prop;//主键this.startPage.total = (d.startPage || {}).total || 0;this.$nextTick(() => { this.refreshCheckStatus() });// 刷新勾选状态}}, 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,},},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(); },// 刷新勾选状态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;if (this.mainKey) {isSame = a_obj[this.mainKey] == b_obj[this.mainKey];} else {isSame = Object.keys(a_obj).every(k => a_obj[k] == b_obj[k]);}return isSame;},remove(d) {if (this.mainKey) {let selection_end_mainKeys = this.selection_end.map(v => v[this.mainKey]);this.tableData_end_bk = this.tableData_end_bk.filter(v => !selection_end_mainKeys.includes(v[this.mainKey]));} else {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));this.$nextTick(() => { this.refreshCheckStatus() });// 刷新勾选状态},selection_start_change(selection) {this.selection_start = selection;},selection_end_change(selection) {this.selection_end = selection;},initListStart() {this.$emit('init', {keyword: this.inputSearchValue_start,currentPage: this.startPage.currentPage || 1,pageSize: this.startPage.pageSize,});},initListEnd({keyword = this.inputSearchValue_end,currentPage = this.endPage.currentPage || 1,pageSize = this.endPage.pageSize,} = {}) {this.endPage.currentPage = currentPage;this.endPage.pageSize = pageSize;let results = this.tableData_end_bk.filter(obj =>keyword ?Object.keys(obj).some(k => obj[k].toString().toLocaleLowerCase().includes(keyword.toString().toLocaleLowerCase())): 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', mainKey: true },//设置主键{ 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(obj => keyword ? Object.keys(obj).some(k => obj[k].toString().toLocaleLowerCase().includes(keyword.toString().toLocaleLowerCase())) : 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.rhkb.cn/news/121063.html

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

相关文章

【树形权限】树形列表权限互斥选择、el-tree设置禁用等等

文章目录 一、实现如上树形列表1.1 首先要就是渲染树形列表1.2 然后通过插槽处理头部标题1.3 再通过插槽处理表格body体内容1.4 让body体中的选框和表头中的选框产生关联 二、将 el-tree 整棵树设为禁用状态三、动态表格合并 需求&#xff1a;按照权限管理配置的数据权限树展开…

Vert.x 源码解析(4.x)(一)——Future源码解析

目录 1. 简介 在现代的软件开发中&#xff0c;异步编程已经变得非常重要。它可以提高应用程序的并发性能&#xff0c;使应用程序能够更有效地处理大量的并行操作。Vert.x 是一个面向事件驱动、非阻塞的异步编程框架&#xff0c;它提供了丰富的工具来简化异步编程的复杂性。 如…

解决windows下git操作提示用户名密码错误的问题

当代码从一个平台切换到另一个平台的时候&#xff0c;需要做两步操作&#xff0c;第一步就是更新git的仓库地址&#xff0c;在项目的.git/config文件里面修改&#xff0c;这一步做完之后&#xff0c;就可以推送代码到新的仓库了&#xff0c;这里就是重点来了。 一般第一次推动代…

JVM虚拟机对象探秘

对象的创建 Java是一门面向对象的编程语言&#xff0c;创建对象通常只是通过new关键字。 对象创建过程 当Java虚拟机遇到一条字节码new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到 一个类的符号引用&#xff0c;并且检查这个符号引用&#xff08;类…

如何设计微服务

一、序幕 最近在思考&#xff0c;自己哪些不足&#xff0c;需要学习点什么&#xff1f;看着Java基础知识&#xff0c;千遍一律&#xff0c;没有太大的动力需深挖&#xff0c;只能在写业务项目的时候边写边思考边夯实自己的基础。于是看了网上的一些资料&#xff0c;结合以前面试…

linux并发服务器 —— 多线程并发(六)

线程概述 同一个程序中的所有线程均会独立执行相同程序&#xff0c;且共享同一份全局内存区域&#xff1b; 进程是CPU分配资源的最小单位&#xff0c;线程是操作系统调度执行的最小单位&#xff1b; Linux环境下&#xff0c;线程的本质就是进程&#xff1b; ps -Lf pid&…

101序列检测器

本次所做设计&#xff0c;使用数字电路芯片实现的101序列检测器。电路图如下&#xff1a; 主要首先要根据需求画出状态转移方程&#xff0c;然后写出它的逻辑表达式。最后根据所选触发器种类确定电路图。序列由按键控制输入&#xff0c;按键按下&#xff0c;代表输入1 &#xf…

RT-Thread UART

UART 简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用异步收发传输器&#xff0c;UART 作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 UART …

Error: Cannot find module ‘timers/promises‘

这个错误很要命 他会导致你本机所有的npm 命令全部报错 首先 这个错误是因为 npm 与 node版本不匹配导致的 最简单的办法就是 查一下你安装的这个npm 的版本适配那个版本的 node 然后将本地的node删除 控制面板写在node 然后去官方文档现在与本地npm 匹配的node.js 这样 你执行…

【LeetCode-中等题】146. LRU 缓存

文章目录 题目方法一&#xff1a;直接继承LinkedHashMap调用api方法二&#xff1a;自定义LinkedHashMap HashMap ListNode LinkedHashMap 题目 LRU缓存是什么&#xff1a;LRU缓存机制&#xff0c;你想知道的这里都有 实现 LRU 缓存算法 方法一&#xff1a;直接继承Linked…

彻底学会Unity从网上加载资源到场景

使用类WWW 该类实例化的对象可以存储多种多媒体资源&#xff0c;只需要在构造函数中附上可访问的资源链接 Unity 中&#xff0c;WWW 类用于实例化互联网上的资源&#xff0c;如文本、图像、音频和视频等。WWW 实例化的对象可以存储多种多媒体素材。以下是一些常见的例子&…

固定资产卡片乱怎么管理

固定资产卡片是记录公司固定资产信息的重要工具&#xff0c;如果管理不善&#xff0c;容易造成卡片混乱、数据错误等问题。 为了避免这种情况的发生&#xff0c;可以采取以下措施&#xff1a;  建立完善的资产管理制度&#xff0c;明确固定资产的分类、标准和使用情况&#x…

C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中&#xff0c;子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中&#xff0c;方法重写是一种多态的表现形式&#xff0c;它使得子类可以根据不同的需求和场景提供不同的方法实现。 方法重…

热点探测技术架构设计与实践

1. 概述 说到热点问题&#xff0c;首先我们先理解一下什么是热点&#xff1f; 热点通常意义来说&#xff0c;是指在一段时间内&#xff0c;被广泛关注的物品或事件&#xff0c;例如微博热搜&#xff0c;热卖商品&#xff0c;热点新闻&#xff0c;明星直播等等&#xff0c;所以…

You must install at least one postgresql-client-<version> package

使用主机上的映射端口来连接到 PostgreSQL 数据库。例如&#xff0c;使用以下命令连接到数据库&#xff1a; psql -h localhost -p 5432 -U postgres出现下面的问题&#xff1a; 分析&#xff1a; 如果您在运行 psql 命令时遇到错误消息 You must install at least one pos…

应用案例 | 3D视觉引导解决方案汽车零部件上下料

Part.1 行业背景 三维视觉引导技术在国内外汽车零部件领域得到了广泛应用。随着汽车制造业的不断发展和创新&#xff0c;对于零部件的加工和装配要求越来越高&#xff0c;而三维视觉引导技术能够帮助企业实现更精确、更高效的零部件上下料过程。 纵览国外&#xff0c;部分汽车…

若依 MyBatis改为MyBatis-Plus

主要内容&#xff1a;升级成mybatis-plus&#xff0c;代码生成也是mybatis-plus版本 跟着我一步一步来&#xff0c;就可完成升级&#xff01; 检查&#xff1a;启动程序&#xff0c;先保证若依能启动 第一步&#xff1a;添加依赖 这里需要在两个地方添加&#xff0c;一个是最…

软件游戏丢失d3dcompiler_47.dll怎么办?这个几个解决方法可修复

当我们在玩软件游戏时&#xff0c;有时候会出现丢失 d3dcompiler_47.dll 的问题&#xff0c;这让我们感到非常困扰。d3dcompiler_47.dll 是 DirectX 中的一个重要组件&#xff0c;如果它丢失了&#xff0c;那么很多游戏就无法正常运行。我将和大家分享一下我在解决软件游戏丢失…

计算机竞赛 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

小白学go基础03-了解Go项目的项目结构

我们先来看看第一个Go项目——Go语言自身——的项目结构是什么样的。Go项目的项目结构自1.0版本发布以来一直十分稳定&#xff0c;直到现在Go项目的顶层结构基本没有大的改变。 截至Go项目commit 1e3ffb0c&#xff08;2019.5.14&#xff09;&#xff0c;Go1.0 项目结构如下&am…