vue实现可拖拽列表

文章介绍了如何使用Vue.js实现一个可拖拽列表,包括dragstart,dragenter,dragend等事件处理以及TransitionGroup的使用,展示了如何在列表中拖动元素并保持数据同步。
摘要由CSDN通过智能技术生成

直接上代码

<!-- vue实现可拖拽列表 -->
<template>
  <div>
    <button @click="logcolig">打印数据</button>
    <TransitionGroup name="list" tag="div" class="container">
      <div
        class="item"
        v-for="(item, i) in list"
        :key="item.id"
        :draggable="true"
        @dragstart="dragstart($event, i)"
        @dragenter="dragenter($event, i)"
        @dragend="dragend"
        @dragover="dragover"
      >
        {{ item.name }}
      </div>
    </TransitionGroup>
  </div>
</template>

<script>
let dragIndex = 0;

export default {
  created() {},
  mounted() {},
  beforeDestroy() {},
  props: {},
  data() {
    return {
      list: [
        { name: "a", id: 1 },
        { name: "b", id: 2 },
        { name: "c", id: 3 },
        { name: "d", id: 4 },
        { name: "e", id: 5 },
      ],
    };
  },
  //方法集合
  methods: {

    logcolig(){
      console.log(this.list);
    },
    dragstart(e, index) {
      e.stopPropagation();
      dragIndex = index;
      setTimeout(() => {
        e.target.classList.add("moveing");
      }, 0);
    },
    dragenter(e, index) {
      e.preventDefault();
      // 拖拽到原位置时不触发
      if (dragIndex !== index) {
        const source = this.list[dragIndex];
        this.list.splice(dragIndex, 1);
        this.list.splice(index, 0, source);

        // 更新节点位置
        dragIndex = index;
      }
    },
    dragover(e) {
      e.preventDefault();
      e.dataTransfer.dropEffect = "move";
    },
    dragend(e) {
      e.target.classList.remove("moveing");
    },
  },
};
</script>
<style lang="stylus" rel="stylesheet/stylus" scoped>
.item {
  width: 200px;
  height: 40px;
  line-height: 40px;
  // background-color: #f5f6f8;
  background-color: skyblue;
  text-align: center;
  margin: 10px;
  color: #fff;
  font-size: 18px;
}

.container {
  position: relative;
  padding: 0;
}

.moveing {
  opacity: 0;
}

.list-move, .list-enter-active, .list-leave-active {
  transition: all 0.2s ease;
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学而时习之不亦说乎。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值