基于vue-draggable 实现三级拖动排序效果

当我们需要实现在前端页面中完成三级拖动排序效果的时候,可以使用vue-draggable组件来完成。具体实现步骤如下:

步骤一:安装vue-draggable

首先要安装vue-draggable组件:

npm install vuedraggable

步骤二:定义基本结构

Vue组件中,我们需要定义一些基本的结构,包括三个列表,两个按钮等。可以参考以下代码:

<template>
  <div>
    <div class="list-title">一级列表</div>
      <draggable v-model="firstLevelList" :move="checkMove" class="list">
        <div v-for="(item, index) in firstLevelList" :key="index">
          <div class="item">{{ item.name }}</div>
          <div class="arrow" v-if="item.children.length" @click="toggleSecondLevel(item)">{{ item.show ? '收起' : '展开' }}</div>
          <draggable v-if="item.show" v-model="item.children" class="list">
            <div v-for="(chitem, chindex) in item.children" :key="chindex">
              <div class="item">{{ chitem.name }}</div>
              <div class="arrow" v-if="chitem.children.length" @click="toggleThirdLevel(chitem)">{{ chitem.show ? '收起' : '展开' }}</div>
              <draggable v-if="chitem.show" v-model="chitem.children" class="list">
                <div v-for="(thitem, thindex) in chitem.children" :key="thindex">
                  <div class="item">{{ thitem.name }}</div>
                </div>
              </draggable>
            </div>
          </draggable>
        </div>
      </draggable>
    <div class="btn-wrap">
      <button @click="addFirstLevel">添加一级列表</button>
      <button @click="resetList">重置</button>
    </div>
  </div>
</template>

步骤三:绑定数据

在Vue组件中,我们需要绑定一些数据,包括三个列表的数据、拖动行为相关数据等,可以参考以下代码:

<script>
import draggable from 'vuedraggable'

export default {
  data() {
    return {
      firstLevelList: [
        { name: '一级列表1', children: [], show: true },
        { name: '一级列表2', children: [], show: true },
        { name: '一级列表3', children: [], show: true },
      ],
      dragSettings: {
        animation: 200,
        group: 'description',
        disabled: false,
        ghostClass: 'ghost'
      }
    }
  },
  components: {
    draggable
  },
  methods: {
    checkMove: function(evt) {
      if (evt.dragged.parentElement.classList.contains('list')) {
        return true
      } else {
        return false
      }
    },
    toggleSecondLevel(item) {
      this.$set(item, 'show', !item.show)
    },
    toggleThirdLevel(item) {
      this.$set(item, 'show', !item.show)
    },
    addFirstLevel() {
      this.firstLevelList.push({ name: `一级列表${this.firstLevelList.length + 1}`, children: [], show: true })
    },
    resetList() {
      this.firstLevelList = [
        { name: '一级列表1', children: [], show: true },
        { name: '一级列表2', children: [], show: true },
        { name: '一级列表3', children: [], show: true },
      ]
    }
  }
}
</script>

步骤四:添加样式

最后,我们需要添加一些基本的样式,定义列表、按钮等的样式。可以参考以下代码:

<style>
.list {
  background-color: #efefef;
  padding: 10px;
  margin-bottom: 10px;
}
.item {
  background-color: #fff;
  padding: 10px;
  cursor: move;
  border-bottom: 1px solid #ddd;
}
.arrow {
  padding-left: 20px;
  cursor: pointer;
  color: #333;
  font-size: 14px;
}
.arrow:hover {
  color: #1890ff;
}
.list-title {
  font-size: 18px;
  font-weight: bold;
  margin-bottom: 10px;
}
.btn-wrap {
  margin-top: 20px;
  text-align: center;
}
button {
  padding: 5px 20px;
  cursor: pointer;
  margin-right: 10px;
  border: none;
  background-color: #1890ff;
  color: #fff;
  font-size: 14px;
}
button:hover {
  background-color: #096dd9;
}
.ghost {
  opacity: 0.5;
}
</style>

通过上述步骤,我们可以实现一个基于vue-draggable组件的三级拖动排序效果。

示例说明1:JSFiddle demo

示例说明2:

现在,假设我们有一个需求:在三级列表中保持元素的顺序,但是在拖动到新的位置时,自动将元素移到父级列表的底部。我们可以通过以下代码来实现这个需求:

