@@ -234,32 +234,36 @@ export const useNested = (props: NestedProps, items: Ref<ListItem[]>) => {
234234 parents . value = new Map ( parents . value )
235235 } , 100 )
236236
237- function flatten ( items : ListItem [ ] ) : ListItem [ ] {
238- return [
239- ...items ,
240- ...items . length ? flatten ( items . flatMap ( x => x . children ?? [ ] ) ) : [ ] ,
241- ]
242- }
243-
244237 watch ( items , val => {
245238 if ( props . itemsRegistration === 'render' ) return
246239
247- const allNodes = flatten ( val )
248- children . value = new Map (
249- allNodes
250- . filter ( item => item . children )
251- . map ( item => [ item . value , item . children ! . map ( x => x . value ) ] )
252- )
253- parents . value = new Map (
254- allNodes
255- . filter ( item => ! val . includes ( item ) )
256- . map ( item => [ item . value , allNodes . find ( x => x . children ?. includes ( item ) ) ?. value ] )
257- )
258- disabled . value = new Set (
259- allNodes
260- . filter ( item => ( item as any ) . disabled )
261- . map ( item => item . value )
262- )
240+ const _parents = new Map ( )
241+ const _children = new Map ( )
242+ const _disabled = new Set ( )
243+
244+ const stack = [ ...val ]
245+ let i = 0
246+ while ( i < stack . length ) {
247+ const item = stack [ i ++ ]
248+
249+ if ( item . children ) {
250+ const childValues = [ ]
251+ for ( const child of item . children ) {
252+ _parents . set ( child . value , item . value )
253+ childValues . push ( child . value )
254+ stack . push ( child )
255+ }
256+ _children . set ( item . value , childValues )
257+ }
258+
259+ if ( ( item as any ) . disabled ) {
260+ _disabled . add ( item . value )
261+ }
262+ }
263+
264+ children . value = _children
265+ parents . value = _parents
266+ disabled . value = _disabled
263267 } , { immediate : true } )
264268
265269 const nested : NestedProvide = {
0 commit comments