react-d3-tree vs react-arborist vs react-treebeard
React Tree Visualization Libraries Comparison
1 Year
react-d3-treereact-arboristreact-treebeardSimilar Packages:
What's React Tree Visualization Libraries?

Tree visualization libraries in React are specialized tools designed to help developers create interactive and dynamic tree structures. These libraries provide various features such as drag-and-drop functionality, customizable nodes, and data binding capabilities, making it easier to represent hierarchical data. They cater to different use cases, from simple tree displays to complex data visualizations, enabling developers to choose the right tool based on their specific needs and project requirements.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-d3-tree142,3411,126121 kB1443 days agoMIT
react-arborist53,5833,175342 kB11318 days agoMIT
react-treebeard37,2031,688-726 years agoMIT
Feature Comparison: react-d3-tree vs react-arborist vs react-treebeard

Customization

  • react-d3-tree:

    react-d3-tree provides a range of customization options primarily focused on visual aspects. You can customize the appearance of nodes and links, as well as the overall layout of the tree. However, it may not offer as much flexibility in terms of node interaction compared to react-arborist.

  • react-arborist:

    react-arborist offers extensive customization options, allowing developers to define how nodes are rendered, styled, and interacted with. You can easily create custom node components and manage complex interactions, making it suitable for applications with unique design requirements.

  • react-treebeard:

    react-treebeard is designed for simplicity and ease of use, providing basic customization options. While it allows for some styling and node rendering adjustments, it may not be as flexible as the other two libraries for complex use cases.

Performance

  • react-d3-tree:

    react-d3-tree leverages D3.js for rendering, which can be performance-intensive for very large trees. While it excels in visual representation, developers should be cautious about performance when handling large datasets and consider optimizations if necessary.

  • react-arborist:

    react-arborist is optimized for performance, especially when dealing with large datasets. It implements efficient rendering techniques and supports virtual scrolling, ensuring smooth interactions even with extensive tree structures.

  • react-treebeard:

    react-treebeard is lightweight and performs well for smaller trees. However, as the tree grows in size and complexity, performance may become an issue, and it may not handle large datasets as efficiently as react-arborist.

Interactivity

  • react-d3-tree:

    react-d3-tree offers basic interactivity, primarily focusing on visual transitions and animations. While it allows for some interaction, it may not provide the same level of functionality as react-arborist for complex user interactions.

  • react-arborist:

    react-arborist supports advanced interactivity features such as drag-and-drop, node expansion/collapse, and dynamic loading of child nodes. This makes it an excellent choice for applications that require rich user interactions with the tree structure.

  • react-treebeard:

    react-treebeard provides simple interactivity, such as node expansion and selection. However, it lacks advanced features like drag-and-drop, making it less suitable for applications that require extensive user interaction.

Ease of Use

  • react-d3-tree:

    react-d3-tree is relatively easy to use for those familiar with D3.js. It provides a straightforward API for creating tree visualizations, making it accessible for developers looking to integrate data-driven graphics into their applications.

  • react-arborist:

    react-arborist has a steeper learning curve due to its extensive features and customization options. However, once mastered, it offers powerful capabilities for creating complex tree structures.

  • react-treebeard:

    react-treebeard is the easiest to use among the three, with a simple API and minimal setup required. It is ideal for quick implementations and projects that do not require extensive customization.

Documentation and Community Support

  • react-d3-tree:

    react-d3-tree has good documentation, especially for users familiar with D3.js. However, the community support may not be as extensive as that of react-arborist, which could pose challenges for new users.

  • react-arborist:

    react-arborist has comprehensive documentation and an active community, providing ample resources for developers to learn and troubleshoot issues. This support can significantly ease the development process.

  • react-treebeard:

    react-treebeard has decent documentation, but the community support is relatively smaller compared to the other two libraries. This may limit the availability of resources and examples for developers.

