Skip to content

Commit 3a9a535

Browse files
committed
feat(catalogue): change some utils method
re #607
1 parent 5fe556b commit 3a9a535

File tree

5 files changed

+83
-39
lines changed

5 files changed

+83
-39
lines changed

src/catalogue/demos/async.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { useEffect } from 'react';
22
import { Catalogue } from 'dt-react-component';
33
import { useTreeData } from 'dt-react-component/catalogue/useTreeData';
4-
import { insertChildIntoNode } from 'dt-react-component/catalogue/utils';
4+
import { addChildrenIntoNode } from 'dt-react-component/catalogue/utils';
55

66
interface DataNode {
77
title: string;
@@ -30,7 +30,7 @@ const App: React.FC = () => {
3030
return;
3131
}
3232
setTimeout(() => {
33-
const newData = insertChildIntoNode(treeData.data, key, [
33+
const newData = addChildrenIntoNode(treeData.data, key, [
3434
{ title: 'Child Node', key: `${key}-0` },
3535
{ title: 'Child Node', key: `${key}-1` },
3636
]);

src/catalogue/demos/config.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { cloneDeep } from 'lodash-es';
88
import shortid from 'shortid';
99

1010
import {
11-
appendNodeByKey,
11+
addChildrenIntoNode,
1212
findNodeByKey,
1313
findParentNodeByKey,
1414
removeEditNode,
@@ -83,7 +83,13 @@ export default () => {
8383

8484
const handleAdd = (key: ITreeNode<IData>['key']) => {
8585
const newExpandedKeys = treeData.expandedKeys ? [...treeData.expandedKeys] : [];
86-
const data = appendNodeByKey<IData>(treeData.data, key);
86+
const data = addChildrenIntoNode<IData>(treeData.data, key, [
87+
{
88+
key: 'new_',
89+
title: '',
90+
edit: true,
91+
},
92+
]);
8793
if (!newExpandedKeys?.includes(key)) {
8894
newExpandedKeys.push(key);
8995
}

src/catalogue/demos/drag.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { cloneDeep } from 'lodash-es';
88
import shortid from 'shortid';
99

1010
import {
11-
appendNodeByKey,
11+
addChildrenIntoNode,
1212
findNodeByKey,
1313
findParentNodeByKey,
1414
removeEditNode,
@@ -77,7 +77,9 @@ export default () => {
7777

7878
const handleAdd = (key: ITreeNode<IData>['key']) => {
7979
const newExpandedKeys = treeData.expandedKeys ? [...treeData.expandedKeys] : [];
80-
const data = appendNodeByKey<IData>(treeData.data, key);
80+
const data = addChildrenIntoNode<IData>(treeData.data, key, [
81+
{ key: 'new_', title: '', edit: true },
82+
]);
8183
if (!newExpandedKeys?.includes(key)) {
8284
newExpandedKeys.push(key);
8385
}

src/catalogue/demos/operator.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { cloneDeep } from 'lodash-es';
77
import shortid from 'shortid';
88

99
import {
10-
appendNodeByKey,
10+
addChildrenIntoNode,
1111
findNodeByKey,
1212
findParentNodeByKey,
1313
removeEditNode,
@@ -130,7 +130,9 @@ export default () => {
130130

131131
const handleAdd = (key: ITreeNode<IData>['key']) => {
132132
const newExpandedKeys = treeData.expandedKeys ? [...treeData.expandedKeys] : [];
133-
const data = appendNodeByKey<IData>(treeData.data, key);
133+
const data = addChildrenIntoNode<IData>(treeData.data, key, [
134+
{ key: 'new_', title: '', edit: true },
135+
]);
134136
if (!newExpandedKeys?.includes(key)) {
135137
newExpandedKeys.push(key);
136138
}

src/catalogue/utils.tsx

Lines changed: 65 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -102,29 +102,6 @@ export const findParentNodeByKey = <U extends { edit?: boolean }>(
102102
return null;
103103
};
104104

105-
/**
106-
* 在 key 节点中添加子节点
107-
* @param data 遍历的数组
108-
* @param key 当前 key 值
109-
* @returns 插入新数据之后的 data
110-
*/
111-
export const appendNodeByKey = <U extends { edit?: boolean }>(
112-
data: ITreeNode<U>[],
113-
key: ITreeNode<U>['key']
114-
): ITreeNode<U>[] => {
115-
const newNode = { key: 'new_', title: '', edit: true };
116-
return data.map((node) => {
117-
if (node.key === key) {
118-
const updatedChildren = node.children ? [...node.children, newNode] : [newNode];
119-
return { ...node, children: updatedChildren };
120-
}
121-
if (node.children) {
122-
return { ...node, children: appendNodeByKey(node.children, key) };
123-
}
124-
return node;
125-
});
126-
};
127-
128105
/**
129106
* 移除 key 节点
130107
* @param data 遍历的数组
@@ -165,27 +142,84 @@ export const removeEditNode = <U extends { edit?: boolean }>(
165142
};
166143

167144
/**
168-
*
145+
* 在指定节点的子节点列表中添加一组子节点,可以选择添加在开头或结尾
146+
* @param treeData 要操作的树节点数组
147+
* @param key 要添加子节点的目标节点 key
148+
* @param children 要添加的子节点数组
149+
* @param beforeKey 是否将子节点添加到现有子节点之前,true 表示添加到开头,false 表示添加到结尾
150+
* @returns 更新后的树节点数组
169151
*/
170-
171-
export const insertChildIntoNode = <U extends { edit?: boolean }>(
152+
export const addChildrenIntoNode = <U extends { edit?: boolean }>(
172153
treeData: ITreeNode<U>[],
173154
key: ITreeNode<U>['key'],
174-
children: ITreeNode<U>[]
175-
): ITreeNode<U>[] => {
176-
return treeData.map((node) => {
155+
children: ITreeNode<U>[],
156+
beforeKey = true
157+
): ITreeNode<U>[] =>
158+
treeData.map((node) => {
159+
const updatedChildren = beforeKey
160+
? [...children, ...(node.children || [])]
161+
: [...(node.children || []), ...children];
177162
if (node.key === key) {
178163
return {
179164
...node,
180-
children,
165+
children: node.children ? updatedChildren : children,
181166
};
182167
}
183168
if (node.children) {
184169
return {
185170
...node,
186-
children: insertChildIntoNode(node.children, key, children),
171+
children: addChildrenIntoNode(node.children, key, children, beforeKey),
187172
};
188173
}
189174
return node;
190175
});
176+
177+
/**
178+
* @description 在树节点数组中查找指定 key 的节点索引
179+
* @param 要搜索的树节点数组
180+
* @param 要查找的节点 key
181+
* @returns 找到的节点索引,如果未找到则返回 -1
182+
*/
183+
export const findChildIndex = <U extends { edit?: boolean }>(
184+
data: ITreeNode<U>[],
185+
key: ITreeNode<U>['key']
186+
): number => {
187+
const findIndex = data.findIndex((item) => item.key === key);
188+
return findIndex;
189+
};
190+
191+
/**
192+
* 在树节点数组中,根据指定的 key 找到目标节点,并将新节点插入到目标节点之前或之后。
193+
* @param {ITreeNode<U>[]} treeData - 要操作的树节点数组。
194+
* @param {ITreeNode<U>['key']} currentKey - 目标节点的 key。
195+
* @param {ITreeNode<U>} node - 要插入的新节点。
196+
* @param {boolean} [beforeKey=true] - 是否将新节点插入到目标节点之前。true 表示之前,false 表示之后。
197+
* @returns {ITreeNode<U>[]} 更新后的树节点数组。
198+
*/
199+
export const insertNodeAtKey = <U extends { edit?: boolean }>(
200+
treeData: ITreeNode<U>[],
201+
currentKey: ITreeNode<U>['key'],
202+
node: ITreeNode<U>,
203+
beforeKey = true
204+
): ITreeNode<U>[] => {
205+
const newTreeData: ITreeNode<U>[] = [];
206+
for (const item of treeData) {
207+
if (item.key === currentKey) {
208+
if (beforeKey) {
209+
newTreeData.push(node);
210+
newTreeData.push(item);
211+
} else {
212+
newTreeData.push(item);
213+
newTreeData.push(node);
214+
}
215+
} else {
216+
newTreeData.push({
217+
...item,
218+
children: item.children
219+
? insertNodeAtKey(item.children, currentKey, node, beforeKey)
220+
: item.children,
221+
});
222+
}
223+
}
224+
return newTreeData;
191225
};

0 commit comments

Comments
 (0)