Skip to content

Commit e6b9712

Browse files
authored
feat(tree):增加 insertBefore 方法 (DevCloudFE#408)
* docs(tree): 补充generateInnerTree方法的文档 * feat(tree): 增加insertBefore方法
1 parent e3bb8fa commit e6b9712

File tree

5 files changed

+51
-15
lines changed

5 files changed

+51
-15
lines changed

packages/devui-vue/devui/tree/src/core/use-operate.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,44 @@ import { IInnerTreeNode, ITreeNode, IUseCore } from './use-tree-types';
44
export default function useOperate(data: Ref<IInnerTreeNode[]>, core: IUseCore) {
55
console.log('useOperate:', data, data.value);
66

7-
const { setNodeValue, getChildren } = core;
7+
const { setNodeValue, getChildren, getIndex, getLevel } = core;
88

9-
const insertBefore = (parentNode: ITreeNode, node: ITreeNode, referenceNode: ITreeNode, cut: boolean = false): void => {
10-
// TODO
9+
const insertBefore = (
10+
parentNode: ITreeNode,
11+
node: ITreeNode,
12+
referenceNode: ITreeNode,
13+
): void => {
14+
const children = getChildren(parentNode);
15+
const lastChild = children[children.length - 1];
16+
let insertedIndex = getIndex(parentNode) + 1;
17+
18+
if (referenceNode) {
19+
insertedIndex = getIndex(referenceNode);
20+
} else if (lastChild) {
21+
insertedIndex = getIndex(lastChild) + 1;
22+
}
23+
24+
setNodeValue(parentNode, 'expanded', true);
25+
setNodeValue(parentNode, 'isLeaf', false);
26+
27+
const currentNode = {
28+
...node,
29+
level: getLevel(parentNode) + 1,
30+
parentId: parentNode.id,
31+
isLeaf: true,
32+
};
33+
34+
data.value = data.value.slice(0, insertedIndex)
35+
.concat(
36+
currentNode,
37+
data.value.slice(insertedIndex, data.value.length)
38+
);
1139
}
1240

1341
const removeNode = (node: ITreeNode): void => {
1442
data.value = data.value.filter(item => {
1543
return item.id !== node.id && !getChildren(node).map(nodeItem => nodeItem.id).includes(item.id);
16-
})
44+
});
1745
}
1846

1947
const editNode = (node: IInnerTreeNode, label: string): void => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export interface IUseDisable {
5151
}
5252

5353
export interface IUseOperate {
54-
insertBefore: (parentNode: ITreeNode, node: ITreeNode, referenceNode: ITreeNode, cut: boolean) => void;
54+
insertBefore: (parentNode: ITreeNode, node: ITreeNode, referenceNode: ITreeNode) => void;
5555
removeNode: (node: ITreeNode) => void;
5656
editNode: (node: ITreeNode, label: string) => void;
5757
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,21 @@ export function flatToNested(flatTree: IInnerTreeNode[]): ITreeNode[] {
2323
}, []);
2424
}
2525

26+
/**
27+
* 用于生成内部使用的扁平结构,对树的所有操作都是在操作这个内部的扁平结构,
28+
* 该数据一旦发生变化,树组件的 UI 即相应变化。
29+
*
30+
* @param tree 原始嵌套结构的树数据
31+
* @param key 子节点key,默认为'children'
32+
* @returns 扁平结构的树数据
33+
*
34+
* 将嵌套结构拍平之后,增加了
35+
* - 'id':唯一标识一个树节点
36+
* - 'parentId':父节点
37+
* - 'level':所属的节点层级
38+
* - 'isLeaf':是否是叶子节点,用于决定是否渲染展开/收起按钮
39+
* - 'idType'(没有传入 id 的节点会生成一个随机的 id,idType 用来标识 id 是否是随机生成的)
40+
*/
2641
export function generateInnerTree(
2742
tree: ITreeNode[],
2843
key = 'children',

packages/devui-vue/devui/tree/src/new-tree.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import useCheck from './core/use-check';
88
import useSelect from './core/use-select';
99
import { USE_TREE_TOKEN } from './const';
1010
import './tree.scss';
11+
import useOperate from './core/use-operate';
1112

1213
export default defineComponent({
1314
name: 'DNewTree',
@@ -22,13 +23,14 @@ export default defineComponent({
2223

2324
const treeFactory = useTree(
2425
data.value,
25-
[useSelect, useCheck]
26+
[useSelect, useCheck, useOperate]
2627
);
2728

2829
const {
2930
setTree,
3031
getExpendedTree,
3132
toggleNode,
33+
insertBefore,
3234
} = treeFactory;
3335

3436
// 外部同步内部

packages/devui-vue/docs/components/tree/index.md

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,6 @@ export default defineComponent({
10371037

10381038
```vue
10391039
<template>
1040-
<d-button @click="changeData">changeData</d-button>
10411040
<d-new-tree :data="data">
10421041
<template #content="{nodeData}">
10431042
<svg t="1649231851892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2194" width="16" height="16"><path d="M946.5 505L560.1 118.8l-25.9-25.9c-12.3-12.2-32.1-12.2-44.4 0L77.5 505c-12.3 12.3-18.9 28.6-18.8 46 0.4 35.2 29.7 63.3 64.9 63.3h42.5V940h691.8V614.3h43.4c17.1 0 33.2-6.7 45.3-18.8 12.1-12.1 18.7-28.2 18.7-45.3 0-17-6.7-33.1-18.8-45.2zM568 868H456V664h112v204z m217.9-325.7V868H632V640c0-22.1-17.9-40-40-40H432c-22.1 0-40 17.9-40 40v228H238.1V542.3h-96l370-369.7 23.1 23.1L882 542.3h-96.1z" p-id="2195"></path></svg>
@@ -1119,16 +1118,8 @@ export default defineComponent({
11191118
}
11201119
]);
11211120
1122-
const changeData = () => {
1123-
data.value = data.value.concat({
1124-
label: 'Leaf node 1-4',
1125-
id: 'node-1-4'
1126-
});
1127-
}
1128-
11291121
return {
11301122
data,
1131-
changeData,
11321123
}
11331124
}
11341125
})

0 commit comments

Comments
 (0)