首页 > 其他分享 >vue2中el-tree组件实现双击树的节点来修改节点名称

vue2中el-tree组件实现双击树的节点来修改节点名称

时间:2024-02-06 11:12:40浏览次数:30  
标签:el name children 输入框 双击 节点 data id

目标

  • 在没双击之前,树的节点是文本样式。
  • 在双击之后,节点位置变成输入框形式,原节点的名称显示在输入框中,可以进行修改。
  • 修改完毕之后,当输入框失去焦点的时候,输入框消失,又变成原本的文本样式,并且显示的是修改后的节点名称。

添加一个树

<template>
    <div>
        <el-tree
            :data="tree"
            highlight-current
            node-key="id"
            :props="{
                children: 'children',
                label: 'name'
            }"
            ref="tree"
        >
        </el-tree>
    </div>
</template>

<script>
export default {
    data() {
        return {
            tree: [
                {
                    id: 1,
                    name: '北京',
                    children: [
                        {
                            id: 5,
                            name: '朝阳',
                            children: [
                                {
                                    id: 17,
                                    name: '双塔',
                                    children: []
                                },
                                {
                                    id: 18,
                                    name: '龙城',
                                    children: []
                                }
                            ]
                        },
                        {
                            id: 6,
                            name: '丰台',
                            children: [
                                {
                                    id: 19,
                                    name: '新村',
                                    children: []
                                },
                                {
                                    id: 20,
                                    name: '大红门',
                                    children: []
                                },
                                {
                                    id: 21,
                                    name: '长辛店',
                                    children: [
                                        {
                                            id: 22,
                                            name: '东山坡',
                                            children: []
                                        },
                                        {
                                            id: 23,
                                            name: '北关',
                                            children: []
                                        },
                                        {
                                            id: 24,
                                            name: '光明里',
                                            children: []
                                        },
                                        {
                                            id: 25,
                                            name: '赵辛店',
                                            children: []
                                        },
                                        {
                                            id: 26,
                                            name: '西峰寺',
                                            children: []
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            id: 7,
                            name: '海淀',
                            children: []
                        },
                        {
                            id: 8,
                            name: '房山',
                            children: []
                        },
                        {
                            id: 10,
                            name: '顺义',
                            children: []
                        }
                    ]
                },
                {
                    id: 2,
                    name: '上海',
                    children: [
                        {
                            id: 11,
                            name: '黄埔',
                            children: []
                        },
                        {
                            id: 12,
                            name: '徐汇',
                            children: []
                        }
                    ]
                },
                {
                    id: 3,
                    name: '广州',
                    children: [
                        {
                            id: 13,
                            name: '荔湾',
                            children: []
                        },
                        {
                            id: 14,
                            name: '白云',
                            children: []
                        },
                        {
                            id: 15,
                            name: '越秀',
                            children: []
                        },
                        {
                            id: 16,
                            name: '南沙',
                            children: []
                        }
                    ]
                }
            ]
        }
    }
}
</script>

效果

实现

基本思路

利用插槽的方式定义树的每个节点

https://element.eleme.cn/#/zh-CN/component/tree#zi-ding-yi-jie-dian-nei-rong

然后在定义节点的时候添加一个文本,一个输入框

通过设置文本的双击事件 dblclick 来操作

通过 v-ifv-else 来达到只同时显示一个

当双击节点后,激活变量,然后隐藏文本,显示输入框,并把节点名给文本框绑定的变量

修改后,失去焦点的时候,修改树的数据或者提交给后端,然后修改激活的变量,显示文本,隐藏输入框。

完整代码

<template>
    <div>
        <el-tree
            :data="tree"
            highlight-current
            node-key="id"
            :props="{
                children: 'children',
                label: 'name'
            }"
            ref="tree"
        >
            <span class="custom-tree-node" slot-scope="{ node, data }" @dblclick="headerDbClick(data)">
                <span v-if="!data.isEdit">{{ node.label }}</span>
                <input
                    v-else
                    :ref="data.id"
                    placeholder="请输入内容"
                    v-model="currentName"
                    @blur="($event) => handleInputBlur($event, data)"
                />
            </span>
        </el-tree>
    </div>
</template>

<script>
export default {
    methods: {
        headerDbClick(data) {
            console.log('双击节点', data)
            this.currentName = data.name
            this.$set(data, 'isEdit', true)
            this.$nextTick(() => {
                this.$refs[data.id] && this.$refs[data.id].focus() // 获取输入框,自动获取焦点
            })
        },
        handleInputBlur(event, data) {
            console.log(event.target.value)
            const inputName = event.target.value.trim()
            if (inputName === '') {
                this.$message({
                    type: 'warning',
                    message: '分类名称不能为空,请重新输入'
                })
                this.$set(data, 'isEdit', false) // 让文本span标签显示,输入框隐藏
            } else if (inputName === data.name) {
                this.$set(data, 'isEdit', false)
            } else {
                this.$set(data, 'isEdit', false)
                data.name = inputName
            }
            this.currentName = ''
        }
    },
    data() {
        return {
            tree: [
                {
                    id: 1,
                    name: '北京',
                    children: [
                        {
                            id: 5,
                            name: '朝阳',
                            children: [
                                {
                                    id: 17,
                                    name: '双塔',
                                    children: []
                                },
                                {
                                    id: 18,
                                    name: '龙城',
                                    children: []
                                }
                            ]
                        },
                        {
                            id: 6,
                            name: '丰台',
                            children: [
                                {
                                    id: 19,
                                    name: '新村',
                                    children: []
                                },
                                {
                                    id: 20,
                                    name: '大红门',
                                    children: []
                                },
                                {
                                    id: 21,
                                    name: '长辛店',
                                    children: [
                                        {
                                            id: 22,
                                            name: '东山坡',
                                            children: []
                                        },
                                        {
                                            id: 23,
                                            name: '北关',
                                            children: []
                                        },
                                        {
                                            id: 24,
                                            name: '光明里',
                                            children: []
                                        },
                                        {
                                            id: 25,
                                            name: '赵辛店',
                                            children: []
                                        },
                                        {
                                            id: 26,
                                            name: '西峰寺',
                                            children: []
                                        }
                                    ]
                                }
                            ]
                        },
                        {
                            id: 7,
                            name: '海淀',
                            children: []
                        },
                        {
                            id: 8,
                            name: '房山',
                            children: []
                        },
                        {
                            id: 10,
                            name: '顺义',
                            children: []
                        }
                    ]
                },
                {
                    id: 2,
                    name: '上海',
                    children: [
                        {
                            id: 11,
                            name: '黄埔',
                            children: []
                        },
                        {
                            id: 12,
                            name: '徐汇',
                            children: []
                        }
                    ]
                },
                {
                    id: 3,
                    name: '广州',
                    children: [
                        {
                            id: 13,
                            name: '荔湾',
                            children: []
                        },
                        {
                            id: 14,
                            name: '白云',
                            children: []
                        },
                        {
                            id: 15,
                            name: '越秀',
                            children: []
                        },
                        {
                            id: 16,
                            name: '南沙',
                            children: []
                        }
                    ]
                }
            ],
            currentName: ''
        }
    }
}
</script>

标签:el,name,children,输入框,双击,节点,data,id
From: https://www.cnblogs.com/guangdelw/p/18009397

相关文章

  • yield from 关键字的 return 语句
    我经常需要写一些比较复杂的代码,常常会遇到各种各样的问题。比如我在使用yieldfrom表达式时,return语句的问题。我们知道,在使用yieldfrom表达式时,return语句的作用是在子生成器(被调用的生成器)执行完毕后,返回最终的结果到调用者。这可以让生成器在嵌套结构中更清晰地传递值。......
  • python爬虫爬取豆瓣电影top250并写入Excel中
    importrequestsimportreimportopenpyxl#创建工作表wb=openpyxl.Workbook()ws=wb.active#调整列距forletterin['B','C']:ws.column_dimensions[letter].width=66#发送网络请求headers={"User-Agent":'Mozilla/5.0(WindowsNT10.0;Win64;x64)......
  • 使用ocelot 配置网关
    3.1场景描述建3个站点,2个微服务站点,1个网关微服务1:https://localhost:7227/微服务2:https://localhost:7019/网关:https://localhost:7055/在浏览器里访问 https://localhost:7227/api/Product/test1会输出test1在浏览器里访问https://localhost:7019/api/order/test2会输......
  • element使用
    一、el-table指定汇总列<el-table:row-key="(row)=>row.Id":data="listData"bordershow-summary:summary-method="summaryColumn"style="widt......
  • 什么是 Ocelot?
    Ocelot是一个用于构建微服务架构中API网关的开源框架,它充当了前端应用程序和后端微服务之间的入口点,处理请求路由、认证授权、流量管理、负载均衡、日志记录、安全性等任务。通过API网关,可以将多个微服务的API统一暴露给客户端,提供更简化和统一的接入方式。 Ocelot提供......
  • PowerShell中,可以使用特定的命令来执行关机、重启和休眠等操作
    PowerShell中,可以使用特定的命令来执行关机、重启和休眠等操作。以下是这些操作的常用命令及其简要说明:关机(Shutdown)Stop-Computer用于关闭本地或远程计算机。示例:Stop-Computer若要强制关闭(不等待应用程序响应),可以添加 -Force 参数:Stop-Computer-Force重启(Re......
  • [Go - slice] Remove Elements from a slice in Go
    Gohasaspecialindexingsyntaxthatformsthebasisofremovingoneormoreelementsfromaslice.Iwillteachyouthissyntaxandshowyouitsvariousforms.Baseduponthat,I'llshowyouhowtoremoveasingleelementfromaslice.However,you......
  • power shell 查询版本 方法大全
    在PowerShell中查看版本信息可以通过多种方式实现。以下是几种常用的方法来查看你当前使用的PowerShell版本:方法1: $PSVersionTable 变量这是检查PowerShell版本最简单和最常用的方法。只需在PowerShell窗口中输入以下命令:powershellCopyCode$PSVersionTable.PSVersion此......
  • ReentrantLock源码分析、LockSuppor、ReentrantReadWriteLock、锁优化的方法
    ReentrantLock类图我们看一下重入锁ReentrantLock类关系图,它是实现了Lock接口的类。NonfairSync和FairSync都继承自抽象类Sync,在ReentrantLock中有非公平锁NonfairSync和公平锁FairSync的实现。在重入锁ReentrantLock类关系图中,我们可以看到NonfairSync和FairSync都继承自抽象......
  • ReentrantLock源码分析、LockSuppor、ReentrantReadWriteLock、锁优化的方法
    ReentrantLock类图我们看一下重入锁ReentrantLock类关系图,它是实现了Lock接口的类。NonfairSync和FairSync都继承自抽象类Sync,在ReentrantLock中有非公平锁NonfairSync和公平锁FairSync的实现。在重入锁ReentrantLock类关系图中,我们可以看到NonfairSync和FairSync都继承自抽象......