当前位置: 首页 > news >正文

Vue+ElementUi 基于Tree实现动态节点添加,节点自定义为输入框列

Vue+ElementUi 基于Tree实现动态节点手动添加,节点自定义为输入框列

代码

<el-steps :active="active" finish-status="success" align-center><el-step title="test1"/><el-step title="test2"/><el-step title="test3"/>
</el-steps>
<el-row style="margin-top:15px"><el-row v-if="active == 0">.....</el-row><el-row v-if="active == 1"><el-treev-if="reloadStatus"ref="tree":data="chargebackData":render-content="renderContent":render-after-expand=true:expand-on-click-node=false:default-expand-all=trueicon-class="el-icon-circle-plus-outline"class="tree-line"node-key="id"></el-tree></el-row><el-row v-if="active == 2">....</el-row>
</el-row>
<el-row style="text-align: right;"><el-button style="margin-top: 12px;" @click="next">{{this.active == 2 ? '确认' : '下一步'}}</el-button>
</el-row>
</el-row>

数据以及树节点自定义内容

<script>export default {data(){return {//步骤条 当前选择的下标(从0开始)active: 0,//步骤条第一步所需的数据stepsOneData: {},//步骤条第二步所需的数据stepsTwoData: [],//tree数据 重新加载使用reloadStatus: true,//tree数据chargebackData:[{createItemCount:0,//只针对一级节点chargebackItemId:undefined,amount: undefined,children:[]}],//步骤条的下一步是否可以通过isNext: true,}},methods:{/*步骤条点击 下一步 按钮 触发*/next() {this.dialogContentLoading = trueif(this.active == 0){//这里可以查询后端结果返回丰富this.stepsTwoData = [...]}else if(this.active == 1){//2.清除无效数据let handleData = JSON.parse(JSON.stringify(this.chargebackData))//2.1请求一级节点的数据let arr = handleData.filter(item => item.itemName != undefined || item.itemName != null || item.itemName == '')//2.2处理二级节点的数据for(let i=0; i< arr.length ; i++){arr[i].children = arr[i].children.filter(item => item.key != undefined || item.key != null || item.key == '')}this.showChargebackData = arr}else if(this.active = 2){//确认按钮触发let list = JSON.parse(JSON.stringify(this.showChargebackData))let arr = this.showChargebackDatalet data = []for(let i = 0; i < arr.length; i++){let obj = {}obj.orderId = this.form.idobj.userId = this.form.userIdobj.chargebackItemId = arr[i].chargebackItemIdobj.amount = arr[i].amountif(arr[i].children.length > 0){obj.detail = JSON.parse(JSON.stringify(arr[i].children))}data.push(obj)}console.log("data",data)this.active = 0this.stepsOneData = {}this.stepsTwoData = []this.chargebackData = [{createItemCount:0,//只针对一级节点chargebackItemId:undefined,amount: undefined,children:[]}]this.dialogContentLoading = falsethis.open = falsereturn}if (this.active++ > 1) this.active = 0;},/*tree 树节点处理@param node   当前节点对象@param data   当前节点数据对象*/renderContent(h, { node, data, store }){return (<el-row style="width:100%">{node.level == 1 ? (<el-row class="row-col-title"><el-col span={2} class="col-title"><span>扣款项:</span>  </el-col><el-col span={6}><el-select placeholder="请求选择扣款项" v-model={data.itemName} onChange={(val) => this.selectChangeHandle(val,node,data)} clearable>{this.stepsTwoData.map((item,index) => {return (<el-option key={index} value={item.itemName}>{item.itemName}</el-option>)})}</el-select>  </el-col><el-col span={3} class="col-title"><span>退款项总金额:</span></el-col><el-col span={6}><el-input placeholder="请输入退款项总金额" v-model={data.amount}><template slot="append">元</template>  </el-input></el-col><el-col span={5} style="margin-left:20px"><el-button type="primary" onClick={() => this.addChangeHandle(node, data, true)}><i class="el-icon-circle-plus-outline"></i></el-button><el-button type="primary" onClick={() => this.reduceChangeHandle(node, data, true)}><i class="el-icon-remove-outline"></i></el-button></el-col></el-row>) : ''}{node.level != 1 ? (<el-row gutter={20}><el-col span={10}><el-input placeholder="退款项明细" v-model={data.key}/></el-col><el-col span={10}><el-input placeholder="退款项明细金额" v-model={data.value} onInput={(value) => this.computeItem(value,node)}/></el-col><el-col span={4}><el-button type="primary" onClick={() => this.addChangeHandle(node, data, false)}><i class="el-icon-circle-plus-outline"></i></el-button><el-button type="primary" onClick={() => this.reduceChangeHandle(node, data, false)}><i class="el-icon-remove-outline"></i></el-button></el-col></el-row>) : ''}</el-row>)},/*步骤条-扣除项-扣除项下拉列表选择option时触发@param  val   当前选中的option key值@param  node  当前节点对象@param  data  当前节点数据对象*/selectChangeHandle(val,node,data){if(val){//选中时if(node.level == 1){//扣除项let target = this.stepsTwoData.filter(item => item.itemName == val)[0]//以下参数不会导致tree自动重新渲染tree组件,但数据是存在的,如果需要重新渲染,手动调用 treeRefresh()data.itemName = target.itemNamedata.chargebackItemId = target.id//添加一个子节点(一个一级节点一次添加)if(data.createItemCount == 0){let children = {key:undefined,value: undefined}data.createItemCount += 1data.children.push(children)this.treeRefresh()}}}else{//清除选择时//清空扣款项的扣款明细列表data.createItemCount = 0data.amount = undefineddata.children = []this.treeRefresh()}},/*点击添加按钮触发@param node 当前节点对象@param data 当前节点数据对象@param isOneLevel 当前节点是否为一级节点*/addChangeHandle(node, data, isOneLevel){if(isOneLevel){//一级节点的添加let obj = {createItemCount:0,//只针对一级节点chargebackItemId:undefined,amount: undefined,children:[]}this.chargebackData.push(obj)this.treeRefresh()}else{//非一级节点(二级)的添加let children = {key:undefined,value: undefined}node.parent.data.children.push(children)this.treeRefresh()}},/*点击减号按钮触发@param node 当前节点对象@param data 当前节点数据对象@param isOneLevel 当前节点是否为一级节点*/reduceChangeHandle(node, data, isOneLevel){if(isOneLevel){//一级节点if(this.chargebackData.length == 1){this.$modal.msgError("扣款项已达最低条数限制,无法删除");return}let delIndex = this.chargebackData.indexOf(data)if(delIndex > -1){this.chargebackData.splice(delIndex, 1)this.treeRefresh()}}else{//非一级(二级)节点let arr = node.parent.data.childrenif(arr.length == 1){this.$modal.msgError("当前扣款项明细已达最低条数限制,无法删除");return}let delIndex = arr.indexOf(data)if(delIndex > -1){arr.splice(delIndex, 1)this.treeRefresh()}}},//输入扣款项明细时计算金额并自动填充扣款项总金额中computeItem(value,node){let val = Number(value)if(isNaN(val)){this.isNext = falsethis.$modal.msgError("金额格式错误");return}this.isNext = true//计算价格let parentData = node.parent.datalet sonData = JSON.parse(JSON.stringify(parentData.children))let sum = 0for(let i = 0; i < sonData.length; i++){//排除值为空的情况if(sonData[i].value){sum += Number(sonData[i].value)}}parentData.amount = sum + ''},/*扣除项树节点手动刷新*/treeRefresh(){this.reloadStatus = false;this.$nextTick(() => {this.reloadStatus = true;})}}}
</script>

相关样式:

<style lang="scss">.tree-line{.el-tree-node__content {display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-box-align: center;-ms-flex-align: center;align-items: center;height: 50px;cursor: default;}.row-col-title{display: flex;}.row-col-title > .el-col {margin: auto 0;}.col-title{text-align: right;}/* 以下全是分支相关样式 start */.el-tree-node {position: relative;padding-left: 16px; /*缩进量*/}.el-tree-node__children {padding-left: 16px; /*缩进量*/}/* 竖线 */.el-tree-node::before {content: "";height: 100%;width: 1px;position: absolute;left: -3px;top: -12px;border-width: 1px;border-left: 1px solid #52627C;}/* 当前层最后一个节点的竖线高度固定 */.el-tree-node:last-child::before {height: 38px; /* 可以自己调节到合适数值 */}/* 横线 */.el-tree-node::after {content: "";width: 45px;height: 20px;position: absolute;left: -3px;top: 25px;border-width: 1px;border-top: 1px solid #52627C;}/* 去掉最顶层的虚线,放最下面样式才不会被上面的覆盖了 */& > .el-tree-node::after {border-top: none;}& > .el-tree-node::before {border-left: none;}/*  展开关闭的icon */.el-tree-node__expand-icon{font-size: 16px;/* 叶子节点(无子节点) */&.is-leaf{color: transparent;/*display: none;*/ /* 也可以去掉 */}}/* 以上全是分支相关样式 end */}</style>

参考:

vue 为element树形组件el-tree添加虚线,指示线

vue中el-tree增加节点后重新刷新

相关文章:

Vue+ElementUi 基于Tree实现动态节点添加,节点自定义为输入框列

VueElementUi 基于Tree实现动态节点手动添加&#xff0c;节点自定义为输入框列 代码 <el-steps :active"active" finish-status"success" align-center><el-step title"test1"/><el-step title"test2"/><el-st…...

Web前端-JavaScript(js数组和函数)

文章目录 1.数组1.1 数组的概念1.2 创建数组1.3 获取数组中的元素1.4 数组中新增元素1.5 遍历数组 2.函数2.1 函数的概念2.2 函数的使用函数声明调用函数函数的封装 2.3 函数的参数函数参数语法函数形参和实参数量不匹配时 2.4 函数的返回值2.4.1 案例练习 2.5 arguments的使用…...

判断数据是否为整数--函数设计与实现

#定义函数&#xff1a;is_num(s),判断输入的数据是否整数。 #(1)判断是否是数字 def is_num(s):if s.isdigit(): #isdigit()是一个字符串方法&#xff0c;用于检查字符串是否只包含数字字符。如果字符串只包含数字字符&#xff0c;则返回True&#xff1b;否则返回Falsereturn T…...

netty源码:(29)ChannelInboundHandlerAdapter

它实现的方法都有一个ChannelHandlerContext参数&#xff0c;它的方法都是直接调用ChannelHandlerContext参数对应的方法&#xff0c;该方法会调用下一个handler对应的方法。 可以继承这个类&#xff0c;重写感兴趣的方法,比如channelRead. 这个类有个子类&#xff1a;SimpleC…...

Shell脚本应用(二)

一、条件测试操作 Shell环境根据命令执行后的返回状态值〈$?&#xff09;来判断是否执行成功&#xff0c;当返回值为О时表示成功.否则〈非О值)表示失败或异常。使用专门的测试工具---test命令&#xff0c;可以对特定条件进行测试&#xff0e;并根据返回值来判断条件是否成立…...

Kafka基本原理及使用

目录 基本概念 单机版 环境准备 基本命令使用 集群版 消息模型 成员组成 1. Topic&#xff08;主题&#xff09;&#xff1a; 2. Partition&#xff08;分区&#xff09;&#xff1a; 3. Producer&#xff08;生产者&#xff09;&#xff1a; 4. Consumer&#xff08;…...

使用Python爬取GooglePlay并从复杂的自定义数据结构中实现解析

文章目录 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》&#xff0c;对分布…...

前后端分离下的鸿鹄电子招投标系统:使用Spring Boot、Mybatis、Redis和Layui实现源码与立项流程

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…...

ChatGPT 有什么新奇的使用方式?

来看看 OpenAI 内部是如何使用 ChatGPT 的。 目前&#xff08;4月29日&#xff09;距离ChatGPT发布了已经半年&#xff0c;这期间大家基本上把能想到的ChatGPT的使用方法都研究遍了——从写作、写代码&#xff0c;到翻译、英语润色&#xff0c;再到角色扮演等等。 所以&#x…...

【计算机四级(网络工程师)笔记】操作系统概论

目录 一、OS的概念 1.1OS的定义 1.2OS的特征 1.2.1并发性 1.2.2共享性 1.2.3随机性 1.3研究OS的观点 1.3.1软件的观点 1.3.2资源管理器的观点 1.3.3进程的观点 1.3.4虚拟机的观点 1.3.5服务提供者的观点 二、OS的分类 2.1批处理操作系统 2.2分时操作系统 2.3实时操作系统 2.4嵌…...

LeetCode算法练习top100:(10)贪心算法

package top100.贪心算法;import java.util.ArrayList; import java.util.List;public class TOP {//121. 买卖股票的最佳时机public int maxProfit(int[] prices) {int res 0, min prices[0];for (int i 1; i < prices.length; i) {if (prices[i] < min) {min price…...

随记-探究 OpenApi 的加密方式

open api 主要参数如下 appKey 接口Key&#xff08;app id&#xff09;appSecret 接口密钥timeStamp 时间戳 毫秒nonceStr 随机字符串signature 加密字符串 客户端 使用 appSecret 按照一定规则将 appKey timeStamp nonceStr 进行加密&#xff0c;得到密文 signature将 appK…...

stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发

stm32学习总结&#xff1a;4、Proteus8STM32CubeMXMDK仿真串口收发 文章目录 stm32学习总结&#xff1a;4、Proteus8STM32CubeMXMDK仿真串口收发一、前言二、资料收集三、STM32CubeMX配置串口1、配置开启USART12、设置usart中断优先级3、配置外设独立生成.c和.h 四、MDK串口收发…...

配置paddleocr及paddlepaddle解决报错 GLIBCXX_3.4.30 FreeTypeFont

配置 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7/StyleText/README_ch.md#style-text 环境配置 https://www.paddlepaddle.org.cn/ 根据自己的cuda版本选择paddlepaddle-gpu # 新建conda环境 # python version conda create -n paddle python3.8 # 安装p…...

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离&#xff0c;增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移&#xff0c;而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统&#xff0c;Docker为MySQL提供…...

PLC物联网,实现工厂设备数据采集

随着工业4.0时代的到来&#xff0c;物联网技术在工厂设备管理领域的应用日益普及。作为物联网技术的重要一环&#xff0c;PLC物联网为工厂设备数据采集带来了前所未有的便捷和高效。本文将围绕“PLC物联网&#xff0c;实现工厂设备数据采集”这一主题&#xff0c;探讨PLC物联网…...

npm安装依赖报错ERESOLVE unable to resolve dependency tree(我是在taro项目中)(node、npm 版本问题)

换了电脑之后新电脑安装包出错 &#x1f447;&#x1f447;&#x1f447; npm install 安装包报错 ERESOLVE unable to resolve dependency tree 百度后尝试使用 npm install --force 还是报错 参考 有人说是 node 版本和 npm 版本的问题 参考 新电脑 node版本&#xff1a;16.1…...

Maven仓库上传jar和mvn命令汇总

目录 导入远程仓库 命令结构 命令解释 项目pom 输入执行 本地仓库导入 命令格式 命令解释 Maven命令汇总 mvn 参数 mvn常用命令 web项目相关命令 导入远程仓库 命令结构 mvn deploy:deploy-file -Dfilejar包完整名称 -DgroupIdpom文件中引用的groupId名 -Dartifa…...

Jenkins 执行远程脚本的插件—SSH2 Easy

SSH2 Easy 是什么&#xff1f; SSH2 Easy 是一个 Jenkins 插件&#xff0c;它用于在 Jenkins 构建过程中通过 SSH2 协议与远程服务器进行交互。通过该插件&#xff0c;用户可以在 Jenkins 的构建过程中执行远程命令、上传或下载文件、管理远程服务器等操作。 以下是 SSH2 Eas…...

Starting the Docker Engine...一直转圈

出现的问题&#xff1a; 原因排查&#xff1a; 看了网上的很多篇文章&#xff0c;每个原因都排查了&#xff0c;没有发现问题。 遇到这样的情况应先看自己是否安装成功 打开运行&#xff0c;在空框中输入powershell并点击确定&#xff1a; docker version 显示版本证明安装…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

算法打卡第18天

从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...