checkMove: function(evt) {
  if (evt.dragged.parentElement.classList.contains('list')) {
    let oldIndex = evt.oldIndex
    let newIndex = evt.newIndex
    let parentList = evt.dragged.parentElement.__vue__.items
    let item = parentList.splice(oldIndex, 1)[0]
    parentList.splice(parentList.length, 0, item)
    return false
  } else {
    return false
  }
}

在该代码中,我们首先分别获取新旧的元素位置,以及父级列表。然后,通过splice将元素从旧位置移除,并将其添加到父级列表的末尾。

示例说明2:JSFiddle demo

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于vue-draggable 实现三级拖动排序效果 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • VUE中使用Vue-resource完成交互

    使用Vue-resource完成交互可以实现前端页面和后端服务器之间的数据交换和通信。下面是使用Vue-resource实现交互的完整攻略: 1. 安装Vue-resource 在使用Vue-resource前,首先要将其安装到Vue项目中,可以通过在命令行中执行以下命令进行安装: npm install vue-resource –save 2. 引入V…

    Vue 2023年5月28日
    00
  • vue中如何进行异步请求

    当在Vue.js应用程序中进行异步请求时,Vue.js使我们能够使用它在“vue-resource”和“axios”两个包中提供的两种不同方式。这两种方式都可以很容易地在Vue.js中创建和使用XHR请求。现在,我们来看一下如何使用这两种方式进行异步请求。 使用vue-resource进行异步请求 步骤一:安装vue-resource 在Vue.js项目中使…

    Vue 2023年5月29日
    00
  • Vue中 Vue.prototype使用详解

    让我来详细讲解一下“Vue中 Vue.prototype使用详解”的完整攻略。 简介 在 Vue.js 中,Vue.prototype 可以用来添加一些全局的属性或方法,使其在每个 Vue 实例中都可用。Vue.prototype 可以添加任何类型的属性或方法,比如:常量、对象、方法等。 添加全局属性 添加全局属性可以方便我们在项目中使用。例如在项目中我们需…

    Vue 2023年5月27日
    00
  • axios对请求各种异常情况处理的封装方法

    Axios是一个流行的HTTP请求库,可用于从浏览器或Node.js中发起请求。它可以非常方便地对请求异常情况进行处理。 以下是对Axios进行请求异常处理的封装方法的攻略: 设置默认配置 可以设置axios的默认配置,包括baseURL、timeout等。这样可以封装通用配置,减少代码重复。 import axios from ‘axios’; const…

    Vue 2023年5月28日
    00
  • 如何使用 vue-cli 创建模板项目

    当您开始使用Vue.js开发项目时,使用vue-cli来创建模板项目将是一种非常有效的方式。下面将详细讲解如何使用vue-cli来创建基本的Vue.js项目模板。 步骤一:安装vue-cli 首先需要确保您的系统中已经安装了Node.js和npm。打开终端并执行以下命令安装vue-cli: npm install -g vue-cli 步骤二:创建一个新项目…

    Vue 2023年5月27日
    00
  • vue+swiper实现时间轴效果

    接下来我会详细讲解“Vue+Swiper实现时间轴效果”的完整攻略,步骤如下: 搭建项目环境首先需要安装Vue和Swiper,可以使用Vue CLI创建一个空项目模板,然后通过npm安装Swiper和其他需要的依赖库。 编写时间轴结构使用Vue的template语法编写HTML结构,时间轴主要由时间和内容组成。将时间和内容放置在同一个div下,使用v-for…

    Vue 2023年5月29日
    00
  • Vue.js按键修饰符及v-model修饰符示例详解

    Vue.js按键修饰符及v-model修饰符示例详解 Vue.js按键修饰符 Vue.js提供了按键修饰符,可以轻松地绑定按键相关事件。对于选择文本框或文本域等表单元素非常有用。按键修饰符是通过添加特殊的后缀来对v-on监听的事件进行修饰的。示例代码如下: <template> <div> <input type="t…

    Vue 2023年5月27日
    00
  • vue中自定义指令directive的详细指南

    当我们需要在Vue的界面中实现自定义的行为时,可以使用指令(directive)去完成。指令是以v-开头的特殊HTML属性,它可以用于改变DOM元素的行为或者样式。 通过自定义指令,我们可以方便地实现各种控制DOM元素行为、触发事件和更新UI的需求。下面来详细讲解Vue中自定义指令的详细指南,包括指令的全局注册和局部注册、生命周期函数等。 全局注册指令 在V…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部