YL

DATA TABLE

树形控件Tree View

展示有层级关系的数据,支持展开/折叠与选择,是文件目录、组织架构、分类管理的标准结构。

效果预览

▶📁src
▶📁components
📄Button.tsx
📄Input.tsx
▶📁pages
📄index.tsx

适合用在哪

文件目录、组织架构图、分类管理、权限菜单、省市级联。

不适合:层级很深(超过 5 层)或节点数极大时,Tree 的可读性会崩,考虑用面包屑 + 详情页、搜索或虚拟滚动。

和相近模式的区别

侧边栏导航Sidebar Nav

侧边栏导航是常驻的、用户频繁访问的顶层导航;Tree 是内容/数据的层级展示,可以嵌套在页面内容区。

自动补全输入Combobox / Autocomplete

Combobox 适合从层级数据中选择一个值;Tree 适合浏览和选择多个节点,或展示完整层级。

容易踩的坑

  • 超过 1000 个节点直接渲染,低端设备卡顿,应加虚拟滚动或异步加载。
  • 展开/折叠箭头只通过颜色区分,没有 rotate 动画,用户感知弱。
  • 复选框层级选中时父节点状态更新不及时,半选态容易出错。

设计提示词 · Prompt

树形控件(Tree View):每个节点一行,左侧展开箭头(可折叠节点才显示)、图标、节点名称。层级缩进 18-24px。选中节点用浅品牌色底;展开箭头旋转 90°。支持复选框多选树、异步加载子节点。
Tree View: each node is one row with an expand arrow (only on collapsible nodes), an icon, and the node label. Indent 18-24px per level. Row height 32-36px, 6px radius; hover light gray background; selected node uses light brand background + brand text. Expand arrow is an 8-10px ▶ that rotates 90° when expanded. Multi-select trees add checkboxes with cascade selection. Async child loading shows a small spinner beside the arrow.

可复制 CSS

自包含的最小实现,粘贴到空白页面即可生效;类名可以按项目规范改名。

/* <div class="tree"><div class="tree__node" style="--lvl:0"><button>▶</button><span>src</span></div>...</div> */
.tree { width: 260px; }
.tree__node { display: flex; align-items: center; gap: 6px; height: 32px; padding-left: calc(var(--lvl, 0) * 20px + 6px); border-radius: 6px; cursor: pointer; }
.tree__node:hover { background: #f3f4f6; }
.tree__node.is-selected { background: #eef2ff; color: #4338ca; }
.tree__node button { width: 18px; height: 18px; border: 0; background: transparent; cursor: pointer; font-size: 10px; transition: transform .2s ease; }
.tree__node.is-open > button { transform: rotate(90deg); }
.tree__node span { font: 14px/1 system-ui, sans-serif; }
@media (prefers-reduced-motion: reduce) {
  .tree__node button { transition: none; }
}

演示 HTML 结构

<div class="s d-center" style="width:100%">
  <div class="tb-tree">
    <div class="tb-tree__node" style="--lvl:0"><i class="tb-tree__chev tb-tree__chev--open">▶</i><em>📁</em><span>src</span></div>
    <div class="tb-tree__node tb-tree__node--sel" style="--lvl:1"><i class="tb-tree__chev">▶</i><em>📁</em><span>components</span></div>
    <div class="tb-tree__node" style="--lvl:2"><span class="tb-tree__sp"></span><em>📄</em><span>Button.tsx</span></div>
    <div class="tb-tree__node" style="--lvl:2"><span class="tb-tree__sp"></span><em>📄</em><span>Input.tsx</span></div>
    <div class="tb-tree__node" style="--lvl:1"><i class="tb-tree__chev tb-tree__chev--open">▶</i><em>📁</em><span>pages</span></div>
    <div class="tb-tree__node" style="--lvl:2"><span class="tb-tree__sp"></span><em>📄</em><span>index.tsx</span></div>
  </div>
</div>

常见问题

Tree 的键盘导航怎么做?

↑↓ 在可见节点间移动;→ 展开当前节点或进入子节点;← 折叠当前节点或回到父节点;Enter 切换选中;Home/End 跳到首尾可见节点。

大数据 Tree 怎么优化?

用虚拟滚动只渲染可视节点,或按需异步加载子节点(点击展开时才请求)。不要一次性渲染超过 500 个 DOM 节点。

常见搭配

同一页面里经常和「树形控件」一起出现的模式,可以收藏后用「组合收藏为整页提示词」一起交给 AI。

标签