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 $router和$route的区别详解
Dec 02 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
vuex的使用和简易实现
Jan 07 Vue.js
vue+echarts实现中国地图流动效果(步骤详解)
Jan 27 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
vue elementUI表格控制对应列
Apr 13 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
我的论坛源代码(五)
2006/10/09 PHP
PHP新手上路(十一)
2006/10/09 PHP
php实现按文件名搜索文件的远程文件查找器
2014/05/10 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
php检查页面是否被百度收录
2015/10/28 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
js模拟类继承小例子
2010/07/17 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
2018/11/12 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
Python入门教程之运算符与控制流
2016/08/17 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
初中教师业务学习材料
2014/05/12 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书