@@ -291,18 +291,15 @@ export default class TreeStore extends TreeEventTarget {
291291 } else {
292292 // 设置的节点不是当前已选中节点,要么当前没有选中节点,要么当前有选中节点
293293 if ( value ) {
294- if ( this . currentSelectedKey === null ) {
295- // 当前没有选中节点
296- node . selected = value
297- this . currentSelectedKey = node [ this . options . keyField ]
298- } else {
294+ if ( this . currentSelectedKey !== null ) {
299295 // 取消当前已选中,设置新的选中节点
300296 if ( this . mapData [ this . currentSelectedKey ] ) {
301297 this . mapData [ this . currentSelectedKey ] . selected = false
302298 }
303- node . selected = value
304- this . currentSelectedKey = node [ this . options . keyField ]
305299 }
300+ node . selected = value
301+ this . currentSelectedKey = node [ this . options . keyField ]
302+ this . unloadSelectedKey = null
306303 }
307304 }
308305
@@ -327,9 +324,7 @@ export default class TreeStore extends TreeEventTarget {
327324 triggerDataChange : boolean = true
328325 ) : void {
329326 if ( value ) {
330- if ( this . currentSelectedKey ) {
331- this . setSelected ( this . currentSelectedKey , false , false , false )
332- }
327+ this . currentSelectedKey = null
333328 this . unloadSelectedKey = key
334329 } else {
335330 if ( this . unloadSelectedKey === key ) {
@@ -492,8 +487,13 @@ export default class TreeStore extends TreeEventTarget {
492487 }
493488 }
494489
490+ private isChildrenChanged ( node : TreeNode , newNode : ITreeNodeOptions ) : boolean {
491+ return ( 'children' in newNode ) && ( ! ! node . children . length || ! ! newNode . children ?. length )
492+ }
493+ 495494 updateNode ( key : TreeNodeKeyType , newNode : ITreeNodeOptions , triggerEvent = true , triggerDataChange = true ) {
496- if ( ! this . mapData [ key ] ) return
495+ const node = this . mapData [ key ]
496+ if ( ! node ) return
497497
498498 const newNodeCopy : ITreeNodeOptions = { }
499499 const notAllowedFields = [
@@ -512,14 +512,15 @@ export default class TreeStore extends TreeEventTarget {
512512
513513 const previousCheckedKeys = this . getCheckedKeys ( )
514514 const previousSelectedKey = this . getSelectedKey ( )
515+ let triggerSetDataFlag = this . isChildrenChanged ( node , newNodeCopy )
515516
516- if ( 'children' in newNodeCopy ) {
517+ if ( ( 'children' in newNodeCopy ) && ( ! ! node . children . length || ! ! newNodeCopy . children ?. length ) ) {
517518 // remove all children
518519 this . removeChildren ( key , false , false )
519520
520521 // add new children
521522 if ( Array . isArray ( newNodeCopy . children ) ) {
522- this . loadChildren ( this . mapData [ key ] , newNodeCopy . children , this . mapData [ key ] . expand )
523+ this . loadChildren ( node , newNodeCopy . children , node . expand )
523524 }
524525
525526 delete newNodeCopy . children
@@ -537,7 +538,7 @@ export default class TreeStore extends TreeEventTarget {
537538 delete newNodeCopy . expand
538539 }
539540 Object . keys ( newNodeCopy ) . forEach ( ( field ) => {
540- this . mapData [ key ] [ field ] = newNodeCopy [ field ]
541+ node [ field ] = newNodeCopy [ field ]
541542 } )
542543
543544 const currentCheckedKeys = this . getCheckedKeys ( )
@@ -554,6 +555,9 @@ export default class TreeStore extends TreeEventTarget {
554555 }
555556
556557 if ( triggerDataChange ) {
558+ if ( triggerSetDataFlag ) {
559+ this . emit ( 'set-data' )
560+ }
557561 this . emit ( 'visible-data-change' )
558562 }
559563 }
@@ -564,9 +568,15 @@ export default class TreeStore extends TreeEventTarget {
564568
565569 const previousCheckedKeys = this . getCheckedKeys ( )
566570 const previousSelectedKey = this . getSelectedKey ( )
571+ let triggerSetDataFlag = false
567572
568- validNodes . forEach ( ( node ) => {
569- this . updateNode ( node [ this . options . keyField ] , node , false , false )
573+ validNodes . forEach ( ( newNode ) => {
574+ const key = newNode [ this . options . keyField ]
575+ const node = this . mapData [ key ]
576+ if ( node ) {
577+ triggerSetDataFlag = triggerSetDataFlag || this . isChildrenChanged ( node , newNode )
578+ this . updateNode ( key , newNode , false , false )
579+ }
570580 } )
571581
572582 const currentCheckedKeys = this . getCheckedKeys ( )
@@ -580,6 +590,10 @@ export default class TreeStore extends TreeEventTarget {
580590 this . triggerSelectedChange ( true , false )
581591 }
582592
593+ if ( triggerSetDataFlag ) {
594+ this . emit ( 'set-data' )
595+ }
596+ 583597 this . emit ( 'visible-data-change' )
584598 }
585599
@@ -894,6 +908,7 @@ export default class TreeStore extends TreeEventTarget {
894908 if ( ! node || ! node . children . length ) return null
895909
896910 const firstChild = node . children [ 0 ]
911+ let movingNode = firstChild
897912
898913 // 从 flatData 中移除
899914 const index = this . findIndex ( node )
@@ -905,6 +920,11 @@ export default class TreeStore extends TreeEventTarget {
905920 // 从 mapData 中移除
906921 delete this . mapData [ this . flatData [ i ] [ this . options . keyField ] ]
907922 deleteCount ++
923+ 924+ // 如果是 Selected 的节点,则记录
925+ if ( this . flatData [ i ] . selected ) {
926+ movingNode = this . flatData [ i ]
927+ }
908928 } else break
909929 }
910930 this . flatData . splice ( index + 1 , deleteCount )
@@ -915,7 +935,7 @@ export default class TreeStore extends TreeEventTarget {
915935 node . indeterminate = false
916936
917937 // 更新被移除处父节点状态
918- this . updateMovingNodeStatus ( firstChild , triggerEvent , triggerDataChange )
938+ this . updateMovingNodeStatus ( movingNode , triggerEvent , triggerDataChange )
919939
920940 if ( triggerDataChange ) {
921941 this . emit ( 'visible-data-change' )
@@ -935,14 +955,16 @@ export default class TreeStore extends TreeEventTarget {
935955 const currentCheckedKeys = this . getCheckedKeys ( )
936956 const flattenChildren = this . flattenData (
937957 node . children ,
938- this . getSelectedKey === null
958+ this . getSelectedKey ( ) === null
939959 )
940960 this . insertIntoFlatData ( parentIndex + 1 , flattenChildren )
941961 // 如果有未加载的选中节点,判断其是否已加载
942962 this . setUnloadCheckedKeys ( currentCheckedKeys )
943963 if ( this . unloadSelectedKey !== null ) {
944964 this . setUnloadSelectedKey ( this . unloadSelectedKey )
945965 }
966+ 967+ this . checkNodeUpward ( node , true )
946968 }
947969
948970 private getInsertedNode (
@@ -1168,8 +1190,6 @@ export default class TreeStore extends TreeEventTarget {
11681190 if ( node . checked && this . options . cascade ) {
11691191 // 向下勾选,包括自身
11701192 this . checkNodeDownward ( node , true )
1171- // 向上勾选父节点直到根节点
1172- this . checkNodeUpward ( node )
11731193 }
11741194
11751195 if ( node . selected && overrideSelected ) {
@@ -1191,6 +1211,12 @@ export default class TreeStore extends TreeEventTarget {
11911211 this . flattenData ( node . children , overrideSelected , result )
11921212 }
11931213 }
1214+ 1215+ if ( this . options . cascade && ! ! length ) {
1216+ // 向上勾选父节点直到根节点
1217+ this . checkNodeUpward ( nodes [ 0 ] )
1218+ }
1219+ 11941220 return result
11951221 }
11961222
@@ -1230,9 +1256,10 @@ export default class TreeStore extends TreeEventTarget {
12301256 /**
12311257 * 向上勾选/取消勾选父节点,不包括自身
12321258 * @param node 需要勾选的节点
1259+ * @param fromCurrentNode 是否从当前节点开始处理
12331260 */
1234- private checkNodeUpward ( node : TreeNode ) {
1235- let parent = node . _parent
1261+ private checkNodeUpward ( node : TreeNode , fromCurrentNode = false ) {
1262+ let parent = fromCurrentNode ? node : node . _parent
12361263 while ( parent ) {
12371264 this . checkParentNode ( parent )
12381265 parent = parent . _parent
0 commit comments