Skip to content

Commit 4540cb1

Browse files
xingyan95kagol
authored andcommitted
fix(Tree): 解决节点初始化选中时,点击其他节点不会取消选中的问题
1 parent 6ccf28e commit 4540cb1

File tree

4 files changed

+59
-12
lines changed

4 files changed

+59
-12
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { IInnerTreeNode, IUseInitSelectCollection } from './use-tree-types';
2+
3+
let selectedNodes: IInnerTreeNode[] = [];
4+
5+
export default function useInitSelectCollection(): IUseInitSelectCollection {
6+
const setInitSelectedNode = (node: IInnerTreeNode): void => {
7+
selectedNodes.push(node);
8+
};
9+
10+
const getInitSelectedNodes = (): IInnerTreeNode[] => {
11+
return selectedNodes;
12+
};
13+
14+
const clearInitSelectedNodes = (): void => {
15+
selectedNodes = [];
16+
};
17+
18+
return {
19+
setInitSelectedNode,
20+
getInitSelectedNodes,
21+
clearInitSelectedNodes,
22+
};
23+
}

packages/devui-vue/devui/tree/src/composables/use-select.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,29 @@
11
import { Ref, SetupContext } from 'vue';
2+
import useInitSelectCollection from './use-init-select-collection';
23
import { IInnerTreeNode, IUseCore, IUseSelect } from './use-tree-types';
34

45
export default function () {
56
return function useSelect(data: Ref<IInnerTreeNode[]>, core: IUseCore, context: SetupContext): IUseSelect {
67
const { setNodeValue } = core;
8+
const { getInitSelectedNodes, clearInitSelectedNodes } = useInitSelectCollection();
79

810
let prevActiveNode: IInnerTreeNode;
911

1012
const selectNode = (node: IInnerTreeNode): void => {
11-
if (node.disableSelect) { return; }
13+
if (node.disableSelect) {
14+
return;
15+
}
16+
17+
const initSelectedNodes = getInitSelectedNodes();
18+
if (initSelectedNodes.length) {
19+
initSelectedNodes.forEach((item) => {
20+
setNodeValue(item, 'selected', false);
21+
});
22+
clearInitSelectedNodes();
23+
}
1224

1325
if (prevActiveNode) {
14-
const prevActiveNodeIndex = data.value.findIndex(item => item.id === prevActiveNode.id);
26+
const prevActiveNodeIndex = data.value.findIndex((item) => item.id === prevActiveNode.id);
1527
setNodeValue(data.value[prevActiveNodeIndex], 'selected', false);
1628
}
1729

@@ -34,7 +46,7 @@ export default function () {
3446
};
3547

3648
const getSelectedNode = (): IInnerTreeNode => {
37-
return data.value.find(node => node.selected);
49+
return data.value.find((node) => node.selected);
3850
};
3951

4052
return {

packages/devui-vue/devui/tree/src/composables/use-tree-types.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ export interface IUseLazyLoad {
9696
lazyLoadNodes: (node: IInnerTreeNode) => void;
9797
}
9898

99+
export interface IUseInitSelectCollection {
100+
setInitSelectedNode: (node: IInnerTreeNode) => void;
101+
getInitSelectedNodes: () => IInnerTreeNode[];
102+
clearInitSelectedNodes: () => void;
103+
}
104+
99105
export interface SearchFilterOption {
100106
isFilter: boolean; // 是否是过滤节点
101107
matchKey?: string; // node节点中匹配搜索过滤的字段名
@@ -110,14 +116,14 @@ export interface IUseSearchFilter {
110116
export type IUseTree = {
111117
treeData: Ref<IInnerTreeNode[]>;
112118
} & IUseCore &
113-
IUseToggle &
114-
IUseSelect &
115-
IUseCheck &
116-
IUseDisable &
117-
IUseOperate &
118-
IUseMergeNodes &
119-
IUseLazyLoad &
120-
IUseSearchFilter;
119+
IUseToggle &
120+
IUseSelect &
121+
IUseCheck &
122+
IUseDisable &
123+
IUseOperate &
124+
IUseMergeNodes &
125+
IUseLazyLoad &
126+
IUseSearchFilter;
121127

122128
export type ICheckStrategy = 'upward' | 'downward' | 'both' | 'none';
123129

packages/devui-vue/devui/tree/src/composables/utils.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { randomId } from '../../../shared/utils';
2+
import useInitSelectCollection from './use-init-select-collection';
23
import { IInnerTreeNode, ITreeNode } from './use-tree-types';
34

45
export function flatToNested(flatTree: IInnerTreeNode[]): ITreeNode[] {
@@ -44,8 +45,9 @@ export function omit<T>(obj: T, ...keys: Array<keyof T>): { [key: string]: unkno
4445
* - 'isLeaf':是否是叶子节点,用于决定是否渲染展开/收起按钮
4546
* - 'idType':(没有传入 id 的节点会生成一个随机的 id,idType 用来标识 id 是否是随机生成的)
4647
* - 'parentChildNodeCount':父级子节点数量
47-
* - 'curentIndex':当前节点在父节点的索引
48+
* - 'currentIndex':当前节点在父节点的索引
4849
*/
50+
const { setInitSelectedNode } = useInitSelectCollection();
4951
export function generateInnerTree(tree: ITreeNode[], key = 'children', level = 0, path: ITreeNode[] = []): IInnerTreeNode[] {
5052
level++;
5153

@@ -56,6 +58,10 @@ export function generateInnerTree(tree: ITreeNode[], key = 'children', level = 0
5658
newItem.idType = 'random';
5759
}
5860

61+
if (newItem.selected) {
62+
setInitSelectedNode(newItem);
63+
}
64+
5965
newItem.level = level;
6066
newItem.parentChildNodeCount = tree.length;
6167
newItem.currentIndex = currentIndex;

0 commit comments

Comments
 (0)