vue element el-transfer增加拖拽功能


Posted in Vue.js onJanuary 15, 2021

芯资管项目要求el-transfer增加拖拽排序,左右上下互相拖拽功能;
原来的组件不支持拖拽,这里要用个第三方脱宅组件sortablejs

首先安装

sudo npm i sortablejs --save-dev

html代码

<template>
  <el-transfer ref="transfer" id="transfer" v-model="value" :data="data">
   <span slot-scope="{ option }" :draggable="!option.disabled" @dragstart="drag($event,option)">{{ option.key }} - {{ option.label }}</span>
  </el-transfer>
</template>```

create

<script>

   import Sortable from 'sortablejs'

   export default {
      data() {
        const generateData = _ => {
          const data = []; for (let i = 1; i <= 15; i++) {
            data.push({
              key: i,
              label: `备选项 ${i}`,
              disabled: i % 4 === 0 });
          } return data;
        }; return {
          data: generateData(),
          value: [1, 4],
          draggingKey : null }
      },
      mounted() {
        const transfer = this.$refs.transfer.$el
        const leftPanel = transfer.getElementsByClassName("el-transfer-panel")[0].getElementsByClassName("el-transfer-panel__body")[0];
        const rightPanel = transfer.getElementsByClassName("el-transfer-panel")[1].getElementsByClassName("el-transfer-panel__body")[0];
        const rightEl = rightPanel.getElementsByClassName("el-transfer-panel__list")[0]
        Sortable.create(rightEl,{
          onEnd: (evt) => {
            const {oldIndex,newIndex} = evt;
            const temp = this.value[oldIndex] 
            if (!temp || temp === 'undefined') {
              return
            }// 解决右边最后一项从右边拖左边,有undefined的问题
            this.$set(this.value,oldIndex,this.value[newIndex])  
            this.$set(this.value,newIndex,temp)
          }
        })
        const leftEl = leftPanel.getElementsByClassName("el-transfer-panel__list")[0]
        Sortable.create(leftEl,{
          onEnd: (evt) => {
            const {oldIndex,newIndex} = evt;
            const temp = this.data[oldIndex] 
            if (!temp || temp === 'undefined') {
              return
            } // 解决右边最后一项从右边拖左边,有undefined的问题
            this.$set(this.data,oldIndex,this.data[newIndex]) 
            this.$set(this.data,newIndex,temp)
          }
        })
        leftPanel.ondragover = (ev) => {
          ev.preventDefault()
        }
        leftPanel.ondrop = (ev) => {
          ev.preventDefault();
          const index = this.value.indexOf(this.draggingKey) if(index !== -1){ this.value.splice(index,1)
          }
        }
        rightPanel.ondragover = (ev) => {
          ev.preventDefault()
        }
        rightPanel.ondrop = (ev) => {
          ev.preventDefault();  if(this.value.indexOf(this.draggingKey) === -1){ this.value.push(this.draggingKey)
          }
        }
      },
      methods: {
        drag(ev,option) { this.draggingKey = option.key
        }
      }

    } 
</script>

到此这篇关于vue element el-transfer增加拖拽功能的文章就介绍到这了,更多相关element el-transfer拖拽内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue 通过base64实现图片下载功能
Dec 19 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
使用这 6个Vue加载动画库来减少我们网站的跳出率
May 18 Vue.js
vue3使用vue-router的完整步骤记录
Jun 20 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
Vue实现多页签组件
Jan 14 #Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 #Vue.js
Vue中引入svg图标的两种方式
Jan 14 #Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 #Vue.js
vue 递归组件的简单使用示例
Jan 14 #Vue.js
vue element和nuxt的使用技巧分享
Jan 14 #Vue.js
vue动态设置路由权限的主要思路
Jan 13 #Vue.js
You might like
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
webpack组织模块打包Library的原理及实现
2018/03/10 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
js设置默认时间跨度过程详解
2019/07/17 Javascript
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
乔迁宴答谢词
2014/01/21 职场文书
美国留学经济担保书
2014/05/20 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
电影复兴之路观后感
2015/06/02 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
JavaScript实现简单图片切换
2021/04/29 Javascript
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android