vue Ant Design 树形控件拖动限制

<template>
  <a-tree
    class="draggable-tree"
    draggable
    @drop="onDrop"
    @select="handleSelected"
    @expand="onExpand"
    :expandedKeys="expandedKeys"
    :treeData="gData"
  />
</template>

<script>
const x = 3;
const y = 2;
const z = 1;
const gData = [];

// 做一个假数据
const generateData = (_level, _preKey, _tns) => {
  const preKey = _preKey || "0";
  const tns = _tns || gData;

  const children = [];
  for (let i = 0; i < x; i++) {
    const key = `${preKey}-${i}`;
    tns.push({ title: key, key });
    if (i < y) {
      children.push(key);
    }
  }
  if (_level < 0) {
    return tns;
  }
  const level = _level - 1;
  children.forEach((key, index) => {
    tns[index].children = [];
    return generateData(level, key, tns[index].children);
  });
};
generateData(z);
export default {
  data() {
    return {
      gData,
      expandedKeys: [],
      datas: [] // 暂存的自己及父级的id 层级数组 例如:[爷爷级Id, 父级Id, 自己Id]
    };
  },
  methods: {
    // 递归 获得自己的层级id数组
    getItemAndParentsIdArr(arr, key) {
      for (let i = 0; i < arr.length; i++) {
        if (arr[i].key === key) {
          this.datas.push(arr[i]);
          return true;
        } else {
          if (
            arr[i].children &&
            this.getItemAndParentsIdArr(arr[i].children, key)
          ) {
            this.datas.push(arr[i]);
            return true;
          }
        }
      }
    },
    // 获得自己的父级id
    getFirstParentId(strings, key) {
      let stringsArr = strings.split("/");
      let index = stringsArr.indexOf(key.toString());
      let parenId;
      if (index !== 0) {
        parenId = stringsArr[index - 1];
      } else {
        parenId = stringsArr[index];
      }
      return parenId;
    },
    // 点击文字触发
    handleSelected(keys, info) {
      console.log("点击文字:", info.node.eventKey);
      let itemKey = info.node.eventKey;
      if (this.expandedKeys.length > 0) {
        if (this.expandedKeys.includes(itemKey)) {
          this.expandedKeys.splice(this.expandedKeys.indexOf(itemKey), 1);
        } else {
          this.expandedKeys = [...this.expandedKeys, itemKey];
        }
      } else {
        this.expandedKeys = [itemKey];
      }
    },
    // 点击图标触发
    onExpand(info) {
      console.log("点击图标:", info);
      this.expandedKeys = info;
    },
    // 拖动完成触发
    onDrop(info) {
      console.log("拖动完成:", info);
      const dropKey = info.node.eventKey; // 目标节点的id
      const dragKey = info.dragNode.eventKey; // 拖拽节点的id
      const dropPos = info.node.pos.split("-");
      const dropPosition =
        info.dropPosition - Number(dropPos[dropPos.length - 1]);
      const loop = (data, key, callback) => {
        data.forEach((item, index, arr) => {
          if (item.key === key) {
            return callback(item, index, arr);
          }
          if (item.children) {
            return loop(item.children, key, callback);
          }
        });
      };
      const data = [...this.gData];

      // Find dragObject
      let dragObj;

      // 如果拖动到内部
      if (!info.dropToGap) {
      } else if (
        (info.node.children || []).length > 0 && // Has children
        info.node.expanded && // Is expanded
        dropPosition === 1 // On the bottom gap
      ) {
      } else {
        // 获得拖拽节点的层级id数组 this.datas
        this.getItemAndParentsIdArr(data, dragKey);
        let dragKeyString = this.datas
          .reverse()
          .map((v, i) => {
            return v.key;
          })
          .join("/");

        // 拖拽节点父级id
        let dragKeyParentId = this.getFirstParentId(dragKeyString, dragKey);
        /**
         * --------------------------------分割线---------------------------------------
         */
        // 获得目标节点的层级id数组 this.datas
        this.getItemAndParentsIdArr(data, dropKey);
        let dropKeyString = this.datas
          .reverse()
          .map((v, i) => {
            return v.key;
          })
          .join("/");

        // 目标节点父级id
        let dropKeyParentId = this.getFirstParentId(dropKeyString, dropKey);
        /**
         * --------------------------------分割线---------------------------------------
         */
        // 只允许在同父级id下进行拖动
        if (dragKeyParentId === dropKeyParentId) {
          loop(data, dragKey, (item, index, arr) => {
            arr.splice(index, 1);
            dragObj = item;
          });
          let ar;
          let i;
          loop(data, dropKey, (item, index, arr) => {
            ar = arr;
            i = index;
          });
          if (dropPosition === -1) {
            ar.splice(i, 0, dragObj);
          } else {
            ar.splice(i + 1, 0, dragObj);
          }
          this.gData = data;
        }
      }
    }
  }
};
</script>

