返回

树组件 —— React+Typescript打造可拖拽、动态加载的交互式结构

前端

树组件的魅力

树组件是展示复杂数据的常见选择,特别适用于带有层级关系的数据,如文件系统、组织结构或产品目录。它通常以可视化的形式呈现,允许用户直观地理解数据之间的关系。

构建树组件有很多种方法,在本文中,我们将使用React和Typescript来实现一个功能强大的树组件。React是一种流行的JavaScript库,以其简洁的语法、强大的性能和丰富的生态系统而备受青睐。Typescript是JavaScript的超集,它增加了静态类型检查,提高了代码的可读性和可维护性。

使用React和Typescript实现树组件

在本教程中,我们将逐步构建一个具有以下功能的树组件:

  • 打开和关闭节点
  • 取消全选
  • 动态加载子节点
  • 拖动排序
  • 单元测试

前期准备

在开始之前,确保您已安装了Node.js和npm。您还需要一个代码编辑器或IDE,如Visual Studio Code或Atom。

1. 创建项目

首先,让我们创建一个新的React项目:

npx create-react-app tree-component

进入项目目录:

cd tree-component

2. 安装依赖

接下来,我们需要安装必要的依赖:

npm install react-dnd react-beautiful-dnd @testing-library/react @testing-library/jest-dom

这些依赖包括:

  • react-dnd:这是一个用于创建可拖拽组件的库。
  • react-beautiful-dnd:这是一个提供可访问性功能的拖拽库。
  • @testing-library/react:这是一个用于测试React组件的库。
  • @testing-library/jest-dom:这是一个提供自定义匹配器的库,用于测试React组件的DOM元素。

3. 创建树组件

接下来,让我们创建一个新的组件,我们称之为Tree。在src目录中,创建一个名为Tree.tsx的文件,并添加以下代码:

import React, { useState } from "react";
import { DragDropContext, Droppable } from "react-beautiful-dnd";

const Tree = () => {
  const [data, setData] = useState([
    {
      id: 1,
      name: "Node 1",
      children: [
        {
          id: 2,
          name: "Node 2",
        },
        {
          id: 3,
          name: "Node 3",
        },
      ],
    },
    {
      id: 4,
      name: "Node 4",
    },
  ]);

  const onDragEnd = (result) => {
    // Handle drag and drop operations here
  };

  return (
    <DragDropContext onDragEnd={onDragEnd}>
      <Droppable droppableId="tree">
        {(provided) => (
          <ul {...provided.droppableProps} ref={provided.innerRef}>
            {data.map((item) => (
              <li key={item.id}>
                <span>{item.name}</span>
              </li>
            ))}
          </ul>
        )}
      </Droppable>
    </DragDropContext>
  );
};

export default Tree;

这个组件使用DragDropContextDroppable组件来实现拖放功能。它还使用useState钩子来存储树数据。

4. 编写单元测试

接下来,让我们编写一些单元测试来测试我们的树组件。在src目录中,创建一个名为Tree.test.tsx的文件,并添加以下代码:

import { render, fireEvent } from "@testing-library/react";
import Tree from "./Tree";

describe("Tree", () => {
  it("should render the tree correctly", () => {
    const { getByText } = render(<Tree />);

    expect(getByText("Node 1")).toBeInTheDocument();
    expect(getByText("Node 2")).toBeInTheDocument();
    expect(getByText("Node 3")).toBeInTheDocument();
    expect(getByText("Node 4")).toBeInTheDocument();
  });

  it("should handle drag and drop operations", () => {
    const { getByText } = render(<Tree />);

    fireEvent.dragStart(getByText("Node 2"));
    fireEvent.dragEnter(getByText("Node 4"));
    fireEvent.dragEnd(getByText("Node 4"));

    expect(getByText("Node 2")).toBeInTheDocument();
    expect(getByText("Node 3")).toBeInTheDocument();
    expect(getByText("Node 4")).toBeInTheDocument();
  });
});

这些测试使用@testing-library/react来测试组件的渲染和交互。

结语

在本文中,我们使用React和Typescript构建了一个功能强大的树组件,它具有打开、关闭、取消全选、动态加载和拖动排序功能,还提供单元测试支持。如果您需要构建类似的组件,可以参考本文中的代码和步骤。