From 51120b57c008cdc0f8c6a61869574385a46f8f55 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=92=9F=E7=A3=8A?= <zl_0110@outlook.com>
Date: Fri, 11 Oct 2024 11:13:51 +0800
Subject: [PATCH 1/4] fix: issue #109

---
 src/store/tree-store.ts | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/store/tree-store.ts b/src/store/tree-store.ts
index 15d1bd1..8775924 100644
--- a/src/store/tree-store.ts
+++ b/src/store/tree-store.ts
@@ -1271,6 +1271,7 @@ export default class TreeStore extends TreeEventTarget {
    * @param node 需要勾选的节点
    */
   private checkParentNode(node: TreeNode): void {
+    if(!this.options.cascade) return
     const length = node.children.length
     if (!length) return
     let hasChecked = false

From 2a8d8f5bee997805fcdeef95bf9027716b282038 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=92=9F=E7=A3=8A?= <zl_0110@outlook.com>
Date: Tue, 22 Oct 2024 17:08:30 +0800
Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=BC=82=E6=AD=A5?=
 =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=A0=91=EF=BC=8CsetExpandKeys=E5=90=8E?=
 =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=B1=95=E5=BC=80=E4=BD=86=E6=98=AF=E4=B8=8D?=
 =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=95=B0=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/store/tree-store.ts | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/store/tree-store.ts b/src/store/tree-store.ts
index 8775924..169641f 100644
--- a/src/store/tree-store.ts
+++ b/src/store/tree-store.ts
@@ -366,13 +366,13 @@ export default class TreeStore extends TreeEventTarget {
    * @param triggerEvent 是否触发事件
    * @param triggerDataChange 是否触发 `data-change` 事件以通知外部刷新视图
    */
-  setExpand(
+  async setExpand(
     key: TreeNodeKeyType,
     value: boolean,
     expandParent: boolean = false,
     triggerEvent: boolean = true,
     triggerDataChange: boolean = true
-  ): void {
+  ): Promise<void> {
     const node = this.mapData[key]
     if (!node || (!expandParent && node.isLeaf)) return
 
@@ -386,7 +386,7 @@ export default class TreeStore extends TreeEventTarget {
           if (triggerDataChange) {
             this.emit('visible-data-change')
           }
-          new Promise((resolve, reject) => {
+          await new Promise((resolve, reject) => {
             const load = this.options.load as Function
             load(node, resolve, reject)
           })
@@ -446,7 +446,7 @@ export default class TreeStore extends TreeEventTarget {
     }
 
     if (expandParent && node._parent && value) {
-      this.setExpand(
+      await this.setExpand(
         node._parent[this.options.keyField],
         value,
         expandParent,
@@ -461,14 +461,15 @@ export default class TreeStore extends TreeEventTarget {
    * @param keys 展开的节点 key 数组
    * @param value 是否展开
    */
-  setExpandKeys(
+  async setExpandKeys(
     keys: TreeNodeKeyType[],
     value: boolean,
     triggerDataChange: boolean = true
-  ): void {
-    keys.forEach(key => {
-      this.setExpand(key, value, false, false, false)
-    })
+  ): Promise<void> {
+
+    for (const key of keys) {
+      await this.setExpand(key, value, false, false, false)
+    }
 
     if (triggerDataChange) {
       this.emit('visible-data-change')

From a3b5152a5f3738c44d8b73599125e5347a0d7de4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=92=9F=E7=A3=8A?= <zl_0110@outlook.com>
Date: Tue, 22 Oct 2024 17:25:56 +0800
Subject: [PATCH 3/4] =?UTF-8?q?feat:=20setExpand=20API=E8=BF=94=E5=9B=9EPr?=
 =?UTF-8?q?omise?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/hooks/usePublicTreeAPI.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/hooks/usePublicTreeAPI.ts b/src/hooks/usePublicTreeAPI.ts
index d22737f..0953acf 100644
--- a/src/hooks/usePublicTreeAPI.ts
+++ b/src/hooks/usePublicTreeAPI.ts
@@ -5,7 +5,7 @@ import { ITreeNodeOptions } from "../store/tree-node"
 import { FilterFunctionType } from "../store/tree-store"
 import { TreeProps } from "../components/Tree.vue"
 
-type IUsePublicTreeAPIProps = Required<Pick<TreeProps, 
+type IUsePublicTreeAPIProps = Required<Pick<TreeProps,
   'selectable' |
   'checkable' |
   'separator' |
@@ -82,8 +82,8 @@ export const usePublicTreeAPI = (
     key: TreeNodeKeyType,
     value: boolean,
     expandParent: boolean = true
-  ): void {
-    nonReactive.store.setExpand(key, value, expandParent)
+  ): Promise<void> {
+    return nonReactive.store.setExpand(key, value, expandParent)
   }
   function setExpandKeys(keys: TreeNodeKeyType[], value: boolean): void {
     nonReactive.store.setExpandKeys(keys, value)

From 29e3d8d4a73bf85adeb57ba822859b812ea64b58 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=92=9F=E7=A3=8A?= <zl_0110@outlook.com>
Date: Fri, 8 Nov 2024 10:44:59 +0800
Subject: [PATCH 4/4] =?UTF-8?q?feat:=20setExpand=20=E6=94=AF=E6=8C=81?=
 =?UTF-8?q?=E5=B1=95=E5=BC=80=E5=8A=A8=E7=94=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/Tree.vue | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/components/Tree.vue b/src/components/Tree.vue
index e9754fa..f18e206 100644
--- a/src/components/Tree.vue
+++ b/src/components/Tree.vue
@@ -220,10 +220,10 @@ export interface TreeProps {
 
   /** 渲染节点数量,可见节点数大于此值且高度超过(容器可视高度能容纳节点数 + bufferNodeAmount)则不会渲染所有可见节点 */
   renderNodeAmount?: number,
-  
+
   /** 根据节点最小高度计算数据总高度 */
   nodeMinHeight?: number,
-  
+
   /** 当滚动到视野外的节点个数大于此值时刷新渲染节点 */
   bufferNodeAmount?: number,
 }
@@ -288,6 +288,7 @@ import { usePublicTreeAPI } from '../hooks/usePublicTreeAPI'
 import { FilterFunctionType } from '../store/tree-store'
 import { pickReadonly } from '../utils'
 import { useExpandAnimation } from '../hooks/useExpandAnimation'
+import {ArgumentsType} from "vitest";
 
 const props = withDefaults(defineProps<TreeProps>(), DEFAULT_TREE_PROPS)
 
@@ -677,6 +678,17 @@ const treeNodePropKeys = [
 
 const treeNodeProps = reactive(pickReadonly(toRefs(props), ...treeNodePropKeys))
 
+const setExpandExpose = (...args: ArgumentsType<typeof setExpand>) => {
+  if (props.animation) {
+    const node = getNode(args[0]);
+    if(node) {
+      expandAnimation.updateBeforeExpand(node)
+    }
+  }
+
+  setExpand(...args)
+}
+
 defineExpose({
   setData,
   setChecked,
@@ -685,7 +697,7 @@ defineExpose({
   clearChecked,
   setSelected,
   clearSelected,
-  setExpand,
+  setExpand: setExpandExpose,
   setExpandKeys,
   setExpandAll,
   getCheckedNodes,