How to Choose: react-d3-tree vs react-arborist vs react-treebeard
  • react-d3-tree:

    Opt for react-d3-tree if your project involves visualizing hierarchical data with a focus on D3.js integration. This library excels in creating visually appealing and interactive tree diagrams, making it suitable for data-driven applications where aesthetics and data representation are crucial.

  • react-arborist:

    Choose react-arborist if you need a highly customizable tree component that supports complex interactions like drag-and-drop, dynamic loading of nodes, and extensive customization options for rendering nodes. It is ideal for applications that require a robust and flexible tree structure with a focus on performance and usability.

  • react-treebeard:

    Select react-treebeard if you are looking for a simple and lightweight solution for rendering tree structures. It is easy to use and offers basic features for displaying trees, making it a good choice for projects that require straightforward tree visualization without the need for extensive customization.

README for react-d3-tree

React D3 Tree

build status coverage status npm package npm package: downloads monthly npm package: minzipped size npm package: types code style: prettier

👾 Playground

📖 API Documentation (v3)

React D3 Tree is a React component that lets you represent hierarchical data (e.g. family trees, org charts, file directories) as an interactive tree graph with minimal setup, by leveraging D3's tree layout.

Upgrading from v1? Check out the v2 release notes.

Legacy v1 docs

Contents

Installation

npm i --save react-d3-tree

Usage

import React from 'react';
import Tree from 'react-d3-tree';

// This is a simplified example of an org chart with a depth of 2.
// Note how deeper levels are defined recursively via the `children` property.
const orgChart = {
  name: 'CEO',
  children: [
    {
      name: 'Manager',
      attributes: {
        department: 'Production',
      },
      children: [
        {
          name: 'Foreman',
          attributes: {
            department: 'Fabrication',
          },
          children: [
            {
              name: 'Worker',
            },
          ],
        },
        {
          name: 'Foreman',
          attributes: {
            department: 'Assembly',
          },
          children: [
            {
              name: 'Worker',
            },
          ],
        },
      ],
    },
  ],
};

export default function OrgChartTree() {
  return (
    // `<Tree />` will fill width/height of its container; in this case `#treeWrapper`.
    <div id="treeWrapper" style={{ width: '50em', height: '20em' }}>
      <Tree data={orgChart} />
    </div>
  );
}

Props

For details on all props accepted by Tree, check out the TreeProps reference docs.

The only required prop is data, all other props on Tree are optional/pre-defined (see "Default value" on each prop definition).

Working with the default Tree

react-d3-tree provides default implementations for Tree's nodes & links, which are intended to get you up & running with a working tree quickly.

This section is focused on explaining how to provide data, styles and event handlers for the default Tree implementation.

Need more fine-grained control over how nodes & links appear/behave? Check out the Customizing the Tree section below.

Providing data

By default, Tree expects each node object in data to implement the RawNodeDatum interface:

interface RawNodeDatum {
  name: string;
  attributes?: Record<string, string | number | boolean>;
  children?: RawNodeDatum[];
}

The orgChart example in the Usage section above is an example of this:

  • Every node has at least a name. This is rendered as the node's primary label.
  • Some nodes have attributes defined (the CEO node does not). The key-value pairs in attributes are rendered as a list of secondary labels.
  • Nodes can have further RawNodeDatum objects nested inside them via the children key, creating a hierarchy from which the tree graph can be generated.

Styling Nodes

Tree provides the following props to style different types of nodes, all of which use an SVG circle by default:

  • rootNodeClassName - applied to the root node.
  • branchNodeClassName - applied to any node with 1+ children.
  • leafNodeClassName - applied to any node without children.

To visually distinguish these three types of nodes from each other by color, we could provide each with their own class:

/* custom-tree.css */

.node__root > circle {
  fill: red;
}

.node__branch > circle {
  fill: yellow;
}

.node__leaf > circle {
  fill: green;
  /* Let's also make the radius of leaf nodes larger */
  r: 40;
}
import React from 'react';
import Tree from 'react-d3-tree';
import './custom-tree.css';

