# d-cascader 多选级联
# 何时使用
常规的 使用`a-cascader`
d-cascader
是一个基于 ant-design-vue
中的 a-cascader
组件扩展的多功能级联选择组件(但未使用 a-cascader
组件,故不能全使用里面的属性等,以文中属性为主),提供以下增强功能:
# 代码演示
支持多选模式的级联选择,允许用户在多个级别中进行选择
显示代码
<template>
<div>
<d-cascader
:options="options"
placeholder="请选择"
v-model="form.selectValue"
></d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: ["320000"],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
显示代码
组件会自动筛选并仅显示当前已选中子节点的选项。
显示代码
<template>
<div>
<d-cascader
:options="options"
placeholder="请选择"
v-model="form.selectValue"
showCheckedChild
></d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
显示代码
提供全选按钮,允许用户在当前级别上快速选择所有选项。
显示代码
<template>
<div>
<d-cascader
:options="options"
v-model="form.selectValue"
showSelectAll
></d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: ["320000"],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
显示代码
label 和 key 被包装到 value 中,便于处理和显示自定义数据。
显示代码
<template>
<div>
<d-cascader
:options="options"
placeholder="Please select"
labelInValue
v-model="form.selectValue"
>
</d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
显示代码
允许用户自定义下拉选项的显示数据和格式。
显示代码
<template>
<div>
<d-cascader
:options="options"
placeholder="Please select"
showSelectAll
v-model="form.selectValue"
>
<template #optionRender="{ option }">
{{ option.label }} ({{ option.value }})
</template>
</d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
显示代码
返回值格式为 [{ label: **,key: ** }] , 因为处理后的数据逻辑 key 值 会变化,
采用这种方式,要么 key 使用 fieldNames 中的 value 值, 要么通过 deselect 自己进行删除处理逻辑
显示代码
<template>
<div>
<d-cascader
:options="options"
v-model="form.selectValue"
:displayRender="displayRender1"
>
</d-cascader>
<d-cascader
:options="options"
v-model="form.selectValue"
:displayRender="displayRender"
@deselect="deselect"
style="margin-top: 24px"
>
<template #optionRender="{ option }">
{{ option.label }} ({{ option.value }})
</template>
</d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {
displayRender1(itemArr, pItem) {
return pItem.map((v) => {
console.log(v);
return {
key: v.value,
label: `${v.label}(${v.id})`,
};
});
},
displayRender(itemArr, pItem) {
const _levObj = {
1: {
num: 0,
prev: "省",
next: "个",
},
2: {
num: 0,
prev: "市",
next: "个",
},
3: {
num: 0,
prev: "区",
next: "个",
},
};
if (!pItem.length) return [];
const arr = [];
pItem.forEach((v) => {
_levObj[v.level].num++;
});
for (const key in _levObj) {
if (Object.prototype.hasOwnProperty.call(_levObj, key)) {
arr.push(
`${_levObj[key].prev}${_levObj[key].num}${_levObj[key].next}`
);
}
}
return arr;
},
deselect(val) {
// 自己删除的处理逻辑
// console.log(val)
},
},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
显示代码
支持自定义字段名称,以适应不同的数据结构需求。
显示代码
<template>
<d-cascader
:options="options"
:fieldNames="{ label: 'label', value: 'id', children: 'children' }"
v-model="form.selectValue"
></d-cascader>
</template>
<script>
import baseMixin from './baseMixin'
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
显示代码
提供自定义配置,用于定制当没有数据时 option 面板的显示效果,提升用户体验。
显示代码
<template>
<div>
<d-cascader
:options="[]"
placeholder="Please select"
showSelectAll
v-model="form.selectValue"
>
</d-cascader>
<d-cascader
:options="[]"
placeholder="Please select"
style="margin-top: 24px"
showSelectAll
v-model="form.selectValue"
no-data-text="没得数据"
>
</d-cascader>
<d-cascader
:options="[]"
placeholder="Please select"
showSelectAll
v-model="form.selectValue"
style="margin-top: 24px"
>
<template #noDataContent>
<a-empty />
</template>
</d-cascader>
</div>
</template>
<script>
export default {
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
显示代码
遇到超出边界,为了显示 options 数据,而又不愿意移位置到其他地方化的,可以试试这个属性。
显示代码
<template>
<div>
<d-cascader
:options="options"
placeholder="请选择"
v-model="form.selectValue"
allow-resize
></d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: ["320000"],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
显示代码
loadData 函数:加载数据并根据 isLeaf 确定是否需要加载下一级。
处理异步操作:确保异步操作完成后再处理后续逻辑。
loadData 必须处理完异步操作,组件还需要处理后面的逻辑,所以需要使用到 promise 或 async
显示代码
<template>
<div>
<d-cascader
:options="options"
v-model="form.selectValue"
:load-data="loadData"
:fieldNames="{ children: 'child' }"
></d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: [],
},
};
},
created() {},
methods: {
async loadData(item) {
// 模拟数据
if (item.child) return;
item.$loading = true;
await this.delay(1000)
item.child = item.children.map((v) => {
v.disabled = Number(v.id) % 6 === 1;
v.isLeaf = v.level === 3;
return v;
});
item.$loading = false;
},
},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
显示代码
optionFilterProp 搜索查询某字段 (默认 label (fieldNames 中的label属性))
目前只能过滤当前已经存在的数据,远程的,无法过滤
显示代码
<template>
<div>
<d-cascader
:options="options"
placeholder="请选择"
showSearch
v-model="form.selectValue"
></d-cascader>
</div>
</template>
<script>
import baseMixin from "./baseMixin";
export default {
mixins: [baseMixin],
data() {
return {
form: {
selectValue: ["320000"],
},
};
},
created() {},
methods: {},
};
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
显示代码