@cloud-ru/ds-tree

中文文档
1.0.45发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 6623

=============================================================================================================================================================================================================== (============================== (================.

中文使用文档
文档目录15 节
  1. Когда
  2. Анатомия
  3. 选择模式( 默认 — — — — — — )
  4. 大小( 默认) m (中文(简体) )
  5. 显示行( 默认) false (中文(简体) )
  6. 显示图标( 默认) true (中文(简体) )
  7. Установка
  8. Примеры
  9. Базовый
  10. Одиночный
  11. Множественный
  12. Кастомные
  13. Контекстные
  14. Асинхронная
  15. 道具

树

@cloud-ru/ds-tree -=YTET -伊甸园字幕组=- 翻译:.

-=YTET -伊甸园字幕组=- 翻译: {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.

Когда

  • =========================================================================================================================================================================================.
  • 面包屑 面包屑 面包屑.
  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 onDataLoad {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.

Когда не нужен:

  • 5 –20 элементов:
    • используйте List или Select。 。 。 .
  • 2–7 одного:
    • используйте Tabs。 。 。 .
  • 校对:Soup
    • используйте Stepper。 。 。 .

Анатомия

选择模式( 默认 — — — — — — )

  • undefined ——只读 ,узлы.
  • 'single' - один, рендерится, рендерится Radio 页:1 showToggle{\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}你觉得怎样.
  • 'multiple' множественный выбор Checkbox {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你说什么.

大小( 默认) m(中文(简体) )

  • s -=ytet -伊甸园字幕组=- 翻译:.
  • m - стандартная для админок админок админок.
  • l {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1} - {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1} - 时间轴:.

Текущая size соответствует 紧凑 缩略语compact/S=24px, (中文(简体) ), compact/M=32px, (中文(简体) ), compact/L=40px (原始内容存档于2018-09-21). rain-h. 密度 comfort (40/48/56px行-h) 26653:105451(中文(简体) ) не - \ API\ \ \ \ \ \ density。 。 。 音轨: QQ constants.ts осью DENSITY {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢 density-size-icon-* на.

显示行( 默认) false(中文(简体) )

Полосы └─{\fn华文仿宋\fs16\1cHD1D1D1}我... (原始内容存档于2016-10-12). QQQ (3++++++++++++++++++).

显示图标( 默认) true(中文(简体) )

(原始内容存档于2018-09-28). Folders/ file--иконки. Отключай,если也.

Установка

pnpm add @cloud-ru/ds-tree
import { SELECTION_MODE, SIZE, Tree } from '@cloud-ru/ds-tree'

Примеры

Базовый

只读 \\ \ \ \ 扩展上

import { Tree, TreeNodeProps } from '@cloud-ru/ds-tree';
import { useState } from 'react';

const DATA: TreeNodeProps[] = [
  {
    id: 'fruits',
    title: 'Fruits',
    nested: [
      { id: 'apple', title: 'Apple' },
      { id: 'banana', title: 'Banana' },
      {
        id: 'citrus',
        title: 'Citrus',
        nested: [
          { id: 'orange', title: 'Orange' },
          { id: 'lemon', title: 'Lemon' },
        ],
      },
    ],
  },
  {
    id: 'vegetables',
    title: 'Vegetables',
    nested: [
      { id: 'carrot', title: 'Carrot' },
      { id: 'potato', title: 'Potato' },
    ],
  },
];

export function Basic() {
  const [expanded, setExpanded] = useState<string[]>(['fruits']);

  return <Tree data={DATA} expandedNodes={expanded} onExpand={setExpanded} showLines />;
}

Одиночный

选择模式=单一 + 显示 托格勒: + 电台 + QQ

import { SELECTION_MODE, Tree, TreeNodeProps } from '@cloud-ru/ds-tree';
import { useState } from 'react';

const DATA: TreeNodeProps[] = [
  {
    id: 'docs',
    title: 'Documents',
    nested: [
      { id: 'specs', title: 'Specs.pdf' },
      { id: 'budget', title: 'Budget.xlsx' },
      { id: 'roadmap', title: 'Roadmap.md' },
    ],
  },
  {
    id: 'media',
    title: 'Media',
    nested: [
      { id: 'logo', title: 'Logo.svg' },
      { id: 'hero', title: 'Hero.png' },
    ],
  },
];

export function SingleSelect() {
  const [selected, setSelected] = useState<string | undefined>('specs');
  const [expanded, setExpanded] = useState<string[]>(['docs', 'media']);

  return (
    <Tree
      data={DATA}
      selectionMode={SELECTION_MODE.Single}
      selected={selected}
      onSelect={setSelected}
      expandedNodes={expanded}
      onExpand={setExpanded}
      showToggle
      showLines
    />
  );
}

Множественный

选择模式=多点: 复选框 QQ, QQ- 不确定

import { SELECTION_MODE, Tree, TreeNodeProps } from '@cloud-ru/ds-tree';
import { useState } from 'react';

const DATA: TreeNodeProps[] = [
  {
    id: 'compute',
    title: 'Compute',
    nested: [
      { id: 'vm', title: 'Virtual machines' },
      { id: 'k8s', title: 'Kubernetes' },
      { id: 'serverless', title: 'Serverless' },
    ],
  },
  {
    id: 'storage',
    title: 'Storage',
    nested: [
      { id: 's3', title: 'Object storage' },
      { id: 'block', title: 'Block storage' },
    ],
  },
];

export function MultiSelect() {
  const [selected, setSelected] = useState<string[]>(['vm', 's3']);
  const [expanded, setExpanded] = useState<string[]>(['compute', 'storage']);

  return (
    <Tree
      data={DATA}
      selectionMode={SELECTION_MODE.Multiple}
      selected={selected}
      onSelect={setSelected}
      expandedNodes={expanded}
      onExpand={setExpanded}
      showLines
    />
  );
}

Кастомные

图标 , 扩展Icon/collapsedIcon

import { FileSVG, FolderOpenSVG, FolderSVG } from '@cloud-ru/ds-icons/interface/system';
import { Tree, TreeNodeProps } from '@cloud-ru/ds-tree';
import { useState } from 'react';

const DATA: TreeNodeProps[] = [
  {
    id: 'src',
    title: 'src',
    expandedIcon: <FolderOpenSVG />,
    collapsedIcon: <FolderSVG />,
    nested: [
      { id: 'app.tsx', title: 'App.tsx', icon: <FileSVG /> },
      { id: 'main.tsx', title: 'main.tsx', icon: <FileSVG /> },
      {
        id: 'components',
        title: 'components',
        expandedIcon: <FolderOpenSVG />,
        collapsedIcon: <FolderSVG />,
        nested: [
          { id: 'button.tsx', title: 'Button.tsx', icon: <FileSVG /> },
          { id: 'tree.tsx', title: 'Tree.tsx', icon: <FileSVG /> },
        ],
      },
    ],
  },
];

export function WithIcons() {
  const [expanded, setExpanded] = useState<string[]>(['src', 'components']);

  return <Tree data={DATA} expandedNodes={expanded} onExpand={setExpanded} showLines />;
}

Контекстные

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}节点动作 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}盘旋/聚焦

import { Tree, TreeNodeProps } from '@cloud-ru/ds-tree';
import { useState } from 'react';

const DATA: TreeNodeProps[] = [
  {
    id: 'project',
    title: 'Project Alpha',
    nested: [
      { id: 'overview.md', title: 'overview.md' },
      { id: 'changelog.md', title: 'changelog.md' },
    ],
  },
  { id: 'project-beta', title: 'Project Beta', nested: [{ id: 'todo.md', title: 'todo.md' }] },
];

export function WithActions() {
  const [expanded, setExpanded] = useState<string[]>(['project']);
  const [lastItemAction, setLastItemAction] = useState<string>('');

  const nodeActions = (node: TreeNodeProps) => [
    { id: 'rename', content: { label: `Rename ${node.id}` }, onClick: () => setLastItemAction(`rename ${node.id}`) },
    { id: 'delete', content: { label: 'Delete' }, onClick: () => setLastItemAction(`delete ${node.id}`) },
  ];

  return (
    <>
      <Tree data={DATA} expandedNodes={expanded} onExpand={setExpanded} nodeActions={nodeActions} showLines />
      <small>Last clicked item action: {lastItemAction || '—'}</small>
    </>
  );
}

Асинхронная

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你应该知道

import { Tree, TreeNodeProps } from '@cloud-ru/ds-tree';
import { useState } from 'react';

const INITIAL: TreeNodeProps[] = [
  { id: 'region-eu', title: 'EU region', nested: [] },
  { id: 'region-ru', title: 'RU region', nested: [] },
];

export function AsyncLoad() {
  const [data, setData] = useState(INITIAL);
  const [expanded, setExpanded] = useState<string[]>([]);

  const onDataLoad = async (node: TreeNodeProps) => {
    await new Promise(r => setTimeout(r, 600));
    setData(prev =>
      prev.map((item): TreeNodeProps => {
        if (item.id !== node.id) return item;
        return {
          id: item.id,
          title: item.title as string,
          nested: [
            { id: `${item.id}-vm1`, title: 'vm-prod-01' },
            { id: `${item.id}-vm2`, title: 'vm-prod-02' },
            { id: `${item.id}-vm3`, title: 'vm-staging-01' },
          ],
        };
      }),
    );
  };

  return <Tree data={data} expandedNodes={expanded} onExpand={setExpanded} onDataLoad={onDataLoad} showLines />;
}

道具

树道

Prop类型默认说明
classNamestring—— 说支助科
dataTreeNodeProps—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
data-test-idstring—— 说
expandedNodesTreeNodeId—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
nodeActions((node: TreeNodeProps) => Item[])—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
onDataLoad((node: TreeNodeProps) => Promise<unknown>)—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
onExpand((expandedKeys: string[], node: TreeNodeProps) => void)—— 说Колбэк/закрытии
onNodeClickOnNodeClick—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
onSelect((selectedKeys: string[], node: TreeNodeProps) => void) | ((selectedKey: string, node: TreeNodeProps) => void)—— 说说吧

- При 选择模式=:Multiple - возвращает массив

- При 选择模式=:Single - возвращает строку
parentActions((node: TreeNodeProps) => Item[])—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
selectedstring | string[]—— 说说吧

- При 选择模式=:Multiple - принимает массив

- При 选择模式=:Single - принимает строку
selectionMode"multiple" | "single"—— 说说吧

- 说吧 Single - одиночный выбор

- 说吧 Multi - множественный выбор

- 说吧 undefined - без выбора
showIconsbooleantrue{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
showLinesbooleantrue{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
showToggleboolean—— 说
size"l" | "m" | "s"mQQ (图像变体) size) (中文(简体) ).
titleMaxLinesnumber1{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.
(原始内容存档于2016-10-12). QQ 1 перенос; строка.
  • OnNodeClick =: (node: TreeNodeProps, e: MouseEvent) => void

  • Size =: "l" | "m" | "s"

  • TreeNodeId =: string

  • TreeNodeProps =: ChildTreeNode | ParentTreeNode

版本与发布记录

@cloud-ru/ds-tree 共发布 176 个版本,首次发布于 2026/08/18;过去 12 个月发布了 176 个版本。

版本发布日期距今
1.0.45latest2026/11/11今天
1.0.45-preview-e8fe6b56.0preview2026/11/11今天
1.0.45-preview-c0e895ed.02026/11/11今天
1.0.45-preview-90b10112.02026/11/11今天
1.0.45-preview-445f2191.02026/11/111 天前
1.0.45-preview-fd7dd437.02026/11/101 天前

关于 @cloud-ru/ds-tree 的常见问题

@cloud-ru/ds-tree 是什么?

=============================================================================================================================================================================================================== (============================== (================.

如何安装 @cloud-ru/ds-tree?

在项目目录运行 npm install @cloud-ru/ds-tree,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-tree 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-tree 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-tree 可以商用吗?

@cloud-ru/ds-tree 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-tree 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-tree 在 2026/10/10 – 2026/11/08 这 30 天内被下载 6,623 次,日均约 221 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-tree 还在维护吗?

最新版本 1.0.45 发布于 2026/11/11(今天);至今共发布 176 个版本,其中过去 12 个月发布了 176 个;首次发布于 2026/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。