# @dazl/tree-list 中文文档

规范地址：https://npmcn.com/package/%40dazl/tree-list/

版本：1\.0\.0
npm 元数据更新时间：2026-08-07T07:10:33.508Z
中文译文更新时间：2026-11-11T16:49:14.629Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40dazl/tree-list
原文对照：https://npmcn.com/package/%40dazl/tree-list/?lang=original
项目主页：https://github.com/dazl-dev/tree-list#readme
源码仓库：https://github.com/dazl-dev/tree-list

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：158 kB，91 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：react ^17\.0\.0 \|\| ^18\.0\.0 \|\| ^19\.0\.0，react-dom ^17\.0\.0 \|\| ^18\.0\.0 \|\| ^19\.0\.0
- 首次发布：2025-08-27T20:05:38.103Z
- 最新版本发布：2026-05-10T10:51:20.780Z
- 近 30 天下载量：10007（2026-10-12 至 2026-11-10，npm 官方下载统计）
- 已发布版本数：3（近 12 个月 2 个）

## 中文简介

用于新建树和虚拟化列表的灵活反应组件库

## 安装

```sh
npm install @dazl/tree-list
```

也可以使用：`pnpm add @dazl/tree-list`、`yarn add @dazl/tree-list`、`bun add @dazl/tree-list`

## README

# 反应树列表

一个灵活且能表演的React组件库,用于构建树,列表,以及多选取支持的虚拟可滚动视图.

## 安装

```bash
npm install @dazl/tree-list
# or
yarn add @dazl/tree-list
# or
pnpm add @dazl/tree-list
```

## 特征

-   🌲 **树形视图**: 有相撞节点的分级树构件
-   📋 **列表**: 带有键盘导航和选择的简单列表组件
-   🔄 **滚动列表**: 高效渲染大数据集的虚拟列表
-   ⌨️ **键盘导航**: 全键盘导航支持
-   ✅ **多选**: 支持使用修改键选择和多选择区域
-   🔍 **虚拟化**: 只渲染可见的性能项目
-   📱 **响应**: 具有横向和纵向布局的工作

## 构成部分

### 列表

一个带有选择和键盘导航的基本列表组件.

```tsx
import { List } from '@dazl/tree-list';
import type { ListItem } from '@dazl/tree-list';

interface ItemData {
  id: string;
  title: string;
}

const items = [
  { id: '1', title: 'Item 1' },
  { id: '2', title: 'Item 2' },
  { id: '3', title: 'Item 3' },
];

const ItemRenderer = ({ id, data, isFocused, isSelected }: ListItem<ItemData>) => (
  <div 
    data-id={id}
    style={{
      background: isSelected ? 'lightblue' : 'white',
      border: isFocused ? '1px solid blue' : '1px solid transparent',
      padding: '8px',
    }}
  >
    {data.title}
  </div>
);

function MyList() {
  const [selectedIds, setSelectedIds] = useState({ ids: [] });
  const [focusedId, setFocusedId] = useState();
  
  return (
    <List
      items={items}
      getId={(item) => item.id}
      ItemRenderer={ItemRenderer}
      selectedIds={selectedIds}
      setSelectedIds={setSelectedIds}
      focusedId={focusedId}
      setFocusedId={setFocusedId}
    />
  );
}
```

### 滚动列表

用于高效渲染大数据集的虚拟列表.

```tsx
import { ScrollList } from '@dazl/tree-list/scroll-list';

function MyScrollList() {
  const [selectedIds, setSelectedIds] = useState({ ids: [] });
  const [focusedId, setFocusedId] = useState();
  
  return (
    <ScrollList
      items={manyItems}
      getId={(item) => item.id}
      ItemRenderer={ItemRenderer}
      selectedIds={selectedIds}
      setSelectedIds={setSelectedIds}
      focusedId={focusedId}
      setFocusedId={setFocusedId}
      scrollListContainerProps={{ 
        style: { 
          height: '500px',
          overflow: 'auto'
        } 
      }}
      extraRenderSize={1}
      scrollToFocused
    />
  );
}
```