原文地址:https://www.cnblogs.com/yzyh/p/11995933.html

时间: 2024-11-13 16:02:39

vue Ant Design 树形控件拖动限制的相关文章

vue+element tree(树形控件)组件(2)

今天记录组件的代码和一个调用它的父组件的代码,接口接收数据直接传element直接能用的,也就是经过上一章函数处理过的数据以下是代码 父组件 <template> <commonfiltertree :placeholder="placeholder" :data="data" :showCheckbox="showCheckbox" @check='getcheckdata' :title="title"

win32 sdk树形控件的项拖拽实现

本课中,我们将学习如何使用树型视图控件.另外还要学习如何在树型视图中完成拖-拉动作,以及如何使用图象列表. 理论: 树型视图是一种特别的窗口,我们可以使用它一目了然地表示某种层次关系.譬如象在资源管理器中左边窗口中的就是树型视图.您可以调用CreateWindowEx来创建树型视图,传递一个类名""SysTreeView32"",或者您也可以把它放到一个对话框中去.不要忘了在您的代码中加入InitCommonControls函数. 树型视图有几种特有的风格.下面是几

树形控件CTreeCtrl的使用

树形控件在界面编程中应用十分普遍,如在资源管理器中和树形结构显示书的文件夹等,我们一步步研究树形控件的使用. 在对话框界面上首先拖动创建一个树,一般我们改变三个属性: Has Buttons显示带有"+"或"-"的小方框,表示某项是否能被展开或已展开,默觉得选中,我们改为选中. Has Lines在父项与子项之间连线以清楚地显示结构,默觉得选中,改为选中. Lines at root:在根部划线,默觉得选中,改为选中. 其余依据须要,能够改动,如Always sho

js树形控件—zTree使用总结(转载)

0 zTree简介 树形控件的使用是应用开发过程中必不可少的.zTree 是一个依靠 jQuery 实现的多功能 “树插件”.优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. 0.0 zTree的特点 最新版的zTree将核心代码按照功能进行了分割,不需要的代码可以不用加载,如普通使用只需要加载核心的jquery.ztree.core-3.5.js,需要使用勾选功能加载jquery.ztree.excheck-3.5.min.js,需要使用编辑功能加载jquery.ztree.e

基于Vuex的树形控件

用vue也有一小段时间了,最近刚好写到一个树形控件,脑补了下怎么设计数据结构,结果vuex的双向绑定让我瞬间痴汉了 代码在这里http://jsfiddle.net/osyo/2cm2bLdf/ 思路也挺简单的,就是把当前元素所在的对象作为参数传入方法中直接修改 emmm,这里要注意一点,如下 state: { all: { name: '0', list: [ { name: '0-0', content: 'some text' } ] }, formData: { group: { nam

Web应用程序开发,基于Ajax技术的JavaScript树形控件

感谢http://www.cnblogs.com/dgrew/p/3181769.html#undefined 在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用,它用来在Html页面上展现具有层次结构的数据项. 目前市场上常见的JavaScript框架及组件库中均包含自己的树形控件,例如jQuery.Dojo.YUI.Ext JS等,还有一些独立的树形控件,例如dhtmlxTree等,这些树形控件完美的解决了层次数据的展示问题. 展示离不开数据,树形控件主要

共有21款 jQuery 树形控件开源软件,第1页

JQuery Tree 插件 zTree zTree 是利用 JQuery 的核心代码,实现一套能完成大部分常用功能的 Tree 插件 兼容 IE.FireFox.Chrome 等浏览器 在一个页面内可同时生成多个 Tree 实例 支持 JSON 数据 支持一次性静态生成 和 Ajax 异步加载 两种方式 支持多种事件响应及反馈 支持 Tree...更多zTree信息 最近更新: [每日一博]Ztree+PHP 无限极节点递归查找节点 发布于 1年前 jQuery的Tree控件 jstree j

zTree 树形控件 ajax动态加载数据

很久没搞过树形控件了 , 再次接触看官网文档有点没懂,于是在网上找了个代码copy上,但数据是写死的,就想这在用ajax异步取出数据替换,下面是js代码 <SCRIPT type="text/javascript" > //定义全局ztree数据 var zNodes; /* 初始化ztree数据 */ function initZtree(){ $.ajax({ type: "GET", url: "<%=request.getCont

简陋的树形控件

<!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery.min.js"></script> <script> function rootClicked(v) { var newItem=document.createElement("div"); $(newItem).addClass("item