背景:在业务逻辑中需要用到el-cascader级联选择器懒加载+多选功能,在回显的过程中遇到了无法回显的情况,按网上方法排查了回显值格式等问题终究没有解决。
解决方案:使用el-cascader-plus进行实现级联选择器懒加载+多选+回显功能
第一步:安装el-cascader-plus
npm i el-cascader-plus --save
第二步:使用el-cascader-plus
如需全局使用就在 main.js 中添加以下代码
import elCascaderPlus from "el-cascader-plus";
Vue.use(elCascaderPlus);
在组件中单独使用在文件内添加以下代码
import elCascaderPlus from "el-cascader-plus";
export default {
name: "demo",
components: {
elCascaderPlus,
},
};
亲测完整代码示例
html
<template>
<div class="demo">
<el-cascader-plus v-model="value" :props="nodeprop"></el-cascader-plus>
</div>
</template>
<script>
import elCascaderPlus from "el-cascader-plus";
export default {
name: "demo",
components: {
elCascaderPlus,
},
data() {
return {
nodeprop: {
lazy: true,
multiple: true,
lazyLoad: this.lazyLoads,
leaf: "leaf"
},
}
}
methods: {
async lazyLoads(node, resolve) {
if (node.level == 0) {
let res = await this.getOther(0);//请求接口获取一级数据
resolve(res);
} else {
let res = await this.getOther(node.value);//请求接口获取子级数据
setTimeout(() => {
resolve(res);
}, 200);
}
},
}
};
</script>
官方完整代码示例
<template>
<div class="demo">
<div class="mg20 title">el-cascader-plus</div>
<div class="mg20">
<div class="mg20">el-cascader-plus单选</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="value"
@change="change"
:options="options"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus单选不关联</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="value1"
:props="{ checkStrictly: true }"
@change="change"
:options="options"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus多选</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="multipleValue"
:props="{ multiple: true }"
@change="change"
:options="options"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus多选不关联</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="multipleValue1"
:props="{ multiple: true, checkStrictly: true }"
@change="change"
:options="options"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus懒加载单选</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="value"
:props="props"
@change="change"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus懒加载单选不关联</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="value1"
:props="{ ...props, checkStrictly: true }"
@change="change"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus懒加载多选</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="multipleValue"
:props="{ ...props, multiple: true }"
@change="change"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus懒加载多选不关联</div>
<el-cascader-plus
style="width: 400px"
ref="cascader"
v-model="multipleValue1"
:props="{ ...props, multiple: true, checkStrictly: true }"
@change="change"
></el-cascader-plus>
</div>
<div class="mg20">
<div class="mg20">el-cascader-plus懒加载设置maxLevel为1</div>
<el-cascader-plus
:maxLevel="1"
style="width: 400px"
v-model="value2"
:props="props"
></el-cascader-plus>
</div>
</div>
</template>
<script>
import elCascaderPlus from "el-cascader-plus";
export default {
name: "demo",
components: {
elCascaderPlus,
},
data() {
return {
res: [],
// 级联懒加载
props: {
multiple: false,
lazy: true,
lazyLoad: this.getNode,
},
value: [17, 18, 19],
value1: [17, 18, 19],
value2: [],
multipleValue: [[17, 18, 19]],
multipleValue1: [[17, 18, 19]],
options: [
{
value: 1,
label: "东南",
children: [
{
value: 2,
label: "上海",
children: [
{
value: 3,
label: "普陀",
leaf: true,
},
{
value: 4,
label: "黄埔",
leaf: true,
},
{
value: 5,
label: "徐汇",
leaf: true,
},
],
},
{
value: 7,
label: "江苏",
children: [
{
value: 8,
label: "南京",
leaf: true,
},
{
value: 9,
label: "苏州",
leaf: true,
},
{
value: 10,
label: "无锡",
leaf: true,
},
],
},
{
value: 12,
label: "浙江",
children: [
{
value: 13,
label: "杭州",
leaf: true,
},
{
value: 14,
label: "宁波",
leaf: true,
},
{
value: 15,
label: "嘉兴",
leaf: true,
},
],
},
],
},
{
value: 17,
label: "西北",
children: [
{
value: 18,
label: "陕西",
children: [
{
value: 19,
label: "西安",
leaf: true,
},
{
value: 20,
label: "延安",
leaf: true,
},
],
},
{
value: 21,
label: "新疆维吾尔自治区",
children: [
{
value: 22,
label: "乌鲁木齐",
leaf: true,
},
{
value: 23,
label: "克拉玛依",
leaf: true,
},
],
},
],
},
],
};
},
watch: {},
methods: {
change(e) {
console.log(e);
},
// 获取当前点击节点的子node,根据node数据和后端交互,此处为模拟后端请求
async getNode(node, resolve) {
const {
level, //层级
value,
data,
} = node;
// 模拟后端请求
// 0级处理
if (level == 0) {
let options = JSON.parse(JSON.stringify(this.options));
let nodes = options.map((v, index) => {
delete v.children;
return {
...v,
};
});
setTimeout(() => resolve(nodes), 500);
} else {
this.res = [];
let options = JSON.parse(JSON.stringify(this.options));
for (let i = 0; i < options.length; i++) {
this.findChildren(options[i], value);
}
// 去除子集的children
let nodes = [];
if (this.res.length) {
nodes = this.res.map((v, index) => {
delete v.children;
return {
...v,
};
});
}
setTimeout(() => resolve(nodes), 500);
}
},
// 找到某个树节点并返回子集
findChildren(item, cid, flag = false) {
if (item.value == cid) {
flag = true;
}
if (flag && item.children && item.children.length) {
this.res = [];
this.res = item.children;
}
if (!item.children) {
return;
} else {
item.children.forEach((child) => {
this.findChildren(child, cid, false);
});
}
},
},
};
</script>
<style>
.mg20 {
margin-top: 20px;
}
.title {
font-weight: bold;
font-size: 26px;
}
</style>