vue--el-tree树的懒加载--实现节点后的编辑,删除,添加按钮功能

本文档详细介绍了前端UI组件库中针对树形结构数据的管理操作,包括编辑、删除和添加节点的功能实现。编辑节点时,弹窗显示节点信息并允许修改;删除节点前会检查是否有子节点或关联数据;添加节点则根据当前层级限制,并在确认后局部刷新。代码示例展示了使用Element UI组件进行操作的逻辑和交互处理。
摘要由CSDN通过智能技术生成

很多代码不能全部贴出来,变量也没有全部做注释。如果有看不懂的,可以留言或者私信

样式说明:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1,编辑操作
点击某一个节点之后的编辑按钮,出现弹窗,将现有的节点数据显示在弹窗中,并且可修改,点击弹窗中的确定,弹窗消失,新修改的数据显示。
2,删除操作
点击某一个节点后面的删除按钮,弹出提示信息,如果这个节点下面有子节点或者有关联的数据,那就不可删除(后端判断),否则可删除,并且刷新删除节点的父节点。
3,添加操作
点击某一个节点之后的添加子节点的操作,会弹出子节点信息,填入之后,点击确定之后,保存,并且局部刷新该节点

<el-tree
                :data="treeData"
                node-key="id"
                :filter-node-method="filterNode"
                ref="dimTree"
                :props="treeDataDefaultProp"
                style="margin-right: 8px"
                :expand-on-click-node="false"
                :load="loadNode"
                lazy
              >
                <span
                  :class="{'custom-tree-node': true, 'node-click': flag == data.code}"
                  slot-scope="{node, data}"
                  :ref="node.data.code"
                >
                  <span class="enumText">{{ data.name }}</span>
                  <span>
                    <el-button
                      type="text"
                      class="blue el-icon-edit-outline"
                      size="mini"
                      @click.stop="editCateName(data, node)"
                    >
                    </el-button>
                    <el-button
                      type="text"
                      class="el-icon-circle-plus-outline"
                      size="mini"
                      v-if="data.currentLevel < 5"
                      @click.stop="appendTreeNode(data, node)"
                    >
                    </el-button>
                    <el-button type="text" class="el-icon-delete" size="mini" @click="removeTreeNode(node, data)">
                    </el-button>
                  </span>
                </span>
              </el-tree>

data(){
 return{
	createCateInfo: {
        type: '',
        code: '',
        name: '',
        parentCategoryId: '',
        currentLevel: '',
        manager: ''
      },
      editCateNameInfo: {
        code: '',
        name: '',
        manager: ''
      },
      rules: {
        code: [
          {required: true, message: '请输入分类编码', trigger: ['blur', 'change']},
          {validator: this.validateCode, trigger: ['blur', 'change']}
        ],
        name: [
          {required: true, message: '请输入分类名称', trigger: ['blur', 'change']},
          {validator: this.validateName, trigger: ['blur', 'change']}
        ],
        manager: [
          {required: true, message: '请输入负责人', trigger: 'blur'},
          {validator: validateManager, trigger: 'blur'}
        ]
      },
      createCateShow: false,//增加分类名称弹窗
      isEditShow: false,// 修改分类名称弹窗
      isAppendNode: '', //保存点击添加的节点
      isRemoveNode: '', // 保存点击删除的节点
      isEditData: '', //保存点击编辑名称按钮的节点
}
}
 methods: {
    // 验证输入框只能输入数字、字母、下划线、中划线
    validateCode(rule, value, callback) {
      let reg = this.$configs.regExp.code;
      return reg.test(value) ? callback() : callback(new Error('只能输入数字、字母、下划线、中划线'));
    },
    validateName(rule, value, callback) {
      let reg = this.$configs.regExp.name;
      return reg.test(value) ? callback() : callback(new Error('只能输入中文、数字、字母、下划线、中划线'));
    },
    // 点击编辑按钮修改
    editCateName(data) {
      this.isEditData = data;
      this.editCateNameInfo.name = data.name;
      this.editCateNameInfo.code = data.code;
      this.editCateNameInfo.manager = data.manager;
      this.isEditShow = true;
    },
    // 编辑分类弹窗的确定按钮
    editCateConfirm() {
      this.$refs['editCateFrom'].validate(valid => {
        if (valid) {
          if (
            this.isEditData.name !== this.editCateNameInfo.name ||
            this.isEditData.manager !== this.editCateNameInfo.manager
          ) {
            let param = {
              id: this.isEditData.id,
              name: this.editCateNameInfo.name,
              manager: this.editCateNameInfo.manager
            };
            this.$api.put('/api/category', param).then(res => {
              if (res.code === 200) {
                this.isEditData.name = this.editCateNameInfo.name;
                this.isEditData.manager = this.editCateNameInfo.manager;
                this.isEditShow = false;
                this.$message({
                  type: 'success',
                  message: '修改分类成功'
                });
              }
            });
          } else {
            this.isEditShow = false;
          }
        }else{
          return false
        }
      });
    },
    // 添加一个分类结点
    appendTreeNode(data, node) {
      this.createCateInfo.code && (this.createCateInfo.code = '');
      this.createCateInfo.name && (this.createCateInfo.name = '');
      this.createCateInfo.manager && (this.createCateInfo.manager = '');
      if (data.currentLevel == 5) {
        this.$message({
          type: 'warning',
          message: '已达到最大层级,不可再添加。'
        });
        return;
      }
      this.isAppendNode = node;
      this.createCateInfo.parentCategoryId = data.id;
      this.createCateInfo.currentLevel = data.currentLevel + 1;
      this.createCateShow = true;
    },
    // 添加分类弹窗确定按钮
    createCateConfirm() {
      this.$refs['createCateFrom'].validate(async valid => {
        if (valid) {
          if (this.isAppendRootNode) {
            this.createRootCateMethod();
          } else {
            let bolRelate = await this.isRelateMethod();
            // 新加一个弹窗,当这个节点是叶子节点的时候并且关联了数据时有弹窗,若是没有关联数据或者是已经有叶子节点的时候,就没有弹窗
            if (this.isAppendNode.isLeaf && bolRelate) {
              this.showRelateParentNodeMsgBox();
            } else {
              this.createCateMethod();
            }
          }
        } else {
          return false;
        }
      });
    },
 // 添加新分类节点的接口
    async createCateMethod() {
      this.createCateInfo.type = Number(this.cateTabActive);
      const param = JSON.parse(JSON.stringify(this.createCateInfo));
      const res = await this.$api.post('/api/category', param);
      if (res.code === 200) {
        this.createCateShow = false;
        this.$message({
          type: 'success',
          message: '添加分类成功'
        });
        this.cateInfo = '';
        this.isAppendNode.loaded = false;
        this.isAppendNode.expand();
      }
      // else {
      //   this.$message({
      //     type: 'warning',
      //     message: res.msg
      //   });
      // }
    },
// 删除一个分类结点
    removeTreeNode(node, data) {
      this.isRemoveNode = node;
      let msg = node.isLeaf ? '' : '及其子分类';
      this.$confirm('确定删除该分类' + msg + '?', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          this.removeTreeNodeMethod(data.id);
        })
        .catch(() => {
          return;
        });
    },
    // 删除分类接口
    async removeTreeNodeMethod(id) {
      const res = await this.$api.delete('/api/category/' + id);
      if (res.code === 200) {
        this.$message({
          type: 'success',
          message: '删除分类成功'
        });
        if (this.isRemoveNode.level == 1) {
          this.getTreeData();
        } else {
          this.isRemoveNode.parent.loaded = false;
          this.isRemoveNode.parent.expand();
        }
      } else {
        let typeId = res.info.type;
        if (typeId == 61) {
          let msg = this.isRemoveNode.isLeaf ? '该维度分类下已有维度关联' : '该维度的叶子节点下已有维度关联';
          this.$message({
            type: 'warning',
            message: msg
          });
        } else {
          let msg = this.isRemoveNode.isLeaf ? '该指标分类下已有指标关联' : '该指标的叶子节点下已有指标关联';
          this.$message({
            type: 'warning',
            message: msg
          });
        }
      }
    },
