1
1
import { defineComponent , watch , ref , shallowRef , PropType , h } from 'vue' ;
2
2
import { cloneDeep } from 'lodash-es' ;
3
3
import { NodeKey , TreeNodeInstance , TreeNodeOptions , TypeWithNull , TypeWithUndefined } from "./types" ;
4
- import {
5
- checkedNodes ,
6
- disabledKeys ,
7
- expandedKeys ,
8
- flattenTree ,
9
- selectedNodes ,
10
- updateDownwards ,
11
- updateUpwards
12
- } from "./uses" ;
4
+
13
5
import VirTreeNode from './node' ;
14
6
import VirtualList from '../VirtualList' ;
15
7
import './index.scss' ;
8
+ import { TreeService } from "./service" ;
16
9
17
10
export default defineComponent ( {
18
11
name : 'VirTree' ,
@@ -25,10 +18,18 @@ export default defineComponent({
25
18
type : Array as PropType < NodeKey [ ] > ,
26
19
default : ( ) => [ ]
27
20
} ,
21
+ defaultSelectedKey : {
22
+ type : [ String , Number ] ,
23
+ default : ''
24
+ } ,
28
25
defaultCheckedKeys : {
29
26
type : Array as PropType < NodeKey [ ] > ,
30
27
default : ( ) => [ ]
31
28
} ,
29
+ defaultDisabledKeys : {
30
+ type : Array as PropType < NodeKey [ ] > ,
31
+ default : ( ) => [ ]
32
+ } ,
32
33
showCheckbox : {
33
34
type : Boolean ,
34
35
default : false
@@ -52,18 +53,22 @@ export default defineComponent({
52
53
setup : function ( props , { emit, slots, expose} ) {
53
54
const loading = shallowRef ( false ) ;
54
55
const flatList = ref < Required < TreeNodeOptions > [ ] > ( [ ] ) ;
56
+
57
+ const service = new TreeService ( ) ;
58
+
55
59
watch ( ( ) => props . source , newVal => {
56
- flatList . value = flattenTree ( newVal , props . defaultCheckedKeys , props . defaultExpandedKeys ) ;
57
- console . log ( 'expandedKeys>>' , expandedKeys . value . selected ) ;
60
+ flatList . value = service . flattenTree ( newVal , props . defaultSelectedKey , props . defaultCheckedKeys , props . defaultExpandedKeys , props . defaultDisabledKeys ) ;
61
+ // console.log('expandedKeys>>', expandedKeys.value.selected);
58
62
} , { immediate : true } ) ;
59
63
const selectChange = ( node : Required < TreeNodeOptions > ) => {
60
- const preSelectedNode = selectedNodes . value . selected [ 0 ] ;
64
+ const preSelectedNode = service . selectedNodes . value . selected [ 0 ] ;
61
65
let currentNode : TypeWithNull < TreeNodeOptions > = node ;
62
- if ( selectedNodes . value . isSelected ( node ) ) {
63
- selectedNodes . value . clear ( ) ;
66
+ if ( service . selectedNodes . value . isSelected ( node ) ) {
67
+ service . selectedNodes . value . clear ( ) ;
64
68
currentNode = null ;
69
+ service . defaultSelectedKey = '' ;
65
70
} else {
66
- selectedNodes . value . select ( node ) ;
71
+ service . selectedNodes . value . select ( node ) ;
67
72
}
68
73
emit ( 'selectChange' , {
69
74
preSelectedNode,
@@ -73,27 +78,44 @@ export default defineComponent({
73
78
74
79
75
80
const checkChange = ( [ checked , node ] : [ boolean , Required < TreeNodeOptions > ] ) => {
76
- checkedNodes . value . toggle ( node ) ;
81
+ service . checkedNodes . value . toggle ( node ) ;
82
+ if ( ! checked ) {
83
+ service . removeDefaultCheckedKeys ( node ) ;
84
+ }
85
+
77
86
if ( ! props . checkStrictly ) {
78
- updateDownwards ( checked , node ) ;
79
- updateUpwards ( node , flatList . value ) ;
87
+ service . updateDownwards ( checked , node ) ;
88
+ service . updateUpwards ( node , flatList . value ) ;
80
89
}
81
90
emit ( 'checkChange' , { checked, node} ) ;
82
91
}
83
92
84
93
const expandNode = ( node : Required < TreeNodeOptions > , children : TreeNodeOptions [ ] = [ ] ) => {
85
94
const trueChildren = children . length ? children : cloneDeep ( node . children ) ! ;
86
- node . children = trueChildren . map ( item => {
95
+ node . children = ( trueChildren as Required < TreeNodeOptions > [ ] ) . map ( item => {
87
96
item . loading = false ;
88
97
item . level = item . level || node . level ! + 1 ;
89
98
item . children = item . children || [ ] ;
90
99
item . hasChildren = item . hasChildren || false ;
91
100
item . parentKey = node . nodeKey || null ;
92
- if ( props . defaultCheckedKeys . includes ( item . nodeKey ) ) {
93
- checkedNodes . value . select ( item as Required < TreeNodeOptions > ) ;
101
+
102
+ if ( props . defaultDisabledKeys . includes ( item . nodeKey ) ) {
103
+ service . disabledKeys . value . select ( item . nodeKey ) ;
104
+ }
105
+
106
+ const selectedKey = service . selectedNodes . value . selected [ 0 ] ?. nodeKey || service . defaultSelectedKey ;
107
+ if ( selectedKey === item . nodeKey ) {
108
+ service . selectedNodes . value . select ( item as Required < TreeNodeOptions > ) ;
94
109
}
95
- if ( props . defaultExpandedKeys . includes ( item . nodeKey ) ) {
96
- expandedKeys . value . select ( item . nodeKey ) ;
110
+
111
+ const allCheckedKeys = service . checkedNodes . value . selected . map ( item => item . nodeKey ) . concat ( service . defaultCheckedKeys ) ;
112
+ if ( allCheckedKeys . includes ( item . nodeKey ) || ( ! props . checkStrictly && service . checkedNodes . value . isSelected ( node ) ) ) {
113
+ service . checkedNodes . value . select ( item as Required < TreeNodeOptions > ) ;
114
+ }
115
+
116
+ const allExpandedKeys = service . expandedKeys . value . selected . concat ( service . defaultExpandedKeys ) ;
117
+ if ( allExpandedKeys . includes ( item . nodeKey ) ) {
118
+ service . expandedKeys . value . select ( item . nodeKey ) ;
97
119
}
98
120
return item ;
99
121
} ) ;
@@ -107,8 +129,9 @@ export default defineComponent({
107
129
if ( node . children ?. length ) {
108
130
( node . children as Required < TreeNodeOptions > [ ] ) . forEach ( item => {
109
131
delKeys . push ( item . nodeKey ) ;
110
- if ( expandedKeys . value . isSelected ( item . nodeKey ) ) {
111
- expandedKeys . value . deselect ( item . nodeKey ) ;
132
+ if ( service . expandedKeys . value . isSelected ( item . nodeKey ) ) {
133
+ service . expandedKeys . value . deselect ( item . nodeKey ) ;
134
+ service . removeDefaultExpandedKeys ( item . nodeKey ) ;
112
135
recursion ( item as Required < TreeNodeOptions > ) ;
113
136
}
114
137
} ) ;
@@ -122,8 +145,8 @@ export default defineComponent({
122
145
123
146
const toggleExpand = ( node : Required < TreeNodeOptions > ) => {
124
147
if ( loading . value ) return ;
125
- expandedKeys . value . toggle ( node . nodeKey ) ;
126
- if ( expandedKeys . value . isSelected ( node . nodeKey ) ) {
148
+ service . expandedKeys . value . toggle ( node . nodeKey ) ;
149
+ if ( service . expandedKeys . value . isSelected ( node . nodeKey ) ) {
127
150
if ( node . children ?. length ) {
128
151
expandNode ( node ) ;
129
152
} else {
@@ -141,9 +164,10 @@ export default defineComponent({
141
164
}
142
165
}
143
166
} else {
167
+ service . removeDefaultExpandedKeys ( node . nodeKey ) ;
144
168
collapseNode ( node ) ;
145
169
}
146
- emit ( 'toggleExpand' , { status : expandedKeys . value . isSelected ( node . nodeKey ) , node } ) ;
170
+ emit ( 'toggleExpand' , { status : service . expandedKeys . value . isSelected ( node . nodeKey ) , node } ) ;
147
171
}
148
172
const nodeRefs = ref < TreeNodeInstance [ ] > ( [ ] ) ;
149
173
const setRef = ( index : number , node : any ) => {
@@ -153,16 +177,16 @@ export default defineComponent({
153
177
}
154
178
expose ( {
155
179
getSelectedNode : ( ) : TypeWithUndefined < TreeNodeOptions > => {
156
- return selectedNodes . value . selected [ 0 ] ;
180
+ return service . selectedNodes . value . selected [ 0 ] ;
157
181
} ,
158
182
getCheckedNodes : ( ) : TreeNodeOptions [ ] => {
159
- return checkedNodes . value . selected ;
183
+ return service . checkedNodes . value . selected ;
160
184
} ,
161
185
getHalfCheckedNodes : ( ) : TreeNodeOptions [ ] => {
162
186
return nodeRefs . value . filter ( item => item . halfChecked ( ) ) . map ( item => item . rawNode ) ;
163
187
} ,
164
188
getExpandedKeys : ( ) : NodeKey [ ] => {
165
- return expandedKeys . value . selected ;
189
+ return service . expandedKeys . value . selected ;
166
190
}
167
191
} ) ;
168
192
@@ -181,10 +205,10 @@ export default defineComponent({
181
205
default : ( data : { item : Required < TreeNodeOptions > , index : number } ) => h ( VirTreeNode , {
182
206
ref : setRef . bind ( null , data . index ) ,
183
207
node : data . item ,
184
- selectedNodes : selectedNodes . value ,
185
- checkedNodes : checkedNodes . value ,
186
- expandedKeys : expandedKeys . value ,
187
- disabledKeys : disabledKeys . value ,
208
+ selectedNodes : service . selectedNodes . value ,
209
+ checkedNodes : service . checkedNodes . value ,
210
+ expandedKeys : service . expandedKeys . value ,
211
+ disabledKeys : service . disabledKeys . value ,
188
212
showCheckbox : props . showCheckbox ,
189
213
checkStrictly : props . checkStrictly ,
190
214
iconSlot : slots . icon ,
0 commit comments