<template>
<div class="demo">
<el-transfer
v-model="value"
filterable
:data="data"
:filter-method="filterMethod"
:target-order="'push'"
:titles="['左边数据', '右边数据']"
:props="{ key: 'id', label: 'label' }"
:left-default-checked="hasCheckedWHLeftData"
@left-check-change="handleWHLeftChange"
:right-default-checked="hasCheckedWHRightData"
@right-check-change="handleWHRightChange"
></el-transfer>
</div>
</template>
<script>
import Sortable from "sortablejs";
const generateData = () => {
const data = [];
for (let i = 1; i <= 30; i++) {
data.push({
id: i,
label: `备选项 ${i}`
});
}
return data;
};
export default {
name: "DragSortMultiSelect",
data() {
return {
filterMethod(query, item) {
let regStr = query.replace(/\*/g, ".*");
let reg = new RegExp(regStr);
return reg.test(item.label);
},
data: generateData(),
value: [4, 2, 1],
shiftKey: false,
firstWHLeftLocation: -1, //数据左边起始值
lastWHLeftLocation: -1, //数据左边终止值
hasCheckedWHLeftData: [], //数据左边选中的数据
firstWHRightLocation: -1, //数据右边起始值
lastWHRightLocation: -1, //数据右边终止值
hasCheckedWHRightData: [] //数据右边选中的数据
};
},
mounted() {
window.addEventListener("keydown", e => {
if (e.keyCode === 16 && e.shiftKey) {
this.shiftKey = true;
}
});
window.addEventListener("keyup", e => {
this.shiftKey = false;
});
let el = document
.querySelector(".el-transfer")
.querySelectorAll(".el-checkbox-group")[1];
new Sortable(el, {
forceFallback: false,
onUpdate: event => {
let box = this.$el
.querySelector(".el-transfer")
.querySelectorAll(".el-checkbox-group")[1];
let nums = this.$el
.querySelector(".el-transfer")
.querySelectorAll(".el-checkbox-group")[1].childNodes.length;
console.log(nums, event.newIndex);
if (event.newIndex >= nums) {
return;
}
let newIndex = event.newIndex;
let oldIndex = event.oldIndex;
let $label = box.children[newIndex];
let $oldLabel = box.children[oldIndex];
box.removeChild($label);
if (newIndex < oldIndex) {
box.insertBefore($label, $oldLabel);
} else {
box.insertBefore($label, $oldLabel.nextSibling);
}
let item = this.value.splice(oldIndex, 1);
this.value.splice(newIndex, 0, item[0]);
}
});
},
methods: {
// 数据左侧列表元素被用户选中 / 取消选中时触发
handleWHLeftChange(key, key1) {
var _this = this;
console.log(_this.hasCheckedWHLeftData);
_this.hasCheckedWHLeftData = _this.commonChangeFuc(
key,
key1,
_this.hasCheckedWHLeftData,
_this.firstWHLeftLocation,
_this.lastWHLeftLocation,
_this.data,
"id"
);
console.log(_this.hasCheckedWHLeftData);
},
// 数据右侧列表元素被用户选中 / 取消选中时触发
handleWHRightChange(key, key1) {
var _this = this;
console.log(_this.hasCheckedWHRightData);
_this.hasCheckedWHRightData = _this.commonChangeFuc(
key,
key1,
_this.hasCheckedWHRightData,
_this.firstWHRightLocation,
_this.lastWHRightLocation,
_this.value,
false
);
console.log(_this.hasCheckedWHRightData);
},
// 公共按住shift 多选
commonChangeFuc(
key,
key1,
hasCheckedData,
firstLocation,
lastLocation,
arrList,
value
) {
var _this = this;
var cFlag = false; //取消勾选
// debugger
for (var i = 0; i < key.length; i++) {
if (key[i] == key1[0]) {
cFlag = true; //选中
}
}
if (cFlag) {
if (key.length == 1) {
firstLocation = 0;
hasCheckedData.push(key[0]);
} else if (key.length > 1) {
let arr = [];
// 当前有选中数据 并且 按住shift
if (_this.shiftKey) {
// if (isRight) {
for (let i = 0; i < arrList.length; i++) {
let item = value ? arrList[i][value] : arrList[i];
if (item == key[key.length - 2]) {
firstLocation = i;
}
if (item == key1[0]) {
lastLocation = i;
}
}
if (firstLocation != -1 && lastLocation != -1) {
if (firstLocation < lastLocation) {
for (var k = 0; k < arrList.length; k++) {
let item = value ? arrList[k][value] : arrList[k]; if (k >= firstLocation && k <= lastLocation) {
hasCheckedData.push(item);
}
}
} else if (firstLocation > lastLocation) {
for (var k = 0; k < arrList.length; k++) {
if (k >= lastLocation && k <= firstLocation) {
hasCheckedData.push(item);
}
}
}
}
} else {
//不再按shift
hasCheckedData.push(key1[0]);
}
}
} else {
//取消选中的
hasCheckedData = [];
for (var i = 0; i < key.length; i++) {
if (key[i] != key1[0]) {
hasCheckedData.push(key[i]);
}
}
}
// 去重
hasCheckedData = new Set(hasCheckedData);
hasCheckedData = Array.from(hasCheckedData);
return hasCheckedData;
}
}
};
</script> <!-- Add "scoped" attribute to limit CSS to this component only -->
<style lang="scss" scoped>
/deep/ .el-transfer__buttons {
/deep/ button {
display: block;
margin: 0;
&:first-child {
margin-bottom: 12px;
}
}
} .demo {
text-align: left;
}
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
text-align: left;
width: 300px;
height: 300px;
background-color: #42b983;
overflow: scroll;
}
li {
display: block;
margin: 20px 10px;
border: 1px solid #444;
}
a {
color: #42b983;
}
</style>

  

