可拖拽排序的列表

2018-06-23  本文已影响1053人  AlexProgramer
依赖装一下;
npm install awe-dnd --save
引用用一下;

main.js

// ......
import VueDND from 'awe-dnd'
Vue.use(VueDND)
// ......

一、单一列表项的拖拽排序

<template>
  <ul class="person-list">
      <li v-for="item in person" v-dragging="{ item: item, list: person, group: 'personInfo' }"
          :key="item.name"
      >{{item.name}}
      </li>
  </ul>
</template>

<script>
export default {
  data () {
    return {
      person: [
        {
          name: "Jack"
        }, {
          name: "Rose"
        }, {
          name: "John"
        }
      ]
    }
  },
  mounted () {
    this.$dragging.$on('dragged', (res) => { // 拖拽时触发,回调里面有一个参数
      // ...
    })
    this.$dragging.$on('dragend', () => { // 停止拖拽后触发,回调无参数
      // ...
    })
  }
}
</script>

都是顾名思义的代码,不做解释;来看个高级点的

二、复合列表项的拖拽排序

直接拿走先

<template>
  <ul class="person-list">
      <li v-for="item in person" v-dragging="{ item: item, list: person, group: 'personInfo' }"
          :key="item.name"
      >{{color.text}}
        <ul>
          <li v-for='(member,index) in item.children' v-dragging="{ item: member, list: item.children, group: item.name }"
          :key="index">{{member.name}}</li>
        </ul>
      </li>
  </ul>
</template>

<script>
export default {
  data () {
    return {
      person: [
        {
          name: "Jack",
          children: [
            {
              sex: 'boy',
              name: 'Mike1'
            },
            {
              sex: 'girl',
              name: 'Robin1'
            }
          ]
        }, {
          name: "Rose",
          children: [
            {
              sex: 'boy',
              name: 'Mike2'
            },
            {
              sex: 'girl',
              name: 'Robin2'
            }
          ]
        }, {
          name: "John",
          children: [
            {
              sex: 'boy',
              name: 'Mike3'
            },
            {
              sex: 'girl',
              name: 'Robin3'
            }
          ]
        }
      ]
    }
  },
  mounted () {
    this.$dragging.$on('dragged', (res) => {
      // ...
    })
    this.$dragging.$on('dragend', () => {
      // ...
    })
  }
}
</script>

自定义指令v-dragging中的参数,对号入座即可;但是最重要的参数,就是group了。它用于区分需要排序的对象组;由于最外面的一层都是personInfo,所以最外层的list之间可以拖拽排序;而里面,分别是三个列表项的子列表;这时就需要去区分它们之间的组名,也就是group;这个属性只做区分用,没实际用途;所以,可以直接利用最外层的列表项属性,去区分;从而实现复合列表的排序;需要额外注意的是:这些组名,无论谁嵌套谁,都不能有重名;否则拖拽效果异常

上一篇下一篇

猜你喜欢

热点阅读