From 2a55bfae5d87d8aa4194e06acb355742cfd61440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Tue, 7 May 2024 16:32:22 +0800 Subject: [PATCH 1/2] fix: loadedKeys should not trigger when onExpand --- src/Tree.tsx | 9 +++++++- src/TreeNode.tsx | 16 ++++++++----- tests/TreeProps.spec.tsx | 49 +++++++++++++++++++++++++++++++++------- 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/Tree.tsx b/src/Tree.tsx index d4384bda..4cd0fb82 100644 --- a/src/Tree.tsx +++ b/src/Tree.tsx @@ -29,7 +29,7 @@ import { SafeKey, ScrollTo, } from './interface'; -import NodeList, { MotionEntity, MOTION_KEY, NodeListRef } from './NodeList'; +import NodeList, { MOTION_KEY, MotionEntity, NodeListRef } from './NodeList'; import TreeNode from './TreeNode'; import { arrAdd, @@ -957,6 +957,13 @@ class Tree extends Rea onNodeLoad = (treeNode: EventDataNode) => { const { key } = treeNode; + const { keyEntities } = this.state; + + // Skip if has children already + const entity = getEntity(keyEntities, key); + if (entity?.children?.length) { + return; + } const loadPromise = new Promise((resolve, reject) => { // We need to get the latest state of loading/loaded keys diff --git a/src/TreeNode.tsx b/src/TreeNode.tsx index bf776ac2..db9c68b8 100644 --- a/src/TreeNode.tsx +++ b/src/TreeNode.tsx @@ -251,7 +251,7 @@ class InternalTreeNode extends React.Component { + syncLoadData = (props: InternalTreeNodeProps) => { const { expanded, loading, loaded } = props; const { context: { loadData, onNodeLoad }, @@ -262,12 +262,10 @@ class InternalTreeNode extends React.Component - + {this.renderDragHandler()} {this.renderSwitcher()} {this.renderCheckbox()} diff --git a/tests/TreeProps.spec.tsx b/tests/TreeProps.spec.tsx index 0f059757..b079b88d 100644 --- a/tests/TreeProps.spec.tsx +++ b/tests/TreeProps.spec.tsx @@ -654,6 +654,37 @@ describe('Tree Props', () => { 'Warning: Retry for `loadData` many times but still failed. No more retry.', ); }); + + // https://github.com/ant-design/ant-design/issues/48796 + it('skip load if has children', () => { + const loadData = jest.fn(async (info) => { + console.log('->', info.key); + }); + + const { container } = render( + , + ); + + fireEvent.click(container.querySelector('.rc-tree-switcher')!); + expect(loadData).not.toHaveBeenCalled(); + }); }); it('icon', () => { @@ -693,14 +724,16 @@ describe('Tree Props', () => { it('indentWidth', () => { const { container } = render( - - - - - + + + + + , + ); + + expect(getComputedStyle(container.querySelector('.rc-tree-indent-unit-start')).width).toBe( + '200px', ); - - expect(getComputedStyle(container.querySelector(".rc-tree-indent-unit-start")).width).toBe('200px') }); it('onDoubleClick', () => { @@ -775,7 +808,7 @@ describe('Tree Props', () => { return new FakePromise(ret); }; - catch = () => { }; + catch = () => {}; } // eslint-disable-next-line prefer-const From afd2c2557c3194e362791e5ffb59f7df1f9ba684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E6=9C=BA=E5=99=A8=E4=BA=BA?= Date: Tue, 7 May 2024 16:42:53 +0800 Subject: [PATCH 2/2] fix: loadedKeys conflict --- tests/TreeProps.spec.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/TreeProps.spec.tsx b/tests/TreeProps.spec.tsx index b079b88d..3a00bb1e 100644 --- a/tests/TreeProps.spec.tsx +++ b/tests/TreeProps.spec.tsx @@ -559,7 +559,7 @@ describe('Tree Props', () => { , ); - fireEvent.click(container.querySelector('.rc-tree-switcher')); + fireEvent.click(container.querySelector('.rc-tree-switcher')!); expect(onExpand).toHaveBeenCalled(); @@ -614,14 +614,14 @@ describe('Tree Props', () => { const { container } = render(); // Parent click - fireEvent.click(container.querySelector('.rc-tree-switcher')); + fireEvent.click(container.querySelector('.rc-tree-switcher')!); setTimeout(() => { // Child click fireEvent.click(container.querySelectorAll('.rc-tree-switcher')[1]); setTimeout(() => { - expect(count).toBe(2); + expect(count).toBe(1); done(); }, 500); }, 500);