element穿梭框el-transfer增加拖拽排序和shift多选checkbox功能的更多相关文章

  1. el-transfer增加拖拽功能

    el-transfer增加拖拽排序,左右互相拖拽功能: npm i sortablejs <template> <el-transfer ref="transfer&quo ...

  2. php接口实现拖拽排序功能

    列表拖拽排序是一个很常见的功能,但是后端接口如何处理却是一个令人纠结的问题 如何实现才能达到效率最高呢 先分析一个场景,假如有一个页面有十条数据,所谓的拖拽就是在这十条数据来来回回的拖,但是每次拖动都 ...

  3. html5 Sortable.js 拖拽排序源码分析

    最近公司项目经常用到一个拖拽 Sortable.js插件,所以有空的时候看了 Sortable.js 源码,总共1300多行这样,写的挺完美的.   本帖属于原创,转载请出名出处. 官网http:// ...

  4. vue el-transfer新增拖拽排序功能---sortablejs插件

    <template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 -  --> ...

  5. 使用knockout-sortable实现对自定义菜单的拖拽排序

    在开始之前,照例,我们先看效果和功能实现. 关于自定义菜单的实现,这里就不多说了,需要了解的请访问:http://www.cnblogs.com/codelove/p/4838766.html 这里需 ...

  6. jquery sortTable拖拽排序

    所有的事件回调函数都有两个参数:event和ui,浏览器自有event对象,和经过封装的ui对象   ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象   ...

  7. RecyclerViewItemTouchHelperDemo【使用ItemTouchHelper进行拖拽排序功能】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录使用ItemTouchHelper对Recyclerview进行拖拽排序功能的实现. 效果图 代码分析 ItemTouchHel ...

  8. odoo开发笔记-tree列表视图拖拽排序

    odoo列表tree视图 拖拽排序 实现效果: 实现方式: 模型中定义字段: class CusYourModel(models.Model): """ 你的模型 &qu ...

  9. vue列表拖拽排序功能实现

    1.实现目标:目标是输入一个数组,生成一个列表:通过拖拽排序,拖拽结束后输出一个经过排序的数组. 2.实现思路: 2.1是使用HTML5的drag功能来实现,每次拖拽时直接操作Dom节点排序,拖拽结束 ...

随机推荐

  1. html5,css3炫酷实例-元素

    自动完成输入框下拉列表 使用的插件:jquery-ui 使用数据源实现文本框的自动完成功能 <link href="https://cdn.bootcss.com/jqueryui/1 ...

  2. 需要多个参数输入时-----------------考虑使用变种的Builder模式

    业务需求: 创建一个不可变的Person对象,这个Person可以拥有以下几个属性:名字.性别.年龄.职业.车.鞋子.衣服.钱.房子. 要求: 其中名字和性别是必填项,而其他选填项可以根据情况自由输入 ...

  3. 利用python模拟鼠标点击自动完成工作,提升你的工作效率!

    没有什么能比学以致用让学习变得更有动力的了. 不知道大家在工作中有没有一些工作需要重复的点击鼠标,因为会影响到财务统计报表的关系,我们每个月底月初都要修改ERP中的单据日期,单据多的时候光修改就能让你 ...

  4. thinkphp配置到二级目录,不配置到根目录,访问除首页的其他路径都是404报错

    1.在nginx的配置里面,进行重定向 vi /etc/nginx/conf.d/default.conf 2.进入编辑 location /thinkphp/public { if (!-e $re ...

  5. Window Server 2019 配置篇(3)- 建立hyper-v集群并在其上运行win10 pro虚拟机

    上次讲到我们的域里有了网关跟DHCP,这次我们要在域中建立hyper-v集群并在其上运行win10 pro虚拟机 那么什么是hyper-v集群呢? 就是两个及两个以上的运行hyper-v服务的服务器建 ...

  6. Maven插件方式使用Mybatis Generator

    Mybatis Generator Mybatis Generator简称MBG,可以根据数据库自动生成实体类.单表查询接口及其映射xml文件(也可以选择以注解方式生成). 下面介绍一下以maven插 ...

  7. uni-app实现弹窗遮罩

    <template> <view> <view class="systemboxItem" @click="showSystemDialog ...

  8. Redis 详解 (一) redis的简介和安装

    目录 1.Redis 的简介 2.Redis 下载 3.安装环境 4.编译安装 5.启动Redis 6.关闭Redis 7.注意事项 工作中一直在用 Redis,但是一直没有进行系统的总结,这个系列的 ...

  9. 一次C语言编程遇到的问题总结

    今天用C语言做了一个简单的用户登录注册存取款等功能的系统,发现有很多功能并不会实现,大概是使用Java太多了导致许多C的知识都忘记了,现在把碰到的问题总结如下: 1.字符串复制问题 java等一些编程 ...

  10. 三十七、SAP中文本资源的存放

    一.我们看看之前的代码内容 二.菜单转到->文本元素 三.在文本符号中写入需要替换的内容 四.修改一下代码,可以用text-001来等效替换 五.效果如下