vue实现可拖拽列表

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

直接上代码

<!-- 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>

### Vue 实现拖拽数组列表组件 #### 使用 `vuedraggable` 库简化开发过程 为了更高效地实现Vue 中创建一个能够拖拽排序的数组列表,推荐使用第三方库 `vuedraggable`。该库基于 Sortable.js 构建,在处理复杂的交互逻辑方面表现出色。 安装依赖: ```bash npm install vuedraggable@next --save ``` 引入并注册 draggable 组件: ```javascript import { Dragaggable } from 'vuedraggable'; export default { components: { Draggable, }, }; ``` 模板部分展示如下结构: ```html <draggable :list="items" @end="onEnd"> <div v-for="(item, index) in items" :key="index">{{ item.name }}</div> </draggable> ``` 这里定义了一个名为 `items` 的数据属性用于存储待渲染的数据源;当发生拖放事件结束时触发 `onEnd()` 方法更新状态[^4]。 #### 自定义样式与动画效果 为了让用户体验更加流畅自然,可以在 CSS 文件里添加一些简单的过渡效果: ```css .dragging-item { transition: transform .3s ease; } ``` 同时也可以利用 Vue 提供的 `<transition-group>` 来增强视觉反馈: ```html <draggable :list="items" @start="drag=true" @end="drag=false; onEnd()"> <transition-group type="transition" name="flip-list"> <div v-for="(item, index) in items" :key="index" class="dragging-item">{{ item.name }} </div> </transition-group> </draggable> ``` 上述代码片段实现了基本的功能需求,并且加入了平滑切换的效果。 #### 数据同步至服务端 完成前端交互设计之后,还需要考虑如何将更改后的顺序保存到服务器上。通常情况下会监听特定时刻(比如拖拽结束后),向后端发送请求通知其最新的排列情况。 ```javascript methods: { async onEnd() { try { await axios.post('/api/updateOrder', this.items); } catch (error) { console.error('Failed to update order:', error); } } } ``` 这样就构成了完整的前后端联动机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

学而时习之不亦说乎。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值