react-simple-tree-menu v1.0.0
React Simple Tree Menu
Inspired by Downshift, a simple, data-driven, light-weight React Tree Menu component that:
- does not depend on any UI framework
- fully customizable with
render props
andcontrol props
- allows search
Check Storybook Demo.
Usage
Install with the following command in your React app:
npm i react-simple-tree-menu
// or
yarn add react-simple-tree-menu
To generate a TreeMenu
, you need to provide data in the following structure.
// as an array
const treeData = [
{
key: 'first-level-node-1',
label: 'Node 1 at the first level',
..., // any other props you need, e.g. url
nodes: [
{
key: 'second-level-node-1',
label: 'Node 1 at the second level',
nodes: [
{
key: 'third-level-node-1',
label: 'Last node of the branch',
nodes: [] // you can remove the nodes property or leave it as an empty array
},
],
},
],
},
{
key: 'first-level-node-2',
label: 'Node 2 at the first level',
},
];
// or as an object
const treeData = {
'first-level-node-1': { // key
label: 'Node 1 at the first level',
index: 0, // decide the rendering order on the same level
..., // any other props you need, e.g. url
nodes: {
'second-level-node-1': {
label: 'Node 1 at the second level',
index: 0,
nodes: {
'third-level-node-1': {
label: 'Node 1 at the third level',
index: 0,
nodes: {} // you can remove the nodes property or leave it as an empty array
},
},
},
},
},
'first-level-node-2': {
label: 'Node 2 at the first level',
index: 1,
},
};
And then import TreeMenu
and use it. By default you only need to provide data
. You can have more control over the behaviors of the components using the provided API.
import TreeMenu from 'react-simple-tree-menu'
...
// Use the default minimal UI
<TreeMenu data={treeData} />
// Use any third-party UI framework
<TreeViewMenu
data={treeData}
onClickItem={({ key, label, ...props }) => {
this.navigate(props.url); // user defined prop
}}
debounceTime={125}>
{({ search, items }) => (
<>
<Input onChange={e => search(e.target.value)} placeholder="Type and search" />
<ListGroup>
{items.map(props => (
// You might need to wrap the third-party component to consume the props
// check the story as an example
// https://github.com/iannbing/react-simple-tree-menu/blob/master/stories/index.stories.js
<ListItem {...props} />
))}
</ListGroup>
</>
)}
</TreeViewMenu>
API
TreeViewMenu
props | description | type | default |
---|---|---|---|
data | Data that defines the structure of the tree. You can nest it as many levels as you want, but note that it might cause performance issue. | {string:TreeNode} | TreeNode[] | - |
activeKey | the node matching this key will be highlighted | string | '' |
onClickItem | A callback function that defines the behavior when user clicks on an node | (Item): void | console.warn |
debounceTime | debounce time for searching | number | 125 |
openNodes | you can pass an array of node names to make the branches open | string[] | null |
children | a render props that provdes two props: search and items | (ChildrenProps) => React.ReactNode | - |
TreeNode
props | description | type | default |
---|---|---|---|
key | Node name | string | - |
label | the rendered text of a Node | string | React.ReactNode | '' |
index | a number that defines the rendering order of this node on the same level; this is not needed if data is TreeNode[] | number | - |
nodes | a node without this property means that it is the last child of its branch | {string:TreeNode} | TreeNode[] | - |
Item
props | description | type | default |
---|---|---|---|
hasNodes | if a TreeNode is the last node of its branch | boolean | false |
isOpen | if it is showing its children | boolean | false |
level | the level of the current node (root is zero) | number | 0 |
key | key of a TreeNode | string | - |
label | TreeNode label | string | React.ReactNode | - |
...other | User defined props | {string: any} | - |
ChildrenProps
props | description | type | default |
---|---|---|---|
search | A function that takes a string to filter the label of the item | (value: string) => void | - |
items | An array of TreeMenuItem | TreeMenuItem[] | [] |
TreeMenuItem
props | description | type | default |
---|---|---|---|
hasNodes | if a TreeNode is the last node of its branch | boolean | false |
isOpen | if it is showing its children | boolean | false |
level | the level of the current node (root is zero) | number | 0 |
key | key of a TreeNode | string | - |
label | TreeNode label | string | React.ReactNode | - |
active | if current node is being selected | boolean | - |
onClick | a callback function that is run when the node is clicked | Function | - |
...other | User defined props | {string: any} | - |
Dependencies
- lodash: some light-weight utility functions are used, e.g.
get
,isEmpty
, andmerge
. babel-plugin-import is used for only importing used modules to reduce bundle size; only the used functions are bundled.
Code conventions
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago