vue+element实现树形上下拖拽,快速提升你的前端技能

2023-11-17

前言

随着前端技术的不断发展,越来越多的网站和应用需要使用树形控件来展示数据,而上下拖拽则是一个非常实用的交互方式。如果你正在寻找一种简单易用的树形控件实现上下拖拽的方法,那么本文将为你提供最佳解决方案。本文将介绍如何使用 vue 基于 element 树形控件实现上下拖拽,并且还会提供详细的代码实现和示例,帮助你快速掌握这个技术。让我们一起来探索这个令人兴奋的前端技术吧!


实现思路

树形控件拖拽又分为两种:同级拖拽排序可跨级拖拽排序。其实不论是同级还是跨级都离不开一个核心的属性:draggable 属性。通过将树形控件设置 draggable 属性即可让节点变为可拖拽。以下是本章用到的属性参数和事件方法。


属性参数和事件方法

参数 说明 默认值 回调参数
allow-drop 拖拽时判定目标节点能否被放置。type 参数:‘prev’、‘inner’ 和 ‘next’,分别表示放置在目标节点前、插入至目标节点和放置在目标节点后 - -
draggable 是否开启拖拽节点功能 false -
node-drop(事件方法) 拖拽成功完成时触发的事件 - 共四个参数,依次为:被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event
show-checkbox 节点是否可被选择 false -
default-expand-all 是否默认展开所有节点 false -
node-key 每个树节点用来作为唯一标识的属性,整棵树应该是唯一的 - -
highlight-current 是否高亮当前选中节点 false -

props

参数 说明 类型
label 指定节点标签为节点对象的某个属性值 string, function(data, node)
children 指定子树为节点对象的某个属性值 string
disabled 指定节点选择框是否禁用为节点对象的某个属性值 boolean, function(data, node)
isLeaf 指定节点是否为叶子节点,仅在指定了 lazy 属性的情况下生效 boolean, function(data, node)

同级拖拽排序

在这里插入图片描述

源码如下

<template>
  <div>
    <!-- 树形组件 -->
    <el-tree draggable :allow-drop="dropAllow" @node-drop="dragSuccess" ref="tree" :data="dataList" :props="defaultProps" show-checkbox
      default-expand-all node-key="id" highlight-current></el-tree>
  </div>
</template>
 
<script>
export default {
  data() {
    return {
      // 模拟数据
      dataList: [
        {
          id: 1,
          label: "一级菜单",
          children: [
            {
              id: 5,
              label: "1-1",
            },
          ],
        },
        {
          id: 2,
          label: "二级菜单",
          children: [
            {
              id: 6,
              label: "2-1",
            },
            {
              id: 7,
              label: "2-2",
            },
          ],
        },
        {
          id: 3,
          label: "三级菜单",
          children: [
            {
              id: 8,
              label: "3-1",
            },
            {
              id: 9,
              label: "3-2",
            },
          ],
        },
        {
          id: 4,
          label: "四级菜单",
        },
      ],
      defaultProps: {
        label: "label", //指定节点标签为节点对象的某个属性值
        children: "children", //指定子树为节点对象的某个属性值
      },
    };
  },
  methods: {
    // 拖拽时触发
    dropAllow(draggingNode, dropNode, type) {
      if (draggingNode.level === dropNode.level) {
        if (draggingNode.parent.id === dropNode.parent.id) {
          // 向上拖拽 || 向下拖拽
          return type === "prev" || type === "next";
        }
      } else {
        return false;
      }
    },
    // 拖拽成功时触发
    dragSuccess(draggingNode, dropNode, type, event) {
      this.$message({
        message: "成功",
        type: "success",
      });
      console.log(draggingNode, dropNode, type, event);
      // 请求接口传参即可
    },
  },
};
</script>

可跨级拖拽排序

可跨级拖拽说白了就是将限制放开,我们只需要在拖拽时判定目标节点能否被放置的方法中稍加修改即可,代码如下。
在这里插入图片描述

// 拖拽时触发
dropAllow(draggingNode, dropNode, type) {
  if (draggingNode.data.id === dropNode.data.id) {
    return type === "prev" || type === "next";
  } else {
    return type === "prev" || type === "next" || type === "inner";
  }
},

相关推荐

