树形表格,获取指定行的父节点数据

本文介绍了如何使用JavaScript在树形表格中,通过指定行的唯一值id查找其所有父级节点,并扩展显示。方法包括getRowAndParentsById函数,以及如何使用$nextTick和$refs来操作树组件的行展开功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、树形表格,通过指定行的唯一值id。找到其所有父级节点对象(不包含id当前节点)

getRowAndParentsById(tree, targetId) {

            let result = []

            let parentFound = false

            function search(treeData, parentId) {

                for (const node of treeData) {

                    if (node.value === targetId) {

                        if (parentId !== null) {

                            parentFound = true

                        }

                        break

                    } else if (node.children) {

                        search(node.children, node.value)

                        if (result.length > 0 || parentFound) {

                            result.push(node)

                            break

                        }

                    }

                }

            }

            search(tree, null)

            return result

        },

如果还想获取到id所在的当前节点。 只需要将黄色删除、红色行修改为:

result.push(node)

在上面基础上展开到指定行:

const rowKeyToExpand = this.getRowAndParentsById(this.treeData, targetValue.value)

rowKeyToExpand.forEach((element) => {

                        this.$nextTick(() => {

                            this.$refs['treeData'].toggleRowExpansion(element, true)

                        })

                    })

### 使用 `vxe-table` 实现树形结构 Hover 显示父节点名称 为了实现在 `vxe-table` 中当鼠标悬停在树形结构的子节点上时显示父节点名称的功能,可以利用 Vue 的事件处理机制以及自定义方法来获取并展示父节点的信息。 #### 1. 定义数据模型和表格配置 首先,在组件中通过 `provide()` 提供全局可访问的方法用于设置和获取子组件引用: ```javascript export default { provide () { return { setChildrenRef: (name, ref) => { this.$set(this.domMap, name, ref); }, getChildrenRef: name => { return this[name]; } }; }, data () { return { domMap: {} }; } } ``` 接着,创建一个包含子关系的数据集作为表格源,并指定列属性以便渲染成树状视图[^1]。 #### 2. 自定义单元格内容模板 对于每一记录,可以通过插槽方式来自定义其呈现形式。这里我们将添加隐藏域存储当前项及其祖先路径信息,并绑定 mouseenter 和 mouseleave 事件监听器以控制提示框的状态变化。 ```html <template slot="default" slot-scope="{ row }"> <!-- 隐藏字段保存整条链路 --> <span style="display:none">{{ getParentNames(row.parentId).join(' / ') }}</span> <!-- 正常显示的内容 --> {{row.name}} </template> ``` 其中 `getParentNames(id)` 函数负责递归查找给定 ID 对应的所有上级节点名直至根部;而实际应用过程中可能还需要考虑性能优化等问题。 #### 3. 处理 Mouse Events 并更新状态 每当用户将指针移到某一之上时触发相应动作——即调用之前提到过的辅助函数计算出完整的层级描述字符串,再将其赋值给临时变量或直接嵌入到页面 DOM 结构里去。与此同时也要记得清除旧有的高亮效果以免造成视觉混乱。 ```javascript methods: { handleMouseEnter(event, params){ const parentPath = this.getParentNames(params.row.parentId); event.target.title = 'Parent Path:' + parentPath.join(' -> '); // 或者使用更复杂的逻辑构建悬浮窗样式... }, getParentNames(parentId){ let names = []; function findParents(currentId){ if (!currentId || currentId === '') return; const parentNode = this.getRowById(currentId); if (parentNode){ names.unshift(parentNode.name); findParents(parentNode.parentId); } } findParents.call(this, parentId); return names; } } ``` 上述代码片段展示了如何基于所提供的 API 来增强交互体验,使得开发者能够轻松地向用户提供有关所选项目的上下文信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xren-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值