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 element-ul实现展开和收起功能的实例代码
Nov 25 Vue.js
Vue组件生命周期运行原理解析
Nov 25 Vue.js
vue中利用three.js实现全景图的完整示例
Dec 07 Vue.js
Vue实现点击当前行变色
Dec 14 Vue.js
Vue3 实现双盒子定位Overlay的示例
Dec 22 Vue.js
在vue项目中封装echarts的步骤
Dec 25 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
Vue vee-validate插件的简单使用
Jun 22 Vue.js
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 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
php中用文本文件做数据库的实现方法
2008/03/27 PHP
PHP 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
php中JSON的使用与转换
2015/01/14 PHP
PHP的反射机制实例详解
2017/03/29 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
TFDN图片播放器 不错自动播放
2006/10/03 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Django用户认证系统 User对象解析
2019/08/02 Python
Python 多线程共享变量的实现示例
2020/04/17 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
文员个人的求职信范文
2013/09/26 职场文书
毕业生怎样写好自荐信
2013/11/11 职场文书
小学教师国培感言
2014/02/08 职场文书
护士上岗前培训自我鉴定
2014/04/20 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
三八妇女节标语
2014/10/09 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