用vue和sortableJS轻松实现表格拖拽排序
教你一招,element表格行轻松上下移动

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+element实现树形上下拖拽,快速提升你的前端技能 的相关文章

  • 检查 div ID 是否存在 (PHP)

    PHP 可以检查元素是否存在吗 我已经知道 javascript 方法 但我只是想尽可能避免它 如果你有 HTML 服务器端的字符串 你可以使用DOM文档 http php net manual en class domdocument p
  • 【连续和自适应资源需求估计】通过不断应用在线优化、选择和估计,SARDE能够有效地适应在线跟踪,并使用得到的集成技术减少模型误差(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据 文章
  • 引用 JSON (Javascript) 对象的元素

    如何引用 JSON Javascript 对象的元素 示例 alert homes Agents 1 name
  • Web 安全漏洞之 OS 命令注入

    什么是 OS 命令注入 上周我们分享了一篇 Web 安全漏洞之 SQL 注入 其原理简单来说就是因为 SQL 是一种结构化字符串语言 攻击者利用可以随意构造语句的漏洞构造了开发者意料之外的语句 而今天要讲的 OS 命令注入其实原理和 SQL
  • WEB前端常见受攻击方式及解决办法总结

    一个网址建立后 如果不注意安全问题 就很容易被人攻击 下面讨论一下集中漏洞情况和放置攻击的方法 一 SQL注入 所谓的SQL注入 就是通过把SQL命令插入到web表单提交或输入域名或页面请求的查询字符串 最终达到欺骗服务器执行恶意的SQL命
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • 【gee】下载modis土地利用类型

    var china ee FeatureCollection projects assets china boundary var lc dataset ee ImageCollection MODIS 061 MCD12Q1 filter
  • 【ES6】解构语句中的冒号(:)

    在解构赋值语法中 冒号 的作用是为提取的字段指定一个新的变量名 让我们以示例 const billCode code version route query 来说明 billCode code version 表示从 route query
  • 低代码配置-属性配置面板设计

    模块设计 tab项切换 组件基础属性 组件数据属性 组件事件属性 表单属性 模块输出函数设计 tab切换函数 列表表单属性 数据来源 调用接口时一次赋予 无需使用selectItem 如需使用 归入基础属性 列表标题 是否展示筛选区域
  • vue实现 marquee(走马灯)

    样式 代码 div class marquee prompt div class list prompt span class prompt item span div div data return listPrompt xxx xxxx
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 每日变更的最佳实践

    在优维公司内部 我们采用发布单的方式进行每天的应用变更管理 这里给各位介绍优维的最佳实践 变更是需要多角色合作的 而且他是整体研发流程的一部分 在优维内部 我们坚持每日变更 打通开发环节到最终发布上线的全过程 在保证质量的前提下 尽可能提升
  • Vue中下载不同文件常用的方式

    1 使用window open方法下载文件
  • 获取年与年之间的所有年份

    function getYearsBetween startYear endYear var years 存放结果的数组 for var year startYear year lt endYear year years push year
  • 如何在 Python 脚本中使用 Google OAuth2

    在使用 Python 脚本将视频上传到 YouTube 频道时 若希望将视频上传到第二个频道 需要解决 OAuth2 授权的问题 解决方案 创建新的 Google Cloud 项目 from google oauth2 import ser
  • width() 和 height() 适用于没有 jQuery 的现代浏览器

    我正在尝试为弹性 div 实现一个简单的折叠 展开效果 即当元素的实际尺寸未通过 CSS 设置时 因此无法简单确定 所以我需要 jQuery 的 width 和 height 的等效项来表示任意元素 这些方法应该返回可分配给 style w
  • 当元素有多个类时,jquery 按特定类查找元素

    所以我正在做一些后端团队在构建时没有经过深思熟虑的事情 这给我留下了一个充满 div 的文档 我正在做的是从我需要单击的元素回滚 获取父容器 然后在父容器中找到一个元素class alert box warn class alert box
  • JQuery 选择框和循环帮助

    谢谢阅读 我对 jQuery 有点陌生 我正在尝试制作一个可以包含在我所有网站中的脚本来解决一个总是让我发疯的问题 问题 带有长选项的选择框在 Internet Explorer 中会被截断 例如 这些选择框 http discoverfi
  • 两个列表中的公共元素

    我有两个ArrayList每个对象都有三个整数 我想找到一种方法来返回两个列表的共同元素 有人知道我该如何实现这一目标吗 Use Collection retainAll https docs oracle com en java java
  • 对其他元素值的 XSD 限制

    是否可以在 XSD 文档中对其他元素值进行限制 例如 我有国家和州元素 如果国家 地区等于美国 那么我需要限制指定枚举的状态元素值 否则状态可以只是固定长度的字符串 当前 XSD 的示例 始终将状态限制为枚举

随机推荐

  • [Unity踩坑记录] 从屏幕坐标系转换到世界坐标系

    问题描述 调试需要 想从摄像机发出一条射向鼠标指向位置的射线 于是写了如下代码 void Update Vector3 mouseScreenPos Input mousePosition Vector3 mouseWorldPos Cam
  • JS力扣刷题26. 删除有序数组中的重复项

    var removeDuplicates function nums len表示nums修改后得长度 let len nums length for let i 0 i lt len 1 i if nums i nums i 1 for l
  • Android开发精典案例60个

    实例简介 Android开发精典案例60个 文件 url80 ctfile com f 25127180 740794786 4b13cf p 551685 访问密码 551685 核心代码 2 1 Activity生命周期 3 1 But
  • 区块链结合物联网可研究方向

    文献来源 H Dai Z Zheng and Y Zhang Blockchain for Internet of Things A Survey in IEEE Internet of Things Journal vol 6 no 5
  • js怎么实现数组里的数据相加_JS数组求和的常用方法总结【5种方法】

    本文实例总结了JS数组求和的常用方法 分享给大家供大家参考 具体如下 题目描述 计算给定数组 arr 中所有元素的总和 输入描述 数组中的元素均为 Number 类型 输入例子 sum 1 2 3 4 输出例子 10 方法1 不考虑算法复杂
  • Powershell如何查询目录所有文件和文件夹的名称

    Powershell如何查询目录所有文件和文件夹的名称 获取文件名称 修改时间等 Get ChildItem Name设置可仅获取文件名称 Get ChildItem Name 输入 Get ChildItem 如图 输入 Get Chil
  • hdu 1007 Quoit Design

    Quoit Design Time Limit 10000 5000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 10498 Accept
  • MFC 菜单操作

    1 菜单是窗口框架的组成部分 如果我们要导入自定义的菜单 可以通过以下语句实现 在CMainFrame OnCreate的函数中添加如下代码段 SetMenu NULL 将原本的菜单项去除 CMenu menu 新定义一个菜单对象 menu
  • 计算机网络 --- DNS协议

    计算机网络 DNS协议 什么是DNS DNS工作原理 Overview Three Classes of DNS servers 1 Root servers 2 top level domain DNS servers 3 authori
  • Java学习(java基础)-韩顺平老师

    一 简单介绍 1 jdk jre 2 Java代码规范 a 类 方法的注释 要以javadoc的方式来写 author 楠小弟 version 1 0 public class Hello public static void main S
  • JDBC中典型的五种查询方式

    第一种查询方式 返回一个ArrayList集合 集合里面的数据类型只能为Empinfo类类型 public ArrayList
  • YOLOV5代码general.py文件解读

    YOLOV5源码的下载 git clone https github com ultralytics yolov5 git YOLOV5代码general py文件解读 import glob import logging import o
  • 深入浅出BP神经网络算法的原理

    相信每位刚接触神经网络的时候都会先碰到BP算法的问题 如何形象快速地理解BP神经网络就是我们学习的高级乐趣了 画外音 乐趣 你在跟我谈乐趣 本篇博文就是要简单粗暴地帮助各位童鞋快速入门采取BP算法的神经网络 BP神经网络是怎样的一种定义 看
  • vue项目实战(一)

    第一步 找到你想要存放项目的文件夹 输入cmd 就会弹出小黑窗 然后输入vue create 项目名 创建项目 前提安装好node js和搭建 vue 环境 打开终端 创建项目 按上下键进行选择 做一些配置 这次选择自定义 也就是最后一个
  • Java_得到GET和POST请求URL和参数列表

    一 获取URL getRequestURL 二 获取参数列表 1 getQueryString 只适用于GET 比如客户端发送http localhost testServlet a b c d e f 通过request getQuery
  • 计算机基础内容——网络基础

    网络基础 设备是如何上网的 网卡 有线 无线 内置天线 网线接口RJ45 usb转RJ45 交换机 路由器 外置天线 天线棒 光猫 宽带运营商 不同的宽带运营商之间是互通的 路由器发出的wifi信号 2 4GHz wifi 5 0GHz w
  • Qt的Tcp服务器多线程编程-附带代码展示

    Qt的Tcp服务器多线程编程 附带代码展示 该程序主要实现tcp服务器如何使用多线程的方式来连接多个客户端 此文章没有实现客户端的多线程编程 创建子线程时需要注意的点 1 子线程与主线程之间交互数据时 应采用信号槽的方式 2 子线程中实例化
  • Java基础:多线程join()方法

    join 让当前线程优先执行 JoinThread java public class JoinThread implements Runnable Override public void run for int i 0 i lt 100
  • iis中使用nginx实现反向代理负载均衡

    user nobody worker processes 1 error log logs error log error log logs error log notice error log logs error log info pi
  • vue+element实现树形上下拖拽,快速提升你的前端技能

    前言 随着前端技术的不断发展 越来越多的网站和应用需要使用树形控件来展示数据 而上下拖拽则是一个非常实用的交互方式 如果你正在寻找一种简单易用的树形控件实现上下拖拽的方法 那么本文将为你提供最佳解决方案 本文将介绍如何使用 vue 基于 e