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编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
基于vue+echarts数据可视化大屏展示的实现
Dec 25 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
vue实现轮播图帧率播放
Jan 26 Vue.js
vue登录页实现使用cookie记住7天密码功能的方法
Feb 18 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
Vue3中toRef与toRefs的区别
Mar 24 Vue.js
vue中data里面的数据相互使用方式
Jun 05 Vue.js
vue3 自定义图片放大器效果的示例代码
Jul 23 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
CI框架给视图添加动态数据
2014/12/01 PHP
php邮件发送的两种方式
2020/04/28 PHP
在WordPress中实现评论头像的自定义默认和延迟加载
2015/11/24 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
JS 时间显示效果代码
2009/08/23 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
Vue使用枚举类型实现HTML下拉框步骤详解
2018/02/05 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
[08:47]2018国际邀请赛 OG战队举杯时刻
2018/08/29 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
python实现音乐下载的统计
2018/06/20 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Django获取应用下的所有models的例子
2019/08/30 Python
如何理解python对象
2020/06/21 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
初一英语教学反思
2014/01/11 职场文书
导购员的岗位职责
2014/02/08 职场文书
导游个人求职信
2014/04/25 职场文书
我的长生果教学反思
2014/04/28 职场文书
组工干部对照检查材料
2014/08/25 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
小学新课改心得体会
2016/01/22 职场文书