vue 拖拽 排序

这篇博客详细介绍了如何在Vue.js中实现拖拽交换元素位置的功能。通过使用draggable属性和dragstart、dragover、dragenter、dragend等事件,配合DataTransfer对象,实现了颜色不同的div之间的拖拽交换。在拖拽过程中,元素的位置会实时更新,提供了一种动态布局的交互体验。
摘要由CSDN通过智能技术生成

根据https://blog.csdn.net/weixin_38404899/article/details/90642209这篇文章所得

<template>
   <!-- 拖拽交换位置效果 -->
	<transition-group tag="div" class="container">
        <!-- 循环出三个颜色不同的div -->
        <div class="item" v-for="(item,index) in items" :key="index" 
        :style="{background:item.color,width:'80px',height:'80px'}"
            draggable="true"
            @dragstart="handleDragStart($event, item)"
            @dragover.prevent="handleDragOver($event, item)"
            @dragenter="handleDragEnter($event, item)"
            @dragend="handleDragEnd($event, item)" >
        </div>
</transition-group>
</template>
 
<script>
// draggable 属性规定元素是否可拖动
// dragstart 事件在用户开始拖动元素或选择的文本时触发
// dragover 当某被拖动的对象在另一对象容器范围内拖动时触发此事件
// dragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
// dragend - 用户完成元素拖动后触发
export default {
 name: 'Toolbar',
 data () {
  return {
   items: [
    { key: 1, color: '#ffebcc'},
    { key: 2, color: '#ffb86c'},
    { key: 3, color: '#f01b2d'}
   ],
     
    dragging: null
  }
 },
 methods:{
  handleDragStart(e,item){
    this.dragging = item;
  },
  handleDragEnd(e,item){
    this.dragging = null
  },
  //首先把div变成可以放置的元素,即重写dragenter/dragover
  // DataTransfer 对象用来保存,通过拖放动作,拖动到浏览器的数据。
  // 如果dropEffect 属性设定为none,则不允许被拖放到目标元素中。
  handleDragOver(e) {
    e.dataTransfer.dropEffect = 'move'// e.dataTransfer.dropEffect="move";//在dragenter中针对放置目标来设置!
  },
  handleDragEnter(e,item){
    e.dataTransfer.effectAllowed = "move"//为需要移动的元素设置dragstart事件
    if(item === this.dragging){
      return
    }
    const newItems = [...this.items]
    console.log(newItems)
    const src = newItems.indexOf(this.dragging)
    const dst = newItems.indexOf(item)
    // 替换
    newItems.splice(dst, 0, ...newItems.splice(src, 1))
    // 让item的颜色等于新交换的颜色
    this.items = newItems
  }
 }
}
</script>
  
<style scoped>
  .container{
    width: 80px;
    height: 300px;
    position: absolute;
    left: 0;
    display:flex;
    flex-direction: column;
    padding: 0;
  }
  .item {
   margin-top: 10px;
   transition: all linear .3s
  }
</style>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值