vue2-org-tree 树型结构的使用

news2024/12/29 9:49:31

vue2-org-tree 用于创建和显示组织结构树状图,帮助开发者轻松地可视化组织结构,例如公司的层级、部门之间的关系、团队成员等。其主要功能有:自定义节点、可折叠节点、支持拖放、搜索、导航等功能。
这里我们主要使用 vue2-org-tree 进行多次数、多种类对商品信息定价,以可视化的结构图展示,使其更易于理解和浏览。

1. 安装依赖

# use npm
npm i vue2-org-tree

# use yarn
yarn add vue2-org-tree

2. 引入平台

import Vue from 'vue'
import Vue2OrgTree from 'vue2-org-tree'

Vue.use(Vue2OrgTree)

3. 实现效果图

在这里插入图片描述

3. 代码实现

<vue2-org-tree
  :data="data"
  :horizontal="true"
  :collapsable="false"
  :label-class-name="labelClassName"
  :render-content="renderContent"
/>
3.1 样式配置
<style lang="less">
.org-tree-node,
.org-tree-node-children {
  position: relative;
  margin: 0;
  padding: 0;
  list-style-type: none;

  &:before, &:after {
    transition: all .35s;
  }
}
.org-tree-node-label {
  position: relative;
  display: inline-block;

  .org-tree-node-label-inner {
    padding: 10px 15px;
    text-align: center;
    border-radius: 3px;
    box-shadow: 0 1px 5px rgba(0, 0, 0, .15);
  }
}
.org-tree-node-btn {
  position: absolute;
  top: 100%;
  left: 50%;
  width: 20px;
  height: 20px;
  z-index: 10;
  margin-left: -11px;
  margin-top: 9px;
  background-color: #fff;
  border: 1px dashed @colors;
  border-radius: 50%;
  box-shadow: 0 0 2px rgba(0, 0, 0, .15);
  cursor: pointer;
  transition: all .35s ease;

  &:hover {
    background-color: #e7e8e9;
    transform: scale(1.15);
  }

  &:before, &:after {
    content: '';
    position: absolute;
  }

  &:before {
    top: 50%;
    left: 4px;
    right: 4px;
    height: 0;
    border-top: 1px dashed @colors;
  }

  &:after {
    top: 4px;
    left: 50%;
    bottom: 4px;
    width: 0;
    // border-left: 1px dashed @colors;
  }

  &.expanded:after {
    border: none;
  }
}
.org-tree-node {
  padding-top: 20px;
  display: table-cell;
  vertical-align: top;

  &.is-leaf, &.collapsed {
    padding-left: 10px;
    padding-right: 10px;
  }

  &:before, &:after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 50%;
    height: 19px;
  }

  &:after {
    left: 50%;
    border-left: 1px dashed @colors;
  }

  &:not(:first-child):before,
  &:not(:last-child):after {
    border-top: 1px dashed @colors;
  }

}
.collapsable .org-tree-node.collapsed {
  padding-bottom: 30px;

  .org-tree-node-label:after {
    content: '';
    position: absolute;
    top: 100%;
    left: 0;
    width: 50%;
    height: 20px;
    border-right: 1px dashed @colors;
  }
}
.org-tree > .org-tree-node {
  padding-top: 0;

  &:after {
    border-left: 0;
  }
}
.org-tree-node-children {
  padding-top: 20px;
  display: table;

  &:before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    width: 50%;
    height: 20px;
    border-right: 1px dashed @colors;
    border-left: none;
  }

  &:after {
    content: '';
    display: table;
    clear: both;
  }
}

