Vue 3 中的拖拽排序功能实现

Vue 3 中的拖拽排序功能实现

在Web开发中,拖拽排序是一个常见且实用的功能,它允许用户通过拖动元素来重新排列它们的位置。Vue 3,作为现代JavaScript框架的佼佼者,提供了强大的响应式系统和组件化开发能力,使得实现这样的功能变得既简单又高效。今天,我们将通过一个简单的Vue 3 Demo来演示如何实现拖拽排序功能。

效果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


准备工作

首先,确保你已经安装了Vue 3环境。你可以使用Vue CLI、Vite或其他现代前端构建工具来搭建项目。在这个Demo中,我们将直接在一个Vue组件中实现拖拽排序功能。

实现步骤

1. 定义数据

在Vue组件的<script setup>部分,我们首先需要定义一组问题和一个用于记录当前被拖拽元素索引的响应式引用。

<script setup>
import { ref } from 'vue';

const questions = ref([
  { id: 1, text: '问题 1' },
  { id: 2, text: '问题 2' },
  { id: 3, text: '问题 3' },
  { id: 4, text: '问题 4' }
]);

const draggingIndex = ref(-1); // 被拖拽元素的索引
</script>

2. 模板部分

在模板中,我们使用v-for指令来渲染问题列表,并为每个列表项添加拖拽相关的事件监听器和属性。

<template>
  <div>
    <ul>
      <li
        v-for="(question, index) in questions"
        :key="question.id"
        draggable="true"
        @dragstart="dragStart(index)"
        @dragover="allowDrop"
        @drop="drop(index)"
        class="draggable-item"
      >
        {{ question.text }}
      </li>
    </ul>
  </div>
</template>

3. 方法实现

接下来,我们需要实现dragStartallowDropdrop这三个方法。

  • dragStart:当拖拽开始时,记录被拖拽元素的索引。
  • allowDrop:阻止默认处理(即阻止元素在放置时打开为链接),这是实现拖拽排序的关键。
  • drop:处理放置操作,将被拖拽的元素从其原始位置移除并插入到新位置。
<script setup>
// ...(省略数据定义)

const dragStart = index => {
  draggingIndex.value = index;
};

const allowDrop = e => {
  e.preventDefault();
};

const drop = index => {
  const draggedItem = questions.value.splice(draggingIndex.value, 1)[0];
  questions.value.splice(index, 0, draggedItem);
  draggingIndex.value = -1;
};
</script>

4. 样式

最后,我们为拖拽项添加一些基本的样式,使其看起来更美观且易于操作。

<style scoped>
.draggable-item {
  padding: 10px;
  margin: 5px;
  border: 1px solid #ccc;
  cursor: move;
  background-color: #f9f9f9;
}
</style>

5. 完整示例代码

<template>
    <div>
      <ul>
        <li
          v-for="(question, index) in questions"
          :key="question.id"
          draggable="true"
          @dragstart="dragStart(index)"
          @dragover="allowDrop"
          @drop="drop(index)"
          class="draggable-item"
        >
          {{ question.text }}
        </li>
      </ul>
    </div>
  </template>
  
  <script setup>
  import { ref } from 'vue';
  
  const questions = ref([
    { id: 1, text: '问题 1' },
    { id: 2, text: '问题 2' },
    { id: 3, text: '问题 3' },
    { id: 4, text: '问题 4' }
  ]);
  
  const draggingIndex = ref(-1); // 被拖拽元素的索引
  
  // 拖拽开始
  const dragStart = index => {
    draggingIndex.value = index;
  };
  
  // 允许放置
  const allowDrop = e => {
    e.preventDefault();
  };
  
  // 放置
  const drop = index => {
    const draggedItem = questions.value.splice(draggingIndex.value, 1)[0]; // 移除被拖拽的元素
    questions.value.splice(index, 0, draggedItem); // 将被拖拽的元素插入到新位置
    draggingIndex.value = -1; // 重置被拖拽元素的索引
  };
  </script>
  
  <style scoped>
  .draggable-item {
    padding: 10px;
    margin: 5px;
    border: 1px solid #ccc;
    cursor: move;
    background-color: #f9f9f9;
  }
  </style>

总结

通过以上步骤,我们成功在Vue 3中实现了一个简单的拖拽排序功能。Vue的响应式系统和组件化特性使得这样的功能实现起来既直观又高效。你可以根据项目的具体需求,进一步扩展和定制这个Demo,比如添加动画效果、处理错误情况等。希望这篇文章对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。


  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Ant Design Vue 是一个基于 Vue.js 的 UI 组件库,而 vuedraggable 是一个 Vue.js 的拖放组件。两者结合使用,可以实现拖拽排序的功能。 首先,需要在项目安装 Ant Design Vuevuedraggable: ``` npm install ant-design-vue vuedraggable --save ``` 接着,在需要使用拖拽排序功能的组件,引入 vuedraggable 组件: ```html <template> <div> <draggable v-model="list" :options="{handle:'.drag-handle'}"> <div v-for="(item, index) in list" :key="item.id"> <span class="drag-handle">☰</span> {{ item.name }} </div> </draggable> </div> </template> <script> import draggable from 'vuedraggable'; export default { components: { draggable, }, data() { return { list: [ { id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' }, { id: 4, name: 'Item 4' }, { id: 5, name: 'Item 5' }, ], }; }, }; </script> ``` 在上述示例,我们使用了 v-model 绑定了一个数组 `list`,这个数组里面包含了需要排序的元素。然后,在 `draggable` 组件,我们使用了 `v-for` 循环渲染了每个元素,并且给每个元素添加了一个拖拽的句柄(也就是 `drag-handle` 类的元素)。 最后,我们还需要在 `options` 属性传入一个选项对象,这个对象包含了一个 `handle` 属性,它指定了拖拽句柄的 CSS 选择器。 这样,我们就可以通过拖拽句柄来实现拖拽排序了。当用户拖动一个元素时,它会被移动到新的位置上,并且 `list` 数组对应的元素顺序也会发生改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jieyucx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值