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中如何添加百度统计代码
Dec 19 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
vue backtop组件的实现完整代码
Apr 07 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
springboot+VUE实现登录注册
May 27 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
vue中div禁止点击事件的实现
Apr 02 Vue.js
vue 给数组添加新对象并赋值
Apr 20 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
使用JavaScript修改浏览器URL地址栏的实现代码
2013/10/21 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
Puppet的一些技巧
2018/09/17 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
实例分析编写vue组件方法
2019/02/12 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
Python高效编程技巧
2013/01/07 Python
简述Python中的面向对象编程的概念
2015/04/27 Python
python获取list下标及其值的简单方法
2016/09/12 Python
django 创建过滤器的实例详解
2017/08/14 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
详解python itertools功能
2020/02/07 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
一组SQL面试题
2016/02/15 面试题
师范大学生求职信
2014/06/13 职场文书
高效课堂标语
2014/06/26 职场文书
社区创先争优承诺书
2014/08/30 职场文书
心得体会的写法
2014/09/05 职场文书
抄袭同学作业检讨书1000字
2014/11/20 职场文书
入党转正介绍人意见
2015/06/03 职场文书
运动会3000米加油稿
2015/07/21 职场文书
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS