@dazl/tree-list

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

A flexible React component library for building trees and lists with virtualization

原始使用文档
文档目录9 节
  1. Installation
  2. Features
  3. Components
  4. List
  5. ScrollList
  6. Tree
  7. API Documentation
  8. List Props
  9. License

React Tree List

A flexible and performant React component library for building trees, lists, and virtualized scrollable views with multi-selection support.

Installation

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

Features

  • 🌲 Tree View: Hierarchical tree component with collapsible nodes
  • 📋 List: Simple list component with keyboard navigation and selection
  • 🔄 ScrollList: Virtualized list for efficiently rendering large datasets
  • ⌨️ Keyboard Navigation: Full keyboard navigation support
  • ✅ Multi-selection: Support for range selection and multi-selection with modifier keys
  • 🔍 Virtualization: Render only visible items for performance
  • 📱 Responsive: Works with both horizontal and vertical layouts

Components

List

A basic list component with selection and keyboard navigation.

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

ScrollList

A virtualized list for efficiently rendering large datasets.

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

Tree

A hierarchical tree component with collapsible nodes.

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 Documentation

List Props

PropTypeDescription
itemsT[]Array of items to render
getId(item: T) => stringFunction to extract unique id from item
ItemRendererReact.FC<ListItem<T>>Component to render each item
selectedIds{ ids: string[], lastSelectedId?: string }Currently selected item ids
setSelectedIds(selection: ListSelection) => voidCallback to update selection
focusedIdstring | undefinedCurrently focused item id
setFocusedId(id?: string) => voidCallback to update focus
enableKeyboardbooleanEnable keyboard navigation (default: true)
enableMultiselectbooleanEnable multiple selection (default: true)
styleReact.CSSPropertiesCustom styles for the list container
listRefReact.RefObject<HTMLDivElement>Ref for the list container
listContainerPropsReact.HTMLAttributes<HTMLDivElement>Additional props for list container

See the source code for more detailed type definitions and additional components.

License

MIT

版本与发布记录

@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 是什么?

A flexible React component library for building trees and lists with virtualization

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