<template>
  <div>
    <el-tree
            :data="data"
            show-checkbox
            node-key="id"
            default-expand-all
            :expand-on-click-node="false">
      <span class="custom-tree-node" slot-scope="{ node, data }">
        <span ondblclick="editHandle(this)" :data-obj="JSON.stringify(data)">{{ node.label }}</span>
        <span>
          <el-button
                  type="text"
                  size="mini"
                  @click="() => append(data)">
            Append
          </el-button>
          <el-button
                  type="text"
                  size="mini"
                  @click="() => remove(node, data)">
            Delete
          </el-button>
        </span>
      </span>
    </el-tree>
  </div>

</template>

<script>
    let id = 1000;
    export default {
        data() {
            const data = [{
                id: 1,
                label: '一级 1',
                children: [{
                    id: 4,
                    label: '二级 1-1',
                    children: [{
                        id: 9,
                        label: '三级 1-1-1'
                    }, {
                        id: 10,
                        label: '三级 1-1-2'
                    }]
                }]
            }, {
                id: 2,
                label: '一级 2',
                children: [{
                    id: 5,
                    label: '二级 2-1'
                }, {
                    id: 6,
                    label: '二级 2-2'
                }]
            }, {
                id: 3,
                label: '一级 3',
                children: [{
                    id: 7,
                    label: '二级 3-1'
                }, {
                    id: 8,
                    label: '二级 3-2'
                }]
            }];
            return {
                data: JSON.parse(JSON.stringify(data)),
            }
        },
        created() {
            window.editHandle = this.editHandle
        },
        methods: {
          // 添加
            append(data) {
                const newChild = {id: id++, label: 'testtest', children: []};
                  if (!data.children) {
                    this.$set(data, 'children', []);
                }
                data.children.push(newChild);
            },
          // 删除
            remove(node, data) {
                const parent = node.parent;
                const children = parent.data.children || parent.data;
                const index = children.findIndex(d => d.id === data.id);
                children.splice(index, 1);
            },
          //双击编辑
            editHandle(element) {
              let attrObj=element.getAttribute("data-obj")
                var oldHtml = element.innerHTML;
                // 创建一个新的 input 输入框
                var newInput = document.createElement('input');
                // 为新的 input添加属性
                newInput.type = "text";
                newInput.value = oldHtml;
                // 清空当前元素的文本内容
                element.innerHTML = '';
                // 把新的 input 框 追加到当前元素节点中
                element.appendChild(newInput);
                // 设置选择文本的内容或设置光标位置(两个参数:start,end;start为开始位置,end为结束位置;如果开始位置和结束位置相同则就是光标位置)
                newInput.setSelectionRange(0, oldHtml.length)
                // 为新 input 框获取焦点
                newInput.focus();
                // 为新的 input 添加失去焦点事件
                newInput.onblur = function () {
                // 判断失去焦点时,input 框的值是否与原值相同,相同则表示没有修改,返回原值;不同则表示有改动,返回新值
                    element.innerHTML = this.value == oldHtml ? oldHtml : this.value;
                }

            }
        }

    }
</script>

<style scoped>

</style>
Logo

前往低代码交流专区

更多推荐