File tree Expand file tree Collapse file tree 4 files changed +148
-4
lines changed
Expand file tree Collapse file tree 4 files changed +148
-4
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff line change @@ -5,20 +5,22 @@ import DTreeNodeToggle from './components/tree-node-toggle';
55import useTree from './core/use-tree' ;
66import useCheck from './core/use-check' ;
77import useSelect from './core/use-select' ;
8- import { USE_TREE_TOKEN } from './const' ;
98import useOperate from './core/use-operate' ;
9+ import useMergeNodes from './core/use-merge-nodes' ;
10+ import { USE_TREE_TOKEN } from './const' ;
1011import { TreeProps , treeProps } from './new-tree-types' ;
1112import './tree.scss' ;
1213
1314export 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" >
Original file line number Diff line number Diff 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 |
You can’t perform that action at this time.
0 commit comments