vue element el-transfer增加拖拽功能

 4536

这篇文章主要介绍了vue element el-transfer增加拖拽功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

芯资管项目要求el-transfer增加拖拽排序,左右上下互相拖拽功能;

原来的组件不支持拖拽,这里要用个第三方脱宅组件sortablejs

首先安装

  1. sudo npm i sortablejs --save-dev

html代码

  1. <template>
  2.     <el-transfer ref="transfer" id="transfer" v-model="value" :data="data">
  3.         <span slot-scope="{ option }" :draggable="!option.disabled" @dragstart="drag($event,option)">{{ option.key }} - {{ option.label }}</span>
  4.     </el-transfer>
  5. </template>

create

  1. <script>
  2. import Sortable from 'sortablejs'
  3. export default {
  4.     data() {
  5.         const generateData = _ => {
  6.             const data = []; for (let i = 1; i <= 15; i++) {
  7.                 data.push({
  8.                     key: i,
  9.                     label: `备选项 ${i}`,
  10.                     disabled: i % 4 === 0 
  11.                 });
  12.             } return data;
  13.         }; return {
  14.             data: generateData(),
  15.             value: [1, 4],
  16.             draggingKey : null 
  17.         }
  18.     },
  19.     mounted() {
  20.         const transfer = this.$refs.transfer.$el
  21.         const leftPanel = transfer.getElementsByClassName("el-transfer-panel")[0].getElementsByClassName("el-transfer-panel__body")[0];
  22.         const rightPanel = transfer.getElementsByClassName("el-transfer-panel")[1].getElementsByClassName("el-transfer-panel__body")[0];
  23.         const rightEl = rightPanel.getElementsByClassName("el-transfer-panel__list")[0]
  24.         Sortable.create(rightEl,{
  25.             onEnd: (evt) => {
  26.                 const {oldIndex,newIndex} = evt;
  27.                 const temp = this.value[oldIndex] 
  28.                 if (!temp || temp === 'undefined') {
  29.                     return
  30.                 }// 解决右边最后一项从右边拖左边,有undefined的问题
  31.                 this.$set(this.value,oldIndex,this.value[newIndex])  
  32.                 this.$set(this.value,newIndex,temp)
  33.             }
  34.         })
  35.         const leftEl = leftPanel.getElementsByClassName("el-transfer-panel__list")[0]
  36.         Sortable.create(leftEl,{
  37.             onEnd: (evt) => {
  38.                 const {oldIndex,newIndex} = evt;
  39.                 const temp = this.data[oldIndex] 
  40.                 if (!temp || temp === 'undefined') {
  41.                     return
  42.                 } // 解决右边最后一项从右边拖左边,有undefined的问题
  43.                 this.$set(this.data,oldIndex,this.data[newIndex]) 
  44.                 this.$set(this.data,newIndex,temp)
  45.             }
  46.         })
  47.         leftPanel.ondragover = (ev) => {
  48.             ev.preventDefault()
  49.         }
  50.         leftPanel.ondrop = (ev) => {
  51.             ev.preventDefault();
  52.             const index = this.value.indexOf(this.draggingKey) if(index !== -1){ 
  53.                 this.value.splice(index,1)
  54.             }
  55.         }
  56.         rightPanel.ondragover = (ev) => {
  57.             ev.preventDefault()
  58.         }
  59.         rightPanel.ondrop = (ev) => {
  60.             ev.preventDefault();  if(this.value.indexOf(this.draggingKey) === -1){
  61.                 this.value.push(this.draggingKey)
  62.             }
  63.         }
  64.     },
  65.     methods: {
  66.         drag(ev,option) { 
  67.             this.draggingKey = option.key
  68.         }
  69.     }
  70. }
  71. </script>

到此这篇关于vue element el-transfer增加拖拽功能的文章就介绍到这了。


TAG标签:
本文网址:https://www.zztuku.com/detail-8616.html
站长图库 - vue element el-transfer增加拖拽功能
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