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

yizhihongxing

当我们需要实现在前端页面中完成三级拖动排序效果的时候,可以使用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日

相关文章

  • ES6 Promise对象概念及用法实例详解

    ES6 Promise对象概念及用法实例详解 什么是Promise对象? Promise是ES6新增的一种异步编程解决方案。它将异步操作封装成一个对象,可以更直观、更优雅地表达异步操作。Promise对象的最大特点是它具备状态,分别为: Pending(进行中) Fulfilled(已成功) Rejected(已失败) 即一旦Promise对象的状态发生改变…

    Vue 2023年5月28日
    00
  • mpvue+vant app搭建微信小程序的方法步骤

    下面是“mpvue+vant app搭建微信小程序的方法步骤”的完整攻略: 一、mpvue和vant的安装 安装webpack: npm i webpack -g 使用webpack脚手架工具初始化mpvue项目:vue init mpvue/mpvue-quickstart my-project 安装vant: npm i vant -S 二、配置mpvu…

    Vue 2023年5月27日
    00
  • Node.js如何优雅的封装一个实用函数的npm包的方法

    封装一个实用函数的 npm 包通常需要经过以下步骤: 1. 创建一个 npm 包 首先需要在本地创建一个 npm 包,可以通过以下命令: npm init 跟随提示进行输入,可以创建一个基本的 package.json 文件,其中包括包的名称、版本号、描述等信息。如果已经有了 package.json 文件,可以跳过此步骤。 2. 编写函数并测试 在本地编写…

    Vue 2023年5月27日
    00
  • Vue中Vue.extend()的使用及解析

    下面我将详细介绍Vue中Vue.extend()的使用及解析的完整攻略。 1. Vue.extend()的作用 在Vue中,我们经常需要生成一个组件,并将其作为另一个组件的子组件来使用。Vue.extend()方法就是为了方便我们定义和注册组件而存在的。 它的作用是基于Vue构造函数,创建一个“子类”,即一个可以被Vue组件系统识别的组件构造函数。通过ext…

    Vue 2023年5月28日
    00
  • vant 时间选择器–开始时间和结束时间实例

    vant 时间选择器是一个基于Vue.js的组件库,其中包含了常用的时间选择器组件。下面就详细讲解vant 时间选择器的开始时间和结束时间实例的攻略。 一、引入组件 在使用 vant 时间选择器组件之前,需要先在项目中引入这个组件库。 <!– 引入样式文件 –> <link rel="stylesheet" href…

    Vue 2023年5月29日
    00
  • Vue打包后访问静态资源路径问题

    Vue是一种流行的JavaScript框架,用于构建交互式的现代Web应用程序。Vue的打包可以将应用程序的所有资源(例如HTML,JavaScript,CSS和图像)打包成几个文件,使应用程序易于部署。但是,Vue打包后,用户在访问应用程序时可能会遇到静态资源路径问题。为解决这一问题,我们可以采用以下攻略: 问题描述 Vue打包后,由于路径设置不正确,可能…

    Vue 2023年5月28日
    00
  • vue实现文字滚动效果

    一、安装vue-infinite-scroll插件 vue-infinite-scroll是一个插件库,旨在为Vue提供无限滚动功能。可以使用CDN,在head标签中添加以下内容: <script src="https://cdn.jsdelivr.net/npm/vue-infinite-scroll@2.0.2/dist/vue-infi…

    Vue 2023年5月29日
    00
  • element ui的el-input-number修改数值失效的问题及解决

    针对“element-ui的el-input-number修改数值失效的问题及解决”这个问题,我可以给出如下的完整攻略。攻略中包含了问题出现的原因、解决方法、示例说明等内容。 问题背景 在使用 element-ui 的 el-input-number 组件时,我们可能会遇到一个问题:在表单中使用该组件后,我们无法通过键盘输入数字来修改数值,只能通过上下箭头或…

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