vue 拖拽排序

1.vuedraggable

中文文档vuedraggablehttps://www.itxst.com/vue-draggable/tutorial.htmlhttps://www.itxst.com/vue-draggable/tutorial.html

vuedraggable 组件式封装,并且将可拖动元素放进了 transition-group 上面,过渡动画都比较好。

//下载
npm i -S vuedraggable
//引入
import draggable from 'vuedraggable'
//注册
components: { draggable },

//使用
 //html
<vuedraggable class="wrapper" v-model="list">
    <transition-group>
      <div v-for="item in list" :key="item" class="item">
        <p>{{item}}</p>
      </div>
    </transition-group>
  </vuedraggable>
//js
data() {
    return {
      list: [1,2,34,4,54,5]
    }
  },

2.vue-dragging

封装了 v-dragging 全局指令,然后通过全局指令去数据绑定等。

awe-dnd 是没有双向绑定, 因此提供了事件,在拖拽结束的时候用来更新列表或者是去触发父组件监听的事件

//下载
npm install awe-dnd --save
//引入
import VueDND from 'awe-dnd'
//注册
Vue.use(VueDND)
//使用
//html
// item 就是单个对象,而 list 则是数据列表,group 则是用来声明一个组,来保证可以在一个页面中进行多个数据源的操作。
<div class="color-list">
      <div
          class="color-item"
          v-for="color in colors" v-dragging="{ item: color, list: colors, group: 'color' }"
          :key="color.text"
      >{{color.text}}</div>
  </div>


//js
 data () {
    return {
        colors: [{
            text: "Aquamarine"
        }, {
            text: "Hotpink"
        }, {
            text: "Gold"
        }, {
            text: "Crimson"
        }, {
            text: "Blueviolet"
        }, {
            text: "Lightblue"
        }, {
            text: "Cornflowerblue"
        }, {
            text: "Skyblue"
        }, {
            text: "Burlywood"
        }]
    }
  },


mounted () {//两个事件方法如下
    this.$dragging.$on('dragged', ({ value }) => {
      console.log(value.item)
      console.log(value.list)
      console.log(value.otherData)
    })
    this.$dragging.$on('dragend', (res) => {
        console.error(res);
    })
  }

3.vue-drag-drop

//下载
npm install --save vue-drag-drop
//引入
import VueDragDrop from 'vue-drag-drop'
//注册
Vue.use(VueDragDrop)
//使用
//html
//drag 可拖动元素
<drag
  v-show="whereUtil === false"
  :transfer-data="{ whereDrag }"
  style="display:inline;margin-right:15px"
>
  <el-button id="where" type="primary" plain>WHERE</el-button>
</drag>
// drop可拖动的元素允许被拖到这个位置
<drop @drop="handleDrop">
  <div
    id="queryArea"
    class="input"
    draggable
    style="width: 90%;"
  >
  	<el-col v-show="whereUtil === true">
	  	<span>WHERE </span>
	    <el-input
	      v-model="whereValue"
	      style="width:70%"
	      clearable
	    />
	</el-col>
  </div>
</drop>


//js
data(){
return{
    // 数据
whereValue: '',
whereDrag: '', // where拖動
whereUtil: false
}
},
methods:{
    handleDrop(data, event) {
// data获取到拖动元素的数据,key为:transfer-data中的值
  const value = Object.keys(data).join()
  if (value === 'whereDrag') {
  	this.whereUtil = true
  }
}
}

4.vue-slicksort

中文文档 vue-slicksort/zh.md at 4c7d832e1d87c3681a8aa52d4566271f774feb26 · Jexordexan/vue-slicksort · GitHubA set of vue mixins to turn any list into an animated, touch-friendly, sortable list ✌️ - vue-slicksort/zh.md at 4c7d832e1d87c3681a8aa52d4566271f774feb26 · Jexordexan/vue-slicksorthttps://github.com/Jexordexan/vue-slicksort/blob/HEAD/doc/zh.md

//下载
npm install vue-slicksort --save
//引入
import { SlickList, SlickItem } from 'vue-slicksort'
//注册
 components: {
    SlickItem,
    SlickList
  },