### 树

带有可折叠节点的分级树构件 .

```tsx
import { Tree } from '@dazl/tree-list/tree';
import type { TreeItemProps } from '@dazl/tree-list';

interface TreeItemData {
  id: string;
  name: string;
  children: TreeItemData[];
}

const TreeItemRenderer = ({ 
  id, 
  data, 
  isSelected, 
  isFocused, 
  isOpen, 
  hasChildren, 
  indent, 
  open, 
  close 
}: TreeItemProps<TreeItemData>) => (
  <div
    data-id={id}
    style={{
      paddingLeft: `${indent * 20}px`,
      background: isSelected ? 'lightblue' : 'white',
      border: isFocused ? '1px solid blue' : '1px solid transparent',
    }}
  >
    {hasChildren && (
      <button onClick={isOpen ? close : open}>
        {isOpen ? '▼' : '►'}
      </button>
    )}
    {data.name}
  </div>
);

function MyTree() {
  const [selectedIds, setSelectedIds] = useState({ ids: [] });
  const [focusedId, setFocusedId] = useState();
  const [openItemIds, setOpenItemIds] = useState(['root']);
  
  return (
    <Tree
      data={treeData}
      getChildren={(item) => item.children}
      getId={(item) => item.id}
      ItemRenderer={TreeItemRenderer}
      selectedIds={selectedIds}
      setSelectedIds={setSelectedIds}
      focusedId={focusedId}
      setFocusedId={setFocusedId}
      openItemIds={openItemIds}
      setOpenItemIds={setOpenItemIds}
    />
  );
}
```

## API 文档

### 列表选项

| Prop | 类型 | 说明 |
| --- | --- | --- |
| `items` | `T[]` | 拟制作的项目组 |
| `getId` | `(item: T) => string` | 从项目中提取唯一 ID 的函数 |
| `ItemRenderer` | `React.FC<ListItem<T>>` | 构成每个项目的构成部分 |
| `selectedIds` | `{ ids: string[], lastSelectedId?: string }` | 当前选中的项目 IDs |
| `setSelectedIds` | `(selection: ListSelection) => void` | 回调以更新选择 |
| `focusedId` | `string | undefined` | 目前重点讨论的项目d |
| `setFocusedId` | `(id?: string) => void` | 回调以更新焦点 |
| `enableKeyboard` | `boolean` | 启用键盘导航( 默认: 真) |
| `enableMultiselect` | `boolean` | 启用多个选择( 默认: 真) |
| `style` | `React.CSSProperties` | 列表容器的自定义样式 |
| `listRef` | `React.RefObject<HTMLDivElement>` | 列表容器的参考文献 |
| `listContainerProps` | `React.HTMLAttributes<HTMLDivElement>` | 列表容器的额外道具 |

更详细的类型定义和附加组件参见源代码.

## 许可证

麻省理工学院

## 常见问题

### @dazl/tree-list 是什么？

用于新建树和虚拟化列表的灵活反应组件库

### 如何安装 @dazl/tree-list？

在项目目录运行 npm install @dazl/tree-list，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：react（^17\.0\.0 \|\| ^18\.0\.0 \|\| ^19\.0\.0）、react-dom（^17\.0\.0 \|\| ^18\.0\.0 \|\| ^19\.0\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @dazl/tree-list 支持 TypeScript 吗？

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

### @dazl/tree-list 支持 ESM 还是 CommonJS？

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

### @dazl/tree-list 可以商用吗？

@dazl/tree-list 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @dazl/tree-list 的下载量有多少？

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

### @dazl/tree-list 还在维护吗？

最新版本 1\.0\.0 发布于 2026/05/10（6 个月前）；至今共发布 3 个版本，其中过去 12 个月发布了 2 个；首次发布于 2025/08/28。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