好的,下面是实现三级懒加载的基本思路: 1. 定义形结构的数据,包括每个节点的id、label、是否有子节点、子节点id等信息。 2. 使用el-tree组件进行形结构的展示,其中第一级节点可以通过props的data属性传入,第二级和第三级节点需要通过load方法进行懒加载。 3. 在load方法中,获取当前节点的子节点信息,可以通过ajax请求后端接口获取数据。在获取的数据中,需要将每个节点的hasChildren属性设置为true或false,表明该节点是否还有子节点,同时需要将子节点的id信息存储在该节点的children属性中。 4. 当用户点击某个节点时,会触发el-tree组件的node-click事件,此时可以通过该事件的参数node获取当前节点的信息,从而获取该节点的子节点信息。 5. 在load方法中,可以根据当前节点的信息判断是第二级节点还是第三级节点,然后再根据节点的id信息去获取对应的子节点信息。 6. 最后将获取到的子节点信息通过callback函数返回给el-tree组件,从而完成懒加载操作。 下面是一个简单的示例代码: ``` <template> <el-tree :data="data" :load="loadNode"></el-tree> </template> <script> export default { data() { return { data: [ { id: 1, label: '一级节点1', hasChildren: true, children: [] }, { id: 2, label: '一级节点2', hasChildren: true, children: [] } ] } }, methods: { loadNode(node, resolve) { if (node.level === 0) { // 加载第二级节点 this.loadSecondLevelNode(node, resolve); } else if (node.level === 1) { // 加载第三级节点 this.loadThirdLevelNode(node, resolve); } }, loadSecondLevelNode(node, resolve) { // 发送ajax请求获取该节点的子节点信息 const params = { parentId: node.data.id, level: 2 }; axios.get('/api/getChildren', { params }) .then(res => { const data = res.data; data.forEach(item => { item.hasChildren = true; item.children = []; }); resolve(data); }) .catch(error => { console.log(error); resolve([]); }); }, loadThirdLevelNode(node, resolve) { // 发送ajax请求获取该节点的子节点信息 const params = { parentId: node.data.id, level: 3 }; axios.get('/api/getChildren', { params }) .then(res => { const data = res.data; data.forEach(item => { item.hasChildren = false; item.children = []; }); resolve(data); }) .catch(error => { console.log(error); resolve([]); }); } } } </script> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值