//使用
//html
<div class="root1">
    <SlickList
      :lockToContainerEdges="true"
      axis="x"
      lockAxis="x"
      v-model="items"
      class="SortableList"
      @input="getChangeLists"
    >
      <SlickItem
        v-for="(item, index) in items"
        class="SortableItem"
        :index="index"
        :key="index"
      >
        <div class="item-name">{{ item.name }}</div>
        <div class="root2">
          <SlickList
            :lockToContainerEdges="true"
            class="list"
            lockAxis="y"
            v-model="item.itemArr"
          >
            <SlickItem
              class="list-item"
              v-for="(item, index) in item.itemArr"
              :index="index"
              :key="index"
            >
              {{ item }}
            </SlickItem>
          </SlickList>
        </div>
      </SlickItem>
    </SlickList>
  </div>


//js
 data() {
    return {
      flag: true,
      items: [
        {
          name: 'Tab-1',
          itemArr: ['1-1', '1-2', '1-3']
        },
        {
          name: 'Tab-2',
          itemArr: ['2-1', '2-2', '2-3']
        },
        {
          name: 'Tab-3',
          itemArr: ['3-1', '3-2', '3-3']
        }
      ]
    }
  },
  methods: {
    getChangeLists(vals) {
      console.log(vals, 'vals')
    }
  }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue拖拽排序组件可以通过封装实现复用和方便使用。以下是一个简单的Vue拖拽排序组件的实现: 1. 安装vue-draggable插件 首先,我们需要安装Vue.js的拖拽排序插件`vue-draggable`,它提供了`draggable`和`sortable`两个组件。 ``` npm install vuedraggable --save ``` 2. 创建Draggable.vue组件 在Vue项目中创建一个Draggable.vue组件,用于封装拖拽排序功能。该组件包含以下代码: ```html <template> <draggable v-model="list" :options="options"> <slot></slot> </draggable> </template> <script> import draggable from 'vuedraggable'; export default { name: 'Draggable', components: { draggable }, props: { list: { type: Array, default: function() { return []; }, }, options: { type: Object, default: function() { return {}; }, }, }, }; </script> ``` 在这个组件中,我们将`draggable`组件作为子组件,并使用`slot`来插入要排序的元素。我们还定义了两个属性:`list`和`options`。`list`属性是我们要排序的元素数组,`options`属性是传递给`draggable`组件的选项。 3. 在父组件中使用Draggable组件 在父组件中,我们可以使用`<draggable>`标签来包含要排序的元素,就像这样: ```html <template> <div> <draggable :list="items" :options="options"> <div v-for="(item, index) in items" :key="index"> {{ item }} </div> </draggable> </div> </template> <script> import Draggable from './Draggable.vue'; export default { name: 'App', components: { Draggable }, data() { return { items: ['Item 1', 'Item 2', 'Item 3'], options: { animation: 200, }, }; }, }; </script> ``` 在这个例子中,我们将`items`数组传递给`<draggable>`组件的`list`属性,将动画速度设置为200毫秒。 4. 定制Draggable组件 我们还可以通过添加一些自定义代码来进一步定制`Draggable`组件的行为。例如,我们可以添加一个事件处理程序来监听排序后的结果: ```html <template> <draggable v-model="list" :options="options" @end="onEnd"> <slot></slot> </draggable> </template> <script> import draggable from 'vuedraggable'; export default { name: 'Draggable', components: { draggable }, props: { list: { type: Array, default: function() { return []; }, }, options: { type: Object, default: function() { return {}; }, }, }, methods: { onEnd: function(evt) { this.$emit('onEnd', evt); }, }, }; </script> ``` 在这个例子中,我们添加了一个`onEnd`方法,当拖拽排序完成时,会触发`end`事件并调用该方法。我们还使用`$emit`方法将事件传递给父组件。 5. 在父组件中监听Draggable组件的事件 最后,在父组件中,我们可以通过添加一个相应的事件处理程序来监听`onEnd`事件: ```html <template> <div> <draggable :list="items" :options="options" @onEnd="onEnd"> <div v-for="(item, index) in items" :key="index"> {{ item }} </div> </draggable> </div> </template> <script> import Draggable from './Draggable.vue'; export default { name: 'App', components: { Draggable }, data() { return { items: ['Item 1', 'Item 2', 'Item 3'], options: { animation: 200, }, }; }, methods: { onEnd: function(evt) { console.log('Sorted item:', evt.item); console.log('New items order:', this.items); }, }, }; </script> ``` 在这个例子中,我们添加了一个`onEnd`方法,当`onEnd`事件发生时,会输出排序后的元素和新的元素顺序。 这就是一个简单的Vue拖拽排序组件的实现。通过封装,我们可以轻松地将这个组件用于不同的应用场景,并实现代码重用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值