Home

Awesome

tree-component

Dependency Status devDependency Status Build Status: Windows Github CI npm version Downloads type-coverage

A reactjs and vuejs tree component.

features

link css

<link rel="stylesheet" href="./node_modules/tree-component/dist/tree.min.css" />

vuejs component

gzip size

npm i tree-vue-component

import { Node, Tree } from "tree-vue-component";

app.component('node', Node)
app.component('tree', Tree)

or

<script src="./node_modules/vue/dist/vue.min.js"></script>
<script src="./node_modules/tree-vue-component/dist/tree-vue-component.min.js"></script>
<tree :data="data"
    @toggle="toggle($event)"
    @change="change($event)">
</tree>

the online demo: https://plantain-00.github.io/tree-component/packages/vue/demo

reactjs component

gzip size

npm i tree-react-component

import { Tree } from "tree-react-component";

or

<script src="./node_modules/react/umd/react.production.min.js"></script>
<script src="./node_modules/react-dom/umd/react-dom.production.min.js"></script>
<script src="./node_modules/tree-react-component/dist/tree-react-component.min.js"></script>
<Tree data={data}
    toggle={this.toggle}
    change={this.change}>
</Tree>

the online demo: https://plantain-00.github.io/tree-component/packages/react/demo

properties and events of the component

nametypedescription
dataTreeData[]the data of the tree
checkboxboolean?show checkbox for node
draggableboolean?whether the node is draggable
nodotsboolean?the tree will have no dots
sizestring?can also be "large", "small"
themestring?can be "default"(the default theme), "dark"
dropAllowed(dropData: common.DropData) => booleanoptional, a function to show whether the drop action is allowed
zindexnumber?z-index of contextmenu
preidstring?the node id prefix, eg: if preid = "test_", then a node's id can be test_1-2-3
toggle(eventData: EventData) => voidtriggered when opening or closing a node
change(eventData: EventData) => voidtriggered when selecting or deselecting a node
drop(dropData: DropData) => voidtriggered when drag a node, then drop it
dragTargetDragTargetDatadrag target, used when drag and drop between different tree
changeDragTarget(dragTarget: DragTargetData) => voidtriggered when drag target changed

tree data structure

type TreeData<T = any> = {
    text?: string;
    value?: T; // anything attached to the node
    icon?: string | false; // the icon class string, or no icon if is false
    state: TreeNodeState;
    children?: TreeData<T>[];
    contextmenu?: string | Function; // the contextmenu component, props: (data: ContextMenuData<T>)
    component?: string | Function; // the node component, props: (data: TreeData<T>)
};

type TreeNodeState = {
    opened: boolean; // whether the node show its children
    selected: boolean;
    disabled: boolean; // disabled node can not be selected and deselected
    loading: boolean; // show the loading icon, usually used when loading child nodes
    highlighted: boolean;
    openable: boolean; // can open or close even no children
    dropPosition: DropPosition;
    dropAllowed: boolean; // whether the drop action is allowed
};

const enum DropPosition {
    empty,
    up,
    inside,
    down,
}
// For javascript users, the enum type can not imported from the package,
// it is just number(0,1,2,3 in order), so you can use this instead:
const DropPosition = {
    empty: 0,
    up: 1,
    inside: 2,
    down: 3
}

event data structure

type EventData<T = any> = {
    data: TreeData<T>; // the data of the node that triggered the event
    path: number[]; // the index array of path from root to the node that triggered the event
};

drop data structure

type DropData<T = any> = {
    sourceData: TreeData<T>;
    sourcePath: number[];
    sourceRoot: TreeData<T>[];
    targetData: TreeData<T>;
    targetPath: number[];
};

contextmenu data structure

type ContextMenuData<T = any> = {
    data: TreeData<T>;
    path: number[];
    root: TreeData<T>[];
    parent?: any;
};

drag target data structure

type DragTargetData<T = any> = {
  root: TreeData<T>[];
  target: HTMLElement;
} | null

changelogs

# v5
// vue 2
import 'tree-vue-component'

# v6
// vue 3
import { Node, Tree } from "tree-vue-component"

app.component('node', Node)
app.component('tree', Tree)
# v4
npm i tree-component

# v5
npm i tree-vue-component
npm i tree-react-component
npm i tree-angular-component
// v4
import "tree-component/vue";
import { Tree } from "tree-component/react";
import { TreeModule } from "tree-component/angular";

// v5
import "tree-vue-component";
import { Tree } from "tree-react-component";
import { TreeModule } from "tree-angular-component";
// v4
<link rel="stylesheet" href="./node_modules/tree-component/tree.min.css" />

// v5
<link rel="stylesheet" href="./node_modules/tree-component/dist/tree.min.css" />
// v3 angular AOT:
import { TreeModule } from "tree-component/angular";

// v4 angular AOT:
import { TreeModule } from "tree-component/aot/angular";
// v3
import "tree-component/vue";
import { TreeComponent, NodeComponent } from "tree-component/angular";
import { Tree } from "tree-component/react";

// v2
import "tree-component/dist/vue";
import { TreeComponent, NodeComponent } from "tree-component/dist/angular";
import { Tree } from "tree-component/dist/react";
// v2:
<link rel="stylesheet" href="./node_modules/tree-component/tree.min.css" />

// v1:
<link rel="stylesheet" href="./node_modules/jstree/dist/themes/default/style.min.css" />