Skip to content

Commit 3cf935b

Browse files
committed
feat(tree): 增加合并节点的功能
1 parent d8fd302 commit 3cf935b

File tree

4 files changed

+148
-4
lines changed

4 files changed

+148
-4
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Ref } from 'vue';
2+
import useOperate from './use-operate';
3+
import { IInnerTreeNode, IUseCore } from './use-tree-types';
4+
5+
export default function() {
6+
return function useMergeNodes(data: Ref<IInnerTreeNode[]>, core: IUseCore) {
7+
const { setNodeValue, getChildren } = core;
8+
const { removeNode } = useOperate()(data, core);
9+
10+
const mergeTreeNodes = () => {
11+
const mergeToNode = (node: IInnerTreeNode) => {
12+
if (node.isLeaf) return;
13+
14+
const children = getChildren(node, { recursive: false });
15+
if (children?.length === 1) {
16+
const subChildren = getChildren(children[0], { recursive: false });
17+
18+
if (subChildren.length !== 0) {
19+
setNodeValue(node, 'label', node.label + ' / ' + children[0]?.label);
20+
removeNode(children[0], { recursive: false });
21+
mergeToNode(node);
22+
} else {
23+
setNodeValue(children[0], 'parentId', node.id);
24+
}
25+
} else {
26+
children.forEach(item => {
27+
mergeToNode(item);
28+
});
29+
}
30+
};
31+
32+
data.value.filter(item => item.level === 1).forEach(item => {
33+
mergeToNode(item);
34+
});
35+
}
36+
37+
return {
38+
mergeTreeNodes,
39+
}
40+
};
41+
}

packages/devui-vue/devui/tree/src/core/use-operate.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,19 @@ export default function(options?) {
3838
);
3939
}
4040

41-
const removeNode = (node: ITreeNode): void => {
41+
const removeNode = (node: IInnerTreeNode, config = { recursive: true }): void => {
42+
if (!config.recursive) {
43+
getChildren(node).forEach(child => {
44+
setNodeValue(child, 'level', getLevel(child) - 1);
45+
});
46+
}
47+
4248
data.value = data.value.filter(item => {
43-
return item.id !== node.id && !getChildren(node).map(nodeItem => nodeItem.id).includes(item.id);
49+
if (config.recursive) {
50+
return item.id !== node.id && !getChildren(node).map(nodeItem => nodeItem.id).includes(item.id);
51+
} else {
52+
return item.id !== node.id;
53+
}
4454
});
4555
}
4656

packages/devui-vue/devui/tree/src/new-tree.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,22 @@ import DTreeNodeToggle from './components/tree-node-toggle';
55
import useTree from './core/use-tree';
66
import useCheck from './core/use-check';
77
import useSelect from './core/use-select';
8-
import { USE_TREE_TOKEN } from './const';
98
import useOperate from './core/use-operate';
9+
import useMergeNodes from './core/use-merge-nodes';
10+
import { USE_TREE_TOKEN } from './const';
1011
import { TreeProps, treeProps } from './new-tree-types';
1112
import './tree.scss';
1213

1314
export default defineComponent({
1415
name: 'DNewTree',
1516
props: treeProps,
16-
setup(props: TreeProps, { slots }) {
17+
setup(props: TreeProps, { slots, expose }) {
1718
const { data, check } = toRefs(props);
1819

1920
const userPlugins = [
2021
useSelect(),
2122
useOperate(),
23+
useMergeNodes(),
2224
];
2325

2426
const checkOptions = ref({
@@ -49,6 +51,10 @@ export default defineComponent({
4951

5052
provide(USE_TREE_TOKEN, treeFactory);
5153

54+
expose({
55+
treeFactory
56+
});
57+
5258
return () => {
5359
return (
5460
<div class="devui-tree">

packages/devui-vue/docs/components/tree/index.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,93 @@ export default defineComponent({
278278

279279
:::
280280

281+
### 节点合并
282+
283+
:::demo
284+
285+
```vue
286+
<template>
287+
<d-new-tree :data="data" ref="treeRef"></d-new-tree>
288+
</template>
289+
<script lang="ts">
290+
import { defineComponent, ref, onMounted } from 'vue';
291+
292+
export default defineComponent({
293+
setup() {
294+
const treeRef = ref(null);
295+
const data = ref([
296+
{
297+
label: 'Parent node 1',
298+
children: [
299+
{
300+
label: 'Parent node 1-1',
301+
children: [
302+
{
303+
label: 'Parent node 1-1-1',
304+
children: [
305+
{
306+
label: 'Parent node 1-1-1-1'
307+
}
308+
]
309+
}
310+
]
311+
},
312+
]
313+
},
314+
{
315+
label: 'Parent node 2',
316+
children: [
317+
{
318+
label: 'Parent node 2-1',
319+
children: [
320+
{
321+
label: 'Leaf node 2-1-1'
322+
},
323+
{
324+
label: 'Leaf node 2-1-2'
325+
},
326+
]
327+
},
328+
]
329+
},
330+
{
331+
label: 'Parent node 3',
332+
children: [
333+
{
334+
label: 'Leaf node 3-1',
335+
children: [
336+
{
337+
label: 'Leaf node 3-1-1',
338+
children: [
339+
{
340+
label: 'Leaf node 3-1-1-1'
341+
}
342+
]
343+
}
344+
]
345+
},
346+
{
347+
label: 'Leaf node 3-2'
348+
}
349+
]
350+
}
351+
]);
352+
353+
onMounted(() => {
354+
treeRef.value.treeFactory.mergeTreeNodes();
355+
});
356+
357+
return {
358+
data,
359+
treeRef,
360+
}
361+
}
362+
})
363+
</script>
364+
```
365+
366+
:::
367+
281368
### Tree 参数
282369

283370
| 参数名 | 类型 | 默认值 | 说明 | 跳转 Demo |

0 commit comments

Comments
 (0)