// ...

export default function StyledNodesTree() {
  return (
    <div id="treeWrapper" style={{ width: '50em', height: '20em' }}>
      <Tree
        data={data}
        rootNodeClassName="node__root"
        branchNodeClassName="node__branch"
        leafNodeClassName="node__leaf"
      />
    </div>
  );
}

For more details on the className props for nodes, see the TreeProps reference docs.

Styling Links

Tree provides the pathClassFunc property to pass additional classNames to every link to be rendered.

Each link calls pathClassFunc with its own TreeLinkDatum and the tree's current orientation. Tree expects pathClassFunc to return a className string.

function StyledLinksTree() {
  const getDynamicPathClass = ({ source, target }, orientation) => {
    if (!target.children) {
      // Target node has no children -> this link leads to a leaf node.
      return 'link__to-leaf';
    }

    // Style it as a link connecting two branch nodes by default.
    return 'link__to-branch';
  };

  return (
    <Tree
      data={data}
      // Statically apply same className(s) to all links
      pathClassFunc={() => 'custom-link'}
      // Want to apply multiple static classes? `Array.join` is your friend :)
      pathClassFunc={() => ['custom-link', 'extra-custom-link'].join(' ')}
      // Dynamically determine which `className` to pass based on the link's properties.
      pathClassFunc={getDynamicPathClass}
    />
  );
}

For more details, see the PathClassFunction reference docs.

Event Handlers

Tree exposes the following event handler callbacks by default:

Note: Nodes are expanded/collapsed whenever onNodeClick fires. To prevent this, set the collapsible prop to false.
onNodeClick will still fire, but it will not change the target node's expanded/collapsed state.

Customizing the Tree

renderCustomNodeElement

The renderCustomNodeElement prop accepts a custom render function that will be used for every node in the tree.

Cases where you may find rendering your own Node element useful include:

  • Using a different SVG tag for your nodes (instead of the default <circle>) - Example (codesandbox.io)
  • Gaining fine-grained control over event handling (e.g. to implement events not covered by the default API) - Example (codesandbox.io)
  • Building richer & more complex nodes/labels by leveraging the foreignObject tag to render HTML inside the SVG namespace - Example (codesandbox.io)

pathFunc

The pathFunc prop accepts a predefined PathFunctionOption enum or a user-defined PathFunction.

By changing or providing your own pathFunc, you are able to change how links between nodes of the tree (which are SVG path tags under the hood) are drawn.

The currently available enums are:

  • diagonal (default)
  • elbow
  • straight
  • step

Want to see how each option looks? Try them out on the playground.

Providing your own pathFunc

If none of the available path functions suit your needs, you're also able to provide a custom PathFunction:

function CustomPathFuncTree() {
  const straightPathFunc = (linkDatum, orientation) => {
    const { source, target } = linkDatum;
    return orientation === 'horizontal'
      ? `M${source.y},${source.x}L${target.y},${target.x}`
      : `M${source.x},${source.y}L${target.x},${target.y}`;
  };

  return (
    <Tree
      data={data}
      // Passing `straight` function as a custom `PathFunction`.
      pathFunc={straightPathFunc}
    />
  );
}

For more details, see the PathFunction reference docs.

Development

Setup

To set up react-d3-tree for local development, clone the repo and follow the steps below:

# 1. Set up the library, create a reference to it for symlinking.
cd react-d3-tree
npm i
npm link

# 2. Set up the demo/playground, symlink to the local copy of `react-d3-tree`.
cd demo
npm i
npm link react-d3-tree

Tip: If you'd prefer to use your own app for development instead of the demo, simply run npm link react-d3-tree in your app's root folder instead of the demo's :)

Hot reloading

npm run build:watch

If you're using react-d3-tree/demo for development, open up another terminal window in the demo directory and call:

npm start

Contributors

A huge thank you to all the contributors, as well as users who have opened issues with thoughtful suggestions and feedback.