Skip to content

Commit 17c4ccc

Browse files
committed
fix check bug
1 parent 102e251 commit 17c4ccc

File tree

6 files changed

+85
-26
lines changed

6 files changed

+85
-26
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "vue-virtual-tree",
3-
"version": "4.0.5",
3+
"version": "4.0.6",
44
"description": "Tree component for large amount of data, base on Vue3",
55
"scripts": {
66
"start": "vue-cli-service serve",

src/components/VirtualTree/index.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default defineComponent({
5757
const service = new TreeService();
5858

5959
watch(() => props.source, newVal => {
60-
flatList.value = service.flattenTree(newVal, props.defaultSelectedKey, props.defaultCheckedKeys, props.defaultExpandedKeys, props.defaultDisabledKeys);
60+
flatList.value = service.flattenTree(newVal, props.defaultSelectedKey, props.defaultCheckedKeys, props.defaultExpandedKeys, props.defaultDisabledKeys, props.checkStrictly);
6161
// console.log('flatList :>> ', flatList.value);
6262
}, {immediate: true});
6363

@@ -127,11 +127,12 @@ export default defineComponent({
127127
const trueChildren = children.length ? children : cloneDeep(node.children)!;
128128
const selectedKey = service.selectedNodes.value.selected[0]?.nodeKey || service.defaultSelectedKey;
129129
const allExpandedKeys = service.expandedKeys.value.selected.concat(service.defaultExpandedKeys);
130-
const allCheckedKeys = service.checkedNodes.value.selected;
131-
if (service.checkedNodes.value.isSelected(node.nodeKey)) {
130+
const allCheckedKeys = service.checkedNodes.value.selected.concat(service.defaultCheckedKeys);
131+
// !props.checkStrictly &&
132+
if (!props.checkStrictly && service.checkedNodes.value.isSelected(node.nodeKey)) {
132133
allCheckedKeys.push(...trueChildren.map(item => item.nodeKey));
133134
}
134-
node.children = service.flattenTree(trueChildren, selectedKey, uniq(allCheckedKeys), allExpandedKeys, props.defaultDisabledKeys, node);
135+
node.children = service.flattenTree(trueChildren, selectedKey, uniq(allCheckedKeys), allExpandedKeys, props.defaultDisabledKeys, props.checkStrictly, node);
135136
const targetIndex = flatList.value.findIndex(item => item.nodeKey === node.nodeKey);
136137
flatList.value.splice(targetIndex + 1, 0, ...(node.children as Required<TreeNodeOptions>[]));
137138
}
@@ -193,8 +194,9 @@ export default defineComponent({
193194
return service.selectedNodes.value.selected[0];
194195
},
195196
getCheckedNodes: (): TreeNodeOptions[] => {
196-
// return flatList.value.filter(item => service.checkedNodes.value.selected.includes(item.nodeKey));
197-
return service.getCheckedNodes(props.source, service.checkedNodes.value.selected);
197+
return props.loadData
198+
? flatList.value.filter(item => service.checkedNodes.value.selected.includes(item.nodeKey))
199+
: service.getCheckedNodes(props.source, service.checkedNodes.value.selected, props.checkStrictly);
198200
},
199201
getHalfCheckedNodes: (): TreeNodeOptions[] => {
200202
return nodeRefs.value.filter(item => item.halfChecked()).map(item => item.rawNode);

src/components/VirtualTree/service.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class TreeService {
1313
defaultExpandedKeys: NodeKey[] = [];
1414
defaultDisabledKeys: NodeKey[] = [];
1515

16+
// flatSourceTree: TreeNodeOptions[] = [];
1617
flatTree: Required<TreeNodeOptions>[] = [];
1718

1819
constructor() {}
@@ -23,14 +24,14 @@ class TreeService {
2324
defaultCheckedKeys: NodeKey[],
2425
defaultExpandedKeys: NodeKey[],
2526
defaultDisabledKeys: NodeKey[],
27+
checkStrictly = false,
2628
parent: TypeWithNull<Required<TreeNodeOptions>> = null
2729
): Required<TreeNodeOptions>[] {
2830
this.defaultSelectedKey = defaultSelectedKey;
2931
this.defaultCheckedKeys = defaultCheckedKeys;
3032
this.defaultExpandedKeys = defaultExpandedKeys;
3133
this.defaultDisabledKeys = defaultDisabledKeys;
3234
const result: Required<TreeNodeOptions>[] = [];
33-
3435
const recursion = (list: TreeNodeOptions[], parent: TypeWithNull<Required<TreeNodeOptions>> = null) => {
3536
return list.map(item => {
3637
const childrenSize = item.children?.length || 0;
@@ -45,7 +46,7 @@ class TreeService {
4546
let goon = true;
4647
if (parent) {
4748
if (defaultExpandedKeys.includes(parent.nodeKey)) {
48-
if (defaultCheckedKeys.includes(parent.nodeKey)) { // 默认展开并选中了
49+
if (!checkStrictly && defaultCheckedKeys.includes(parent.nodeKey)) { // 默认展开并选中了
4950
defaultCheckedKeys.push(flatNode.nodeKey);
5051
this.checkedNodes.value.select(flatNode.nodeKey);
5152
}
@@ -70,7 +71,7 @@ class TreeService {
7071
if (defaultCheckedKeys.includes(flatNode.nodeKey)) {
7172
this.checkedNodes.value.select(flatNode.nodeKey);
7273
}
73-
74+
7475
if (goon && childrenSize) {
7576
flatNode.children = recursion(flatNode.children, flatNode);
7677
}
@@ -151,24 +152,26 @@ class TreeService {
151152

152153
getCheckedNodes(
153154
source: TreeNodeOptions[],
154-
checkedKeys: NodeKey[]
155+
checkedKeys: NodeKey[],
156+
checkStrictly = false
155157
): TreeNodeOptions[] {
156158
const result: TreeNodeOptions[] = [];
157159
const checkedSize = checkedKeys.length;
158160
// console.log('checkedSize :>> ', checkedSize);
159161
let count = 0;
162+
// console.log('flatSourceTree :>> ', this.flatSourceTree);
160163
const recursion = (list: TreeNodeOptions[], parent: TypeWithNull<TreeNodeOptions> = null) => {
161164
for (const item of list) {
162165
let goon = true;
163166
if (parent) {
164-
if (result.map(rItem => rItem.nodeKey).includes(parent.nodeKey)) {
167+
if (checkedKeys.includes(item.nodeKey)) { // 本身就在checkedKeys里的让它走正常流程
168+
count++;
165169
result.push(item);
166170
} else {
167-
if (checkedKeys.includes(item.nodeKey)) {
168-
count++;
169-
result.push(item);
171+
if (!checkStrictly && result.map(rItem => rItem.nodeKey).includes(parent.nodeKey)) {
172+
result.push(item); // 爹已选中 但自身不在checkedKeys里的让它跟爹走
170173
} else {
171-
if (count >= checkedSize) {
174+
if (count >= checkedSize) { // 爹和自己都没选中,如果checkedKeys里的内容找齐了,结束
172175
goon = false;
173176
}
174177
}

src/doc/AsyncDataDemo.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
<template>
22
<div class="demo">
33
<a-button @click="checkedNodes">获取勾选节点</a-button>
4-
<vir-tree ref="virTree" :source="list" show-checkbox :loadData="loadData" />
4+
<vir-tree
5+
ref="virTree"
6+
:source="list"
7+
show-checkbox
8+
:loadData="loadData"
9+
:default-checked-keys="defaultCheckedKeys"
10+
/>
511
</div>
612
</template>
713

@@ -30,6 +36,7 @@
3036
setup(prop, {emit}) {
3137
const list = ref<TreeNodeOptions[]>([]);
3238
const virTree = ref<TreeInstance | null>(null);
39+
const defaultCheckedKeys = ref([]);
3340
onMounted(() => {
3441
list.value = recursion();
3542
});
@@ -57,6 +64,7 @@
5764
list,
5865
virTree,
5966
loadData,
67+
defaultCheckedKeys,
6068
checkedNodes
6169
}
6270
}

src/doc/CheckboxDemo.vue

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,23 @@
33
<section>
44
<h5>默认父子节点联动</h5>
55
<a-button @click="halfNodes">获取半选节点</a-button>
6-
<a-button @click="checkedNodes">获取勾选节点</a-button>
6+
<!-- <a-button @click="checkedNodes">获取勾选节点</a-button> -->
7+
<!-- :default-expanded-keys="defaultExpandedKeys" -->
78
<vir-tree
89
ref="virTreeOne"
910
show-checkbox
1011
:source="list"
11-
:default-expanded-keys="defaultExpandedKeys"
12+
:default-checked-keys="defaultCheckedKeys"
13+
/>
14+
</section>
15+
<section>
16+
<h5>父子节点不联动</h5>
17+
<a-button @click="checkedNodes">获取勾选节点</a-button>
18+
<vir-tree
19+
ref="virTreeTwo"
20+
show-checkbox
21+
check-strictly
22+
:source="list"
1223
:default-checked-keys="defaultCheckedKeys"
1324
/>
1425
</section>
@@ -28,13 +39,13 @@
2839
nodeKey,
2940
name: nodeKey,
3041
children: [],
31-
// hasChildren: true
42+
hasChildren: true
3243
};
3344
3445
if (level > 0) {
3546
treeNode.children = recursion(nodeKey, level - 1);
3647
} else {
37-
// treeNode.hasChildren = false;
48+
treeNode.hasChildren = false;
3849
}
3950
4051
list.push(treeNode);
@@ -48,17 +59,18 @@
4859
const list = ref<TreeNodeOptions[]>([]);
4960
const virTreeOne = ref<TreeInstance | null>(null);
5061
const virTreeTwo = ref<TreeInstance | null>(null);
51-
const defaultExpandedKeys = ref(['0-3']);
62+
const defaultExpandedKeys = ref(['0-2']);
5263
const defaultCheckedKeys = ref(['0-0-0', '0-2']);
5364
65+
5466
onMounted(() => {
5567
list.value = recursion();
5668
});
5769
const halfNodes = () => {
5870
getHalfCheckNodes(virTreeOne.value!);
5971
}
6072
const checkedNodes = () => {
61-
getCheckNodes(virTreeOne.value!);
73+
getCheckNodes(virTreeTwo.value!);
6274
}
6375
return {
6476
list,

src/doc/index.vue

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,29 @@
3838
<section class="sec mid">
3939
<a-typography-title :level="3">代码演示</a-typography-title>
4040
<a-row :gutter="16" class="demo-boxes">
41+
<a-col :span="12">
42+
<demo-box
43+
id="base-demo"
44+
title="基本用法"
45+
desc="展开、选中、禁用的基本功能"
46+
code-type="base">
47+
<base-demo />
48+
</demo-box>
49+
<demo-box
50+
id="async-dada-demo"
51+
title="异步加载数据"
52+
desc="点击展开节点,动态加载数据。"
53+
code-type="asyncData">
54+
<async-data-demo />
55+
</demo-box>
56+
<demo-box
57+
id="custom-icon-demo"
58+
title="自定义图标"
59+
desc="自定义展开、收起图标"
60+
code-type="customIcon">
61+
<custom-icon-demo />
62+
</demo-box>
63+
</a-col>
4164
<a-col :span="12">
4265
<demo-box
4366
id="checkbox-demo"
@@ -46,6 +69,20 @@
4669
code-type="checkbox">
4770
<checkbox-demo />
4871
</demo-box>
72+
<demo-box
73+
id="custom-node-demo"
74+
title="自定义渲染节点"
75+
desc="绑定render函数自定义节点,参数data为当前node数据。注意:如果改变了默认的高度(size), 需要传入size属性"
76+
code-type="customNode">
77+
<custom-node-demo />
78+
</demo-box>
79+
<demo-box
80+
id="search-node-demo"
81+
title="搜索树"
82+
desc="虽然组件内部没有直接提供,但可以配合render自行实现"
83+
code-type="searchNode">
84+
<search-node-demo />
85+
</demo-box>
4986
</a-col>
5087
</a-row>
5188
</section>
@@ -116,9 +153,6 @@
116153
h3 {
117154
font-size: $font-size-huge;
118155
}
119-
.demo-boxes {
120-
121-
}
122156
}
123157
}
124158

0 commit comments

Comments
 (0)