Skip to content

Commit 8b6c073

Browse files
committed
feat(TreeContainer): support a render function for TreeContainer
1 parent d41acc0 commit 8b6c073

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ Properties:
7171
* * `defaultState?: TreeState`: the state to start with. If you pass this, but not `state`, then `TreeContainer` will manage state internally (uncontrolled).
7272
* `onStateChange?: (st: TreeState) => void`: called whenever the tree state changes from within (usually through `useTreeController()`). Use this if you want to manage tree state in your own state container (like Redux).
7373
* `loaderOptions?: TreeLoaderOptions`: options for loading data from the tree source. See [useTreeLoader()](#usetreeloader).
74+
* `rootElement?: React.FC<{ tree: Tree<T> }>`: if passed, this element will be shown within the tree container. It will receive the tree as a prop.
75+
* `render?: (props: { tree: Tree<T> }) => ReactNode`: if passed, this function will be called and its output tree is rendered within the tree container.
76+
7477

7578
### interface TreeSource
7679
Interface for a data source to fetch tree data, usually from a server. A data source should implement these two methods:

src/TreeContainer.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { PropsWithChildren, ReactElement, useCallback, useRef } from 'react';
1+
import React, { PropsWithChildren, ReactElement, ReactNode, useCallback, useRef } from 'react';
22
import { useBinding } from 'use-binding';
33
import { TreeContentContext } from 'use-tree-content';
44
import { noopUpdateState, TreeController, TreeControllerContext, treeControllerFromUpdateState } from 'use-tree-controller';
@@ -11,11 +11,12 @@ interface TreeContainerProps<T> {
1111
state?: TreeState;
1212
onStateChange?: (st: TreeState) => void;
1313
rootElement?: React.FC<{ tree: Tree<T> }>;
14+
render?: (props: { tree: Tree<T> }) => ReactNode;
1415
loaderOptions?: TreeLoaderOptions;
1516
}
1617

1718
export function TreeContainer<T>(props: PropsWithChildren<TreeContainerProps<T>>, context?: any): ReactElement | null {
18-
const { source, defaultState, state, onStateChange, rootElement, children, loaderOptions } = props;
19+
const { source, defaultState, state, onStateChange, rootElement, render, children, loaderOptions } = props;
1920
const controller = useRef<TreeController<unknown>>(treeControllerFromUpdateState(noopUpdateState));
2021
const [innerState, setInnerState] = useBinding(defaultState, state, onStateChange, {});
2122

@@ -28,7 +29,9 @@ export function TreeContainer<T>(props: PropsWithChildren<TreeContainerProps<T>>
2829
return (
2930
<TreeContentContext.Provider value={tree}>
3031
<TreeControllerContext.Provider value={controller.current}>
31-
{rootElement ? React.createElement(rootElement, { tree }) : children}
32+
{rootElement && React.createElement(rootElement, { tree })}
33+
{render && render({ tree })}
34+
{children}
3235
</TreeControllerContext.Provider>
3336
</TreeContentContext.Provider>
3437
);

0 commit comments

Comments
 (0)