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

Vue单页面实现el-tree el-breadcrumb功能、el-tree右键点击树节点展示菜单功能、树节点编辑节点字段名称功能

(1) 点击el-tree节点 使用el-breadcrumb展示选中树节点及父项数据

        重点:handleNodeClick方法、getTreeNode方法

(2) 选择el-breadcrumb-item设置el-tree节点选中 

         必须设置属性: current-node-key="currentNodeKey"  、 node-key="id"

         重点: 设置树节点渲染 this.$refs.tree.setCurrentKey(item.id) 

(3) 右键点击树节点展示菜单 

        重点:handleNodeContextmenu方法、showTreeMenu方法、设置active样式  

 (4) 树节点编辑节点字段名称

         重点:handleTreeNodeNameEdit方法、submitTreeNodeNameEdit方法

<template><div class="sqm-file-page"><el-row><el-col :span="4"><div class="grid-left-content"><el-tree ref="tree" :data="treeData" :props="defaultProps" node-key="id" highlight-current :default-expanded-keys="defaultExpandedKeys" :current-node-key="currentNodeKey" :expand-on-click-node="false" @node-click="handleNodeClick" @node-contextmenu="handleNodeContextmenu"><template #default="{ node, data }"><!-- 如果是编辑状态 --><template v-if="data.isEdit == 1"><el-input ref="treeNodeNameInput" v-model="treeNodeName" class="name-input" @blur="() => submitTreeNodeNameEdit(node, data)" /></template><!-- 如果不是编辑状态 --><span v-else v-text="data.name" /><i class='el-icon-edit-outline' @click.stop="() => handleTreeNodeNameEdit(node, data)" />          </template></el-tree><div ref="treeMenu" class="tree-menu">树节点右键菜单内容</div></div></el-col><el-col :span="20"><div class="grid-right-content"><el-breadcrumb separator-class="el-icon-arrow-right"><el-breadcrumb-item v-for="(item, index) in breadList" :key="index" @click.native="handleBreadcrumbItem(item, index)">{{ item.name }}</el-breadcrumb-item></el-breadcrumb></div></el-col></el-row></div>
</template><script>
import {findTree} from '@/api/sqm//qf/api'export default {name: 'SqmFileList',data() {return {treeData: [],defaultExpandedKeys: [1],currentNodeKey: '',defaultProps: {children: 'sqmFileList',label: 'name'},activeNode: {}, // 选中的节点      breadList: [], // 面包屑数组treeNodeName: '' // 树节点编辑时名称}},created() {const that = thisthat.getTree()},methods: {// el-tree数据getTree() {const that = thisfindTree().then(res => {let expandedKeys = []for (let i = 0; i < res.data.length; i++) {expandedKeys.push(res.data[i].id)}that.defaultExpandedKeys = expandedKeysthat.treeData = res.datathat.breadList = res.data     })},// 树节点点击handleNodeClick(data, node) {const that = this// 设置树节点选中this.$set(data, 'isChecked', true) // 获取面包屑this.breadList = []this.getTreeNode(this.$refs.tree.getNode(data.id))that.activeNode = data},// 获取当前树节点和其父级节点getTreeNode(node) {if (node && node.data.name) {this.breadList.unshift(node.data)this.getTreeNode(node.parent) // 递归}},// 点击面包屑handleBreadcrumbItem(item, index) {// 设置树节点当前选中的keythis.currentNodeKey = item.id// 重点: 设置树节点渲染this.$refs.tree.setCurrentKey(item.id)// 删除选中面包屑后面的面包屑this.breadList.splice(index + 1, this.breadList.length)},// 树节点鼠标右键点击handleNodeContextmenu(e, data, node, target) {// 树节点选中之后才能展示树节点菜单if (data.isChecked) {this.showTreeMenu(e, data, node, target)}},// 展示树节点菜单showTreeMenu(e, data, node, target) {const menu = this.$refs.treeMenuconst menuHeight = menu.clientHeightconsole.log(menuHeight)const x = e.pageX // 触发点到页面窗口左边的距离const y = e.pageY // 触发点到页面窗口顶部的距离if ((document.body.clientHeight - y) >= menuHeight) {menu.style.top = y + 'px'menu.style.bottom = 'auto'} else {menu.style.top = 'auto'menu.style.bottom = document.body.clientHeight - y + 'px'}menu.style.left = x + 'px'menu.classList.add('active')console.log(menu)},// 树节点编辑handleTreeNodeNameEdit(node, data) {this.$set(data, 'isEdit', 1)this.treeNodeName = data.namethis.$nextTick(() => {this.$refs.treeNodeNameInput.focus()})},// 树节点编辑后输入框失焦提交submitTreeNodeNameEdit(node, data) {if (data.name == this.treeNodeName) {console.log('没有修改')this.treeNodeName = ''this.$set(data, 'isEdit', 0)} else {this.$set(data, 'name', this.treeNodeName)this.treeNodeName = ''this.$set(data, 'isEdit', 0)// 此处...编辑完成后调用接口}},}}
</script><style lang="less" scoped>
.sqm-file-page {.grid-left-content {margin-right: 10px;::v-deep.el-tree-node {position: relative;font-size: 14px;// 设置选中节点样式&.is-current>.el-tree-node__content {background-color: #1456F01A;color: #1456F0;}.custom-tree-node {width: 100%;align-items: center;justify-content: space-between;i {padding-right: 20px;}.el-icon-edit-outline {position: absolute;right: 20px;top: 5px;}div.name-input {.el-input__inner {width: 55%;height: 21px;}}}}// 树节点右键菜单样式.tree-menu {position: fixed;width: 130px;border: 1px solid #DEDEDF;border-radius: 6px;background-color: #ffffff;box-shadow: 0 6px 24px #F4F5F5;visibility: hidden;}.active {visibility: visible;z-index: 2;}}.grid-right-content {::v-deep.el-breadcrumb {padding: 40px 0 20px 0;.el-breadcrumb__item {cursor: pointer;.el-breadcrumb__inner {font-size: 16px;color: #646A73;}&:last-child {.el-breadcrumb__inner {color: #1F2329;}}}}}
}
</style>

代码仅供参考 具体实现根据具体实际情况! 

http://www.lryc.cn/news/94944.html

相关文章:

  • C++核心编程之函数高级使用
  • 如何创建智能合约游戏系统
  • 如何用rust实现一个异步channel
  • gitee上传项目到仓库
  • day27 贪心算法
  • Java实现字符串反转
  • vue - 常见的性能优化
  • 微服务系列文章 之 Nginx服务状态监控的方法
  • 【网络系统集成】路由器实验
  • 【mac 安装Miniconda】
  • 螺栓疲劳计算-风电行业,参考GL2010, ST0361,1993-1-9
  • QT学习之旅 - QThread多线程
  • PROFINET转TCP/IP网关TCP/IP协议的含义是
  • 计算机网络基础第六章
  • MobPush:Android客户端SDK厂商通道回执配置指南
  • Karmada: Open, Multi-Cloud, Multi-Cluster Kubernetes Orchestration
  • arcgis拓扑检查
  • icp许可证 办理流程(icp资质申请条件)
  • 三菱PLC 控制灯一秒钟交替闪烁
  • 金融数据库的战场,太平洋保险和OceanBase打了场胜仗
  • IP协议【图解TCP/IP(笔记九)】
  • C#仿热血江湖
  • Nginx静态资源部署
  • javaee jstl表达式
  • ChatGPT是否具有记忆能力?
  • ARP协议(地址分析协议)
  • c# websocket client java websocket server
  • 【玩转循环】探索Python中的无限可能性
  • 网安学习经历小记
  • MyBatis之慎用association