From 9945cbe3ca450feac5c319e8dab708932a8087bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=8F=9C=20Cai?= Date: Fri, 11 Oct 2024 15:44:05 +0800 Subject: [PATCH] fix(tree): custom icons cannot be clicked without child nodes (#3354) --- src/tree/__tests__/expand.test.jsx | 32 ++++++++++++++++++++++++++++++ src/tree/hooks/useTreeAction.ts | 3 +++ 2 files changed, 35 insertions(+) diff --git a/src/tree/__tests__/expand.test.jsx b/src/tree/__tests__/expand.test.jsx index 21ee9d6fe..f09a116ab 100644 --- a/src/tree/__tests__/expand.test.jsx +++ b/src/tree/__tests__/expand.test.jsx @@ -1,5 +1,6 @@ import { mount } from '@vue/test-utils'; import Tree from '@/src/tree/index.ts'; +import Icon from '@/src/icon/index.ts'; import { delay } from './kit'; import { ref } from './adapt'; @@ -376,6 +377,37 @@ describe('Tree:expand', () => { expect(wrapper.find('[data-value="t1.1"]').exists()).toBe(true); }); + it('自定义图标-点击父节点图标可触发展开子节点', async () => { + const data = [ + { + value: 't1', + children: [ + { + value: 't1.1', + }, + ], + }, + ]; + const wrapper = mount({ + render() { + return }>; + }, + }); + // 测试: 点击一级 一级展开 二级存在 + wrapper.find('[data-value="t1"] .t-tree__icon').trigger('click'); + await delay(10); + const t1d1 = wrapper.find('[data-value="t1.1"]'); + expect(t1d1.attributes('class')).toContain('t-tree__item--visible'); + const t1 = wrapper.find('[data-value="t1"]'); + expect(t1.attributes('class')).toContain('t-tree__item--open'); + + // 测试:点击二级 二级状态不展开 + wrapper.find('[data-value="t1.1"] .t-tree__icon').trigger('click'); + await delay(10); + const t1d1_two = wrapper.find('[data-value="t1.1"]'); + expect(t1d1_two.attributes('class')).not.toContain('t-tree__item--open'); + }); + it('点击已展开的父节点图标,可触发收起子节点', async () => { const data = [ { diff --git a/src/tree/hooks/useTreeAction.ts b/src/tree/hooks/useTreeAction.ts index dd570eb18..286cce1eb 100644 --- a/src/tree/hooks/useTreeAction.ts +++ b/src/tree/hooks/useTreeAction.ts @@ -47,6 +47,9 @@ export default function useTreeAction(state: TypeTreeState) { const toggleExpanded = (item: TypeTargetNode): TreeNodeValue[] => { const node = getNode(store, item); + + if (!node.children) return; + return setExpanded(node, !node.isExpanded()); };