@dazl/tree-list

中文文档
1.0.0发布于 2026/05/10MITTypeScriptESM + CJS零依赖近 30 天下载 1万

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

中文使用文档
文档目录9 节
  1. 安装
  2. 特征
  3. 构成部分
  4. 列表
  5. 滚动列表
  6. 树
  7. API 文档
  8. 列表选项
  9. 许可证

反应树列表

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

安装

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

特征

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

构成部分

列表

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

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}
    />
  );
}

滚动列表

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

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
    />
  );
}

树

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

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

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

许可证

麻省理工学院

版本与发布记录

@dazl/tree-list 共发布 3 个版本,首次发布于 2025/08/28;过去 12 个月发布了 2 个版本。

版本发布日期距今
1.0.0latest2026/05/106 个月前
0.1.92026/02/029 个月前
0.1.82025/08/281.2 年前

关于 @dazl/tree-list 的常见问题

@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 和提交记录判断。