element树形控件编辑节点组装节点

需求功能:
编辑树节点,组装节点
复制代码
<el-scrollbar class="scrollbar-wrapper">
          <el-tree :data="nodeList" ref="tree" :props="defaultProps" :expand-on-click-node="false">
            <template slot-scope="{ node, data }">
              <div class="custom-tree-node">
                <template v-if="node.label">
                  <span>{{node.label}} <span v-if="node.level==4 && false" style="padding-left:30px">
                      <el-checkbox v-model="data.isCommon" true-label="Y" false-label="N">是否常用分类</el-checkbox>
                    </span>
                  </span>
                  <span style="margin-left:20px">
                    <el-button size="small" type="text" @click.stop="appendNode(node,data)"
                      :disabled='node.level==4'>新增</el-button>
                    <el-button size="small" type="text" @click.stop="editNode(node,data)">编辑</el-button>
                    <el-button size="small" type="text" @click.stop="removeNode(node,data)">删除</el-button>
                  </span>
                </template>
                <template v-else="!node.investFormCodeText">
                  <el-row :gutter="20" style="width:80%">
                    <el-col :span="3">
                      <div class="">编号:</div>
                    </el-col>
                    <el-col :span="6">
                      <el-input v-model="data.investFormCode" size="small" placeholder="请输入编号"></el-input>
                    </el-col>
                    <el-col :span="3">
                      <div class="">描述:</div>
                    </el-col>
                    <el-col :span="12">
                      <el-input v-model="data.investFormCodeDesc" size="small" placeholder="请输入描述"></el-input>
                    </el-col>
                  </el-row>
                  <span style="margin-left:20px">
                    <el-button size="small" @click="handleCancel(node,data)">取消</el-button>
                    <el-button size="small" type="primary" @click.stop="addChild(node,data)"
                      :disabled='node.level==4'>保存</el-button>
                  </span>
                </template>
              </div>
            </template>
          </el-tree>
        </el-scrollbar>

data () {
    return {
      nodeList: [],
      defaultProps: {
        children: 'childList',
        label: 'investFormCodeText'
      },
      deleteList: [],
    }
  }

appendNode (node, data) {
      //为 Tree 中的一个节点追加一个子节点
      this.$refs.tree.append({
        dictKey: "marketQuotationInvestForm",
        investFormCodeText: '',
        childList: []
      }, node)
    },
    editNode (node, data) {
      this.$set(data, "tempInvestFormCodeText", data.investFormCodeText);
      this.$set(data, "investFormCodeText", "");
    },
    removeNode (node, data) {
      const parent = node.parent;
      const childList = parent.data.childList || parent.data;
      const index = childList.findIndex(d => d === data);
      if (data.id) {
        this.$confirm('删除配置项将影响历史数据,请确认是否删除?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          childList.splice(index, 1);
          this.deleteList.push({
            id: data.id
          });
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      }
      else {
        childList.splice(index, 1);
      }
    },

// 数据结构
"nodeList": [{
		"investFormCodeText": "TF01 -- 搜索广告",
		"investFormCode": "TF01",
		"childList": null,
		"id": 14,
		"investFormCodeDesc": "搜索广告",
		"parentId": 0
	},
	{
		"investFormCodeText": "TF02 -- 开屏",
		"investFormCode": "TF02",
		"childList": [{
				"investFormCodeText": "A001 -- 抖音-开屏",
				"investFormCode": "A001",
				"childList": [{
						"investFormCodeText": "B001 -- 优选互动",
						"investFormCode": "B001",
						"childList": null,
						"id": 17,
						"investFormCodeDesc": "优选互动",
						"parentId": 16
					},
					{
						"investFormCodeText": "B002 -- 优选点击",
						"investFormCode": "B002",
						"childList": null,
						"id": 18,
						"investFormCodeDesc": "优选点击",
						"parentId": 16
					},
					{
						"investFormCodeText": "B003 -- 超级优选",
						"investFormCode": "B003",
						"childList": null,
						"id": 19,
						"investFormCodeDesc": "超级优选",
						"parentId": 16
					}
				],
				"id": 16,
				"investFormCodeDesc": "抖音-开屏",
				"parentId": 15
			},
			{
				"investFormCodeText": "A002 -- 头条-开屏",
				"investFormCode": "A002",
				"childList": [{
						"investFormCodeText": "B001 -- 优选互动",
						"investFormCode": "B001",
						"childList": null,
						"id": 21,
						"investFormCodeDesc": "优选互动",
						"parentId": 20
					},
					{
						"investFormCodeText": "B002 -- 优选点击",
						"childList": null,
						"id": 22,
						"investFormCodeDesc": "优选点击",
						"parentId": 20
					}
				],
				"id": 20,
				"investFormCodeDesc": "头条-开屏",
				"parentId": 15
			}
		],
相关推荐
jay神3 天前
【计算机毕业设计】基于Spring Boot的宠物领养管理系统
java·spring boot·后端·vue·毕业设计·宠物
要开心吖ZSH3 天前
腾讯 IM 前端对接小白教程:医患一对一聊天(含自定义报告卡片)
vue·健康医疗·即时通讯·im
深念Y3 天前
07-SSR水合问题实战排查与修复记录
前端·vue·vite·nuxt·ssr·csr·水合
深念Y3 天前
NativeScript 移动端开发踩坑记录
前端·ui·vue·安卓·移动端·native·原生
avi91114 天前
【】js不同颜色(Vue 框架)今时今日2026年学编程入门(10月1日)
前端·vue.js·vue·vue框架·前端入门·vue入门·html上传
宠友信息5 天前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
南城以南溫暖如初1475 天前
从零搭建24小时自助健身系统:技术选型与核心模块实战
java·spring boot·redis·mysql·vue·mybatis
_xaboy5 天前
开源表单设计器 FcDesigner 保存表单教程:toJson parseJson 回显
低代码·开源·vue·表单·fcdesigner
钛态5 天前
Vite 中的 CSS 工程化:从 CSS Modules 到 UnoCSS 的渐进式迁移
前端·vue·react·web
南城以南溫暖如初1476 天前
树洞交友系统架构设计与匿名聊天实战指南
java·spring boot·mysql·系统架构·vue·mybatis·交友