From 5ad93c6004026489bd22b32ef049f7c63efc1024 Mon Sep 17 00:00:00 2001 From: chengj Date: Fri, 29 Apr 2022 09:55:14 +0800 Subject: [PATCH] feat(function): get selected tree node (#1857) --- src/components/Tree/src/Tree.vue | 2 ++ src/components/Tree/src/tree.ts | 5 +++++ src/components/Tree/src/useTree.ts | 20 +++++++++++++++++++- src/views/demo/tree/ActionTree.vue | 8 ++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/components/Tree/src/Tree.vue b/src/components/Tree/src/Tree.vue index 7e05d1130..4e58e1eeb 100644 --- a/src/components/Tree/src/Tree.vue +++ b/src/components/Tree/src/Tree.vue @@ -119,6 +119,7 @@ getAllKeys, getChildrenKeys, getEnabledKeys, + getSelectedNode, } = useTree(treeDataRef, getFieldNames); function getIcon(params: Recordable, icon?: string) { @@ -320,6 +321,7 @@ insertNodesByKey, deleteNodeByKey, updateNodeByKey, + getSelectedNode, checkAll, expandAll, filterByLevel: (level: number) => { diff --git a/src/components/Tree/src/tree.ts b/src/components/Tree/src/tree.ts index 420f16a5d..c368b8bf6 100644 --- a/src/components/Tree/src/tree.ts +++ b/src/components/Tree/src/tree.ts @@ -185,4 +185,9 @@ export interface TreeActionType { updateNodeByKey: (key: string, node: Omit) => void; setSearchValue: (value: string) => void; getSearchValue: () => string; + getSelectedNode: ( + key: KeyType, + treeList?: TreeItem[], + selectNode?: TreeItem | null, + ) => TreeItem | null; } diff --git a/src/components/Tree/src/useTree.ts b/src/components/Tree/src/useTree.ts index 44f2f3b87..4713a54cb 100644 --- a/src/components/Tree/src/useTree.ts +++ b/src/components/Tree/src/useTree.ts @@ -1,4 +1,4 @@ -import type { InsertNodeParams, KeyType, FieldNames } from './tree'; +import type { InsertNodeParams, KeyType, FieldNames, TreeItem } from './tree'; import type { Ref, ComputedRef } from 'vue'; import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree'; @@ -176,6 +176,23 @@ export function useTree(treeDataRef: Ref, getFieldNames: Compute } } } + + // Get selected node + function getSelectedNode(key: KeyType, list?: TreeItem[], selectedNode?: TreeItem | null) { + if (!key && key !== 0) return null; + const treeData = list || unref(treeDataRef); + treeData.forEach((item) => { + if (selectedNode?.key || selectedNode?.key === 0) return selectedNode; + if (item.key === key) { + selectedNode = item; + return; + } + if (item.children && item.children.length) { + selectedNode = getSelectedNode(key, item.children, selectedNode); + } + }); + return selectedNode || null; + } return { deleteNodeByKey, insertNodeByKey, @@ -185,5 +202,6 @@ export function useTree(treeDataRef: Ref, getFieldNames: Compute getAllKeys, getChildrenKeys, getEnabledKeys, + getSelectedNode, }; } diff --git a/src/views/demo/tree/ActionTree.vue b/src/views/demo/tree/ActionTree.vue index 74538df51..613000ed9 100644 --- a/src/views/demo/tree/ActionTree.vue +++ b/src/views/demo/tree/ActionTree.vue @@ -13,6 +13,7 @@ 获取勾选数据 设置选中数据 获取选中数据 + 获取选中节点 设置展开数据 获取展开数据 @@ -69,6 +70,12 @@ createMessage.success(JSON.stringify(keys)); } + function handleGetSelectNode() { + const keys = getTree().getSelectedKeys(); + const node = getTree().getSelectedNode(keys[0]); + createMessage.success(node !== null ? JSON.stringify(node) : null); + } + function handleSetExpandData() { getTree().setExpandedKeys(['0-0']); } @@ -120,6 +127,7 @@ handleGetSelectData, handleSetExpandData, handleGetExpandData, + handleGetSelectNode, appendNodeByKey, deleteNodeByKey, updateNodeByKey,