.horizontal {
  .org-tree-node {
    display: inline-flex;
    justify-content: center;
    align-items: center;
    width: 100%;
    // display: table-cell;
    float: none;
    padding-top: 0;
    padding-left: 20px;

    &.is-leaf, &.collapsed {
      padding-top: 10px;
      padding-bottom: 10px;
    }

    &:before, &:after {
      width: 19px;
      height: 50%;
    }

    &:after {
      top: 50%;
      left: 0;
      border-left: 0;
    }

    &:only-child:before {
      top: 1px;
      border-bottom: 1px dashed @colors;
    }

    &:not(:first-child):before,
    &:not(:last-child):after {
      border-top: 0;
      border-left: 1px dashed @colors;
    }

    &:not(:only-child):after {
      border-top: 1px dashed @colors;
    }

    .org-tree-node-inner {
      display: table;
    }

  }

  .org-tree-node-label {
    display: table-cell;
    vertical-align: middle;
  }

  &.collapsable .org-tree-node.collapsed {
    padding-right: 30px;

    .org-tree-node-label:after {
      top: 0;
      left: 100%;
      width: 20px;
      height: 50%;
      border-right: 0;
      border-bottom: 1px dashed @colors;
    }
  }

  .org-tree-node-btn {
    top: 50%;
    left: 100%;
    margin-top: -11px;
    margin-left: 9px;
  }

  & > .org-tree-node:only-child:before {
    border-bottom: 0;
  }

  .org-tree-node-children {
    display: table-cell;
    padding-top: 0;
    padding-left: 20px;

    &:before {
      top: 50%;
      left: 0;
      width: 20px;
      height: 0;
      border-left: 0;
      border-top: 1px dashed @colors;
    }

    &:after {
      display: none;
    }

    & > .org-tree-node {
      display: block;
    }
  }
}
</style>
3.2 定义 label 样式

使用 labelClassName API 给 label 上的 class,从而实现定义 label 样式。

const colorObj = {
  'DEPOSIT': 'bg-blue',
  'ESTIMATE': 'bg-green',
  'PAYMENTS': 'bg-orange',
}
// 定义 label 样式
labelClassName (item) {
  if (item.pricingType) {
    return colorObj[item.pricingType]
  }
},

我们可以看到常量 colorObj,其对象中的 key 值是定价类型,value 值是所对应的 class 名称。

<style lang="less">
.bg-green {
  color: #fff;
  background-color: #87d068;
}
.bg-blue {
  color: #fff;
  background-color: #2db7f5;
}
.bg-orange {
  color: #fff;
  background-color: #FF913A;
}
</style>
3.3 渲染节点

使用 renderContent API 来渲染子节点。

renderContent (h, item) {
  return (
    <div>
      <span class="item_name">
        {this.getTitle(item)}
      </span>
      {!item.name && !item.skuName && !item.pricingType && ['add'].includes(this.mode) && <a class="m-l-10" onClick={() => this.$emit('open', item)}>定价</a>}
    </div >
  )
},

去除商品和已定价的数据,其余添加定价按钮进行定价操作。由于 data 数据是树型结构,不同层级的渲染逻辑不同,因此我们将渲染逻辑抽离到 getTitle 方法中。代码如下:

getTitle (item) {
  const max = this.getPricingQtyMax(item)
  if (item.name) { // 根节点
    return item.name
  } else if (item.skuName) { // 商品信息
    return `${item.skuName} (${item.planMainQty}吨)`
  } else if (item.pricingType) { // 已定价
    return <span>
      {pricingType._find(item.pricingType).name}: {item.pricingQty}{item.price}{(max > 0) && ['add'].includes(this.mode) && <a class="c-red m-l-10" onClick={() => this.$emit('cancel', { ...item, pricingQtyMax: max, pricingQty: max })}>取消定价</a>}
    </span>
  } else { // 未定价
    return `${item.pricingQty} 吨 未定价`
  }
},

对于取消定价按钮显示逻辑由 getPricingQtyMax 方法处理的,具体代码如下:

