You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LWC中不使用lightning-tree展示层级JSON为树形结构

自定义LWC树形结构实现方案

要实现自定义树形结构,核心思路是利用组件递归处理嵌套层级的数据,下面是完整可落地的实现步骤:

1. 组件拆分

我们需要两个组件配合:

  • 主组件:负责加载和传递树形数据源
  • 树形节点组件:递归渲染每个节点及其子节点

2. 主组件(customTree)

HTML 代码

<template>
    <div class="tree-container">
        <!-- 调用树形节点组件,传入根节点数据 -->
        <c-tree-node node={treeData}></c-tree-node>
    </div>
</template>

JS 代码

import { LightningElement } from 'lwc';

export default class CustomTree extends LightningElement {
    // 你的树形数据源
    treeData = [
        {
            "label": "Lauren Boyle",
            "name": "Lauren Boyle",
            "expanded": true,
            "items": [
                {
                    "label": "Banoth Srikanth",
                    "name": "Banoth Srikanth",
                    "expanded": true,
                    "items": [
                        {
                            "label": "Stella Pavlova",
                            "name": "Stella Pavlova",
                            "expanded": true,
                            "items": []
                        }
                    ]
                },
                {
                    "label": "Srikanth",
                    "name": "Srikanth",
                    "expanded": true,
                    "items": []
                }
            ]
        }
    ];
}

3. 树形节点组件(treeNode)

这是实现核心,通过自身递归调用渲染子节点:

HTML 代码

<template>
    <!-- 遍历当前层级的所有节点 -->
    <template for:each={node} for:item="item">
        <div key={item.name} class="tree-node">
            <!-- 仅当有子节点时显示展开/收起图标 -->
            <template if:true={item.items.length}>
                <lightning-icon 
                    class="tree-icon"
                    icon-name={getIconName(item.expanded)} 
                    onclick={toggleExpand} 
                    data-name={item.name}
                    alternative-text={item.expanded ? '收起' : '展开'}>
                </lightning-icon>
            </template>
            <!-- 节点标签文本 -->
            <span class="node-label">{item.label}</span>
            <!-- 递归渲染子节点(仅当节点处于展开状态时显示) -->
            <template if:true={item.expanded}>
                <div class="child-nodes">
                    <c-tree-node node={item.items}></c-tree-node>
                </div>
            </template>
        </div>
    </template>
</template>

JS 代码

import { LightningElement, api } from 'lwc';

export default class TreeNode extends LightningElement {
    // 接收父组件传递的当前层级节点数据
    @api node;

    // 根据展开状态返回对应图标
    getIconName(expanded) {
        return expanded ? 'utility:chevrondown' : 'utility:chevronright';
    }

    // 切换节点展开/收起状态
    toggleExpand(event) {
        const targetName = event.target.dataset.name;
        // 递归查找目标节点并切换状态
        const targetNode = this.findNodeByName(this.node, targetName);
        if (targetNode) {
            targetNode.expanded = !targetNode.expanded;
        }
    }

    // 递归遍历节点树,根据name查找目标节点
    findNodeByName(nodes, name) {
        for (const node of nodes) {
            if (node.name === name) return node;
            if (node.items.length) {
                const found = this.findNodeByName(node.items, name);
                if (found) return found;
            }
        }
        return null;
    }
}

CSS 代码(美化树形结构)

.tree-node {
    display: flex;
    align-items: center;
    padding: 4px 0;
}

.tree-icon {
    cursor: pointer;
    margin-right: 4px;
    width: 16px;
    height: 16px;
}

.node-label {
    cursor: default;
}

.child-nodes {
    margin-left: 20px;
    margin-top: 4px;
}

实现说明

  • 递归渲染:树形节点组件通过自身调用,自动适配任意层级的嵌套数据
  • 状态切换:修改节点的expanded属性触发LWC响应式渲染,自动显示/隐藏子节点
  • 样式定制:通过CSS可轻松调整缩进、颜色、hover效果等,完全自定义树形外观

内容的提问来源于stack exchange,提问作者bnthsrikanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:44:56