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实现表格合并行数据
Nov 30 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
vuex的使用步骤
Jan 06 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
Vue如何实现变量表达式选择器
Feb 18 Vue.js
详解vue中v-for的key唯一性
May 15 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
vue实现移动端div拖动效果
Mar 03 Vue.js
vue3使用vuedraggable实现拖拽功能
Apr 06 Vue.js
VUE递归树形实现多级列表
Jul 15 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
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
javascript document.referrer 用法
2009/04/30 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
ES6学习笔记之Set和Map数据结构详解
2017/04/07 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
浅谈Python数据类型之间的转换
2016/06/08 Python
利用aardio给python编写图形界面
2017/08/21 Python
python ddt实现数据驱动
2018/03/14 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python实现Virginia无密钥解密
2019/03/20 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
Python新手学习标准库模块命名
2020/05/29 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
我未来的职业规划范文
2014/01/11 职场文书
服务承诺书怎么写
2014/05/24 职场文书
个人工作作风整改措施思想汇报
2014/10/13 职场文书