getPricingQtyMax () {
  return function (item) {
    /* 货款:未申请支付 | 定金/暂估款:未定价部分 */
    if (['PAYMENTS'].includes(item.pricingType)) {
      return NP.minus(item.pricingQty, item.applyQty || 0)
    } else if (['DEPOSIT', 'ESTIMATE'].includes(item.pricingType)) {
      return NP.minus(item.pricingQty, handleTableTotal('pricingQty', item.children.filter(item => item.pricingType)))
    }
  }
},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果平板可以用别的电容笔吗?电容笔和Apple pencil区别

和苹果原装的Pencil相比&#xff0c;这种平替的电容笔并没具备重力压感&#xff0c;只有一种倾斜的压感功能。如果你不经常用来作画&#xff0c;一支普通的电容笔就足够了。不管是用来记笔记&#xff0c;还是用来解决一些数学问题&#xff0c;都能用得上。再说了&#xff0c;即…

ui设计师简历自我评价的范文(合集)

ui设计师简历自我评价的范文篇一 本人毕业于艺术设计专业&#xff0c;具有较高的艺术素养&#xff0c;平时注重设计理论知识的积累&#xff0c;并将理论应用到作品中。了解当下设计的流行趋势&#xff0c;设计注重细节、重视用户体验&#xff0c;对色彩搭配有着浓厚的兴趣&…

Python学习之逻辑中的循环有哪些?

1. for循环 for 循环用于迭代 (遍历)一个序列&#xff0c;例如列表、元组、字符串或字典中的元素。 通常使用 for 循环来遍历可迭代对象中的元素&#xff0c;并对每个元素执行相同的操作。 示例: for item in iterable: # 执行操作2.while循环 -while循环用于在满足某个条件…

新能源车企们在“金九银十”的热潮里改了“策略”?

9月&#xff0c;各大新能源车企销量拉锯战落下帷幕&#xff0c;比亚迪稳坐冠军之位&#xff0c;9月累计销量达286903辆&#xff0c;环比增长18.8%&#xff1b;特斯拉仍旧位列第二&#xff0c;9月销量74073辆&#xff0c;环比增长14.5%&#xff1b;吉利汽车“超车”广汽埃安霸榜…

idea热加载,JRebel 插件是目前最好用的热加载插件,它支持 IDEA Ultimate 旗舰版、Community 社区版

1.如何安装 ① 点击 https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions 地址&#xff0c;下载 2022.4.1 版本。如下图所示&#xff1a; ② 打开 [Preference -> Plugins] 菜单&#xff0c;点击「Install Plugin from Disk…」按钮&#xff0c;选择刚下…

哈希(开放寻址法)代码模板

//开放寻址法 //数组长度一般要开到题目数据范围的2~3倍 #include<iostream> #include<cstring> using namespace std; //null代表无穷大 //最大和最小 //0x3f3f3f3f 1061109567&#xff0c;0xc0c0c0c0 -1061109568 const int N 2e5 3, null 0x3f3f3f3f;//取质…

需要影视解说配音的看过来,用它就对了

近年来&#xff0c;随着影视、动画等领域的快速发展&#xff0c;声音设计和配音成为了影片制作中不可或缺的一环。然而&#xff0c;并非每个人都拥有天赋般的配音技巧。面对这一困境&#xff0c;幸运的是&#xff0c;现在市面上有很多简单免费好用的配音软件&#xff0c;今天就…

gcc编译器和gdb调试工具

gcc编译器 GCC&#xff08;GNU Compiler Collection&#xff09;是一套由GNU计划开发的自由软件编译器集合&#xff0c;它支持多种编程语言&#xff0c;包括C、C、Objective-C、Fortran、Ada和Go等。GCC 是一个功能强大、稳定可靠的编译器&#xff0c;被广泛应用于各种操作系统…

【KOS】安装卸载软件

环境 系统&#xff1a;银河麒麟&#xff08;KOS&#xff09;V10&#xff08;SP1&#xff09;2303 问题 银河麒麟&#xff08;KylinOS&#xff09;原是在“863计划”和国家核高基科技重大专项支持下&#xff0c;国防科技大学研发的操作系统&#xff0c; 后由国防科技大学将品牌…

