vue里使用elementui的级联选择器el-cascader进行懒加载的怎么实现数据回显?

简介: vue里使用elementui的级联选择器el-cascader进行懒加载的怎么实现数据回显?

需要实现的懒加载回显效果

比如:后端返回数据 广东省/广州市/天河区440000000000/440100000000/440106000000,需要我们自动展开到天河区的下一级,效果如下

代码实现

我的实现思路就是拿到 440000000000/440100000000/440106000000 每一层级的数据,然后组成一个树。

这里接口 getAreaList 返回的数据格式如下:

[
  {
    areaCode: "440106000000",
    areaLevel: "4",
    areaName: "天河区",
    areaSeq: "5",
    childNum: 21,
    parentAreaSeq: "xxx"
  }
]

组件试下如下:

<template>
    <div class="cascader-lazy">
        <h2>需要回显的地区:广东省/广州市/天河区</h2>
        <h3>需要回显的地区对应的编码:440000000000/440100000000/440106000000</h3>
        <el-cascader ref="cascaderLazy" :options="dataList" :props="props" v-model="areaList" />
    </div>
</template>
<script>
import axios from "axios";
export default {
    name: "CascaderLazy",
    data() {
        return {
            areaList: [],
            dataList: [],
            props: {
                value: "areaCode",
                label: "areaName",
                lazy: true,
                lazyLoad: this.lazyLoad
            }
        };
    },
    mounted() {
        this.areaList = ["440000000000", "440100000000", "440106000000"];
        this.loadOptions(this.areaList);
    },
    methods: {
        // 获取数据
        getAreaList(parentAreaSeq) {
            return new Promise(async (resolve, reject) => {
                try {
                    const response = await axios.get("xxxx", {
                        params: {
                            parentAreaSeq: parentAreaSeq
                        }
                    });
                    resolve(
                        response.data.data.map((el) => {
                            el.leaf = el.childNum === 0;
                            return el;
                        })
                    );
                } catch (error) {
                    console.error(error);
                    reject();
                }
            });
        },
        // 遍历一级选择框,把二级选择框的数据放在一级的children属性上
        async loadOptions(areaList) {
            // 先初始调用一次
            let tempArr = [];
            let initRes = await this.getAreaList();
            tempArr.push(initRes);
            // 然后遍历 areaList 找到对应的 areaSeq 获取地区列表
            for (let i = 0; i < areaList.length; i++) {
                if (areaList.length > 0) {
                    let areaSeq = "";
                    areaSeq = tempArr[i].filter((el) => el.areaCode === areaList[i]).map((el) => el.areaSeq)[0];
                    let res = await this.getAreaList(areaSeq);
                    tempArr.push(res);
                }
            }
            // 先加一个最后层级的地区用于展示,最后在删掉
            if (tempArr[areaList.length][0]) {
                areaList.push(tempArr[areaList.length][0].areaCode);
            }
            // 从后面开始遍历组成一个树
            for (let len = tempArr.length - 1; len >= 0; len--) {
                if (len - 1 < 0) break;
                // 给当前areaCode添加children
                tempArr[len - 1].forEach((item) => {
                    if (item.areaCode === areaList[len - 1]) {
                        item.children = tempArr[len];
                    }
                });
            }
            this.dataList = tempArr[0];
            // 删掉最后选中的
            this.$nextTick(() => {
                areaList.pop();
                // 点击自动下拉出来
                this.$refs.cascaderLazy.$el.click();
            });
        },
        async lazyLoad(node, resolve) {
            let nodes = [];
            if (node.level !== 0 && node.data) {
                nodes = await this.getAreaList(node.data.areaSeq);
            }
            resolve(nodes);
        }
    }
};
</script>


目录
相关文章
|
3天前
|
JavaScript
vue消息订阅与发布
vue消息订阅与发布
|
2天前
|
JavaScript
vue尚品汇商城项目-day07【vue插件-50.(了解)表单校验插件】
vue尚品汇商城项目-day07【vue插件-50.(了解)表单校验插件】
12 4
|
2天前
|
JavaScript
vue尚品汇商城项目-day07【51.路由懒加载】
vue尚品汇商城项目-day07【51.路由懒加载】
12 4
|
2天前
|
JavaScript
vue尚品汇商城项目-day07【vue插件-54.(了解)生成二维码插件】
vue尚品汇商城项目-day07【vue插件-54.(了解)生成二维码插件】
8 2
|
JavaScript
Vue:ElementUI常用组件
Vue:ElementUI常用组件
138 0
|
5天前
|
JavaScript
vue组件中的插槽
本文介绍了Vue中组件的插槽使用,包括单个插槽和多个具名插槽的定义及在父组件中的使用方法,展示了如何通过插槽将父组件的内容插入到子组件的指定位置。
|
4天前
|
JavaScript 前端开发 IDE
Vue学习笔记5:用Vue的事件监听 实现数据更新的实时视图显示
Vue学习笔记5:用Vue的事件监听 实现数据更新的实时视图显示
|
4天前
|
JavaScript 前端开发 API
Vue学习笔记4:用reactive() 实现数据更新的实时视图显示
Vue学习笔记4:用reactive() 实现数据更新的实时视图显示
|
4天前
|
JavaScript 前端开发
Vue学习笔记8:解决Vue学习笔记7中用v-for指令渲染列表遇到两个问题
Vue学习笔记8:解决Vue学习笔记7中用v-for指令渲染列表遇到两个问题
|
4天前
|
JavaScript 前端开发 API
Vue学习笔记7:使用v-for指令渲染列表
Vue学习笔记7:使用v-for指令渲染列表
下一篇
无影云桌面