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 插槽简介及使用示例
Nov 19 Vue.js
深入了解Vue3模板编译原理
Nov 19 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue中data改变后让视图同步更新的方法
Mar 29 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
浅谈Vue的computed计算属性
Mar 21 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调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
php设计模式之委托模式
2016/02/13 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
jquery拖动插件(jquery.drag)使用介绍
2013/06/18 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
2016/06/02 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
客服服务心得体会
2013/12/30 职场文书
市场营销策划方案
2014/06/11 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
财务务虚会发言材料
2014/10/20 职场文书