IDM注册方式

新建一个bat文件&#xff0c;取名IAS_0.8.cmd&#xff0c; 在github上获取脚本内容&#xff0c;地址&#xff1a; https://raw.githubusercontent.com/lstprjct/IDM-Activation-Script/main/IAS_0.8.cmd 也可以直接复制以下内容到IAS_0.8.cmd文件&#xff1a; setlocal Dis…

GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术深度应用

以地下水数值模拟软件GMS操作为主要授课内容&#xff0c;在教学中强调模块化教学&#xff0c;分为前期数据收集与处理&#xff1b;三维地质结构建模&#xff1b;地下水流动模型构建&#xff1b;地下水溶质运移模型构建和反应性溶质运移构建5个模块&#xff1b;采用全流程模式将…

从0-1,使用腾讯OCR进行身份证识别

目录 1.申请腾讯OCR权限 2.代码思路 3.Postman测试​ 1.申请腾讯OCR权限 获取 secretId 和 secretKey&#xff0c;见上文从0到1&#xff0c;申请cos服务器并上传图片到cos文件服务器-CSDN博客https://blog.csdn.net/m0_55627541/article/details/133902798 2.代码思路 入参…

文字智能适配背景

文字智能适配背景 只需要在文字中加上mix-blend-mode属性即可完成 h1 {height: 30px;text-align: center;color: #fff;font-size: 3em;transition: 0.5s;mix-blend-mode: difference; }

CTF/AWD竞赛标准参考书+实战指南

随着网络安全问题日益凸显&#xff0c;国家对网络安全人才的需求持续增长&#xff0c;其中&#xff0c;网络安全竞赛在国家以及企业的人才培养和选拔中扮演着至关重要的角色。 在数字化时代&#xff0c;企业为了应对日益增长的攻击威胁&#xff0c;一般都在大量部署安全产品、…

【经验分享】如何构建openGauss开发编译提交一体化环境

前文 本文适合对openGauss源代码有好奇心的爱好者&#xff0c;那么一个友好的openGauss源代码环境应该是怎么样的。openGauss的开发环境是如何设置的&#xff1f;openGauss的编译环境是如何构建的&#xff1f;如何向openGauss提交代码&#xff0c;笔者集合官方和几位博主实践提…

SpringFramewrok (1)

1、框架的概念与理解 在现实生活中&#xff0c;框架可以比喻为我们搭建房子的框架。 在框架的基础上&#xff0c;我们可以专注于我们自己的工作&#xff0c;而不用在意这些底层工作如何实现。 框架的优点包括以下几点&#xff1a; 1. 提高开发效率&#xff1a;框架提供了许多…

【C++11】 智能指针

一、为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f; int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");return a / b; }void f() {pair<string, string>* …

Linux编译内核添加Bcache模块

由于Bcache是在linux kernel 3.10之后才加入的&#xff0c;所以要使用Bcache&#xff0c;首先必须确保内核版本至少是3.10或及以上&#xff0c;可以使用uname -a查看内核版本 [rootceph01 ~]# uname -a Linux ceph01 4.18.0-305.3.1.el8.x86_64 #1 SMP Tue Jun 1 16:14:33 UTC…

打桩机液压系统比例阀放大板

打桩机液压系统主要由液压油箱、液压泵、液压马达、各种阀门、管道、油缸、活塞等组成。 打桩机液压系统以液压油为工作介质&#xff0c;利用液压油的压力能来驱动执行机构完成所需的各种动作。打桩机液压系统采用液体进行驱动&#xff0c;可以使打桩机在开启时迅速达到理想工…

el-input单独校验

el-input单独校验,效果图如下 <el-col :span"24"><el-form-item label"修订次数:" prop"sPublish"><el-input-numberv-model"addForm.sPublish":min"0":controls"false":precision"0"p…