Vue之Element级联选择器多选传值以及回显方式(树形结构)

 更新时间:2023年07月03日 11:00:33   作者:A . 阿冰  
这篇文章主要介绍了Vue之Element级联选择器多选传值以及回显方式(树形结构),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Vue Element级联选择器多选传值以及回显

后台需要的数据格式:‘a’, ‘a1’, ‘b’, ‘b1’(字符串以逗号分隔)

后台返回的数据:同上

级联组建

<el-cascader
  :options="industrialList"
  placeholder="请选择产业链"
  :props="industrialProps"
  @change="changeIndustrial"
  clearable
  v-model="form.industrialChain"
></el-cascader>

组建选择处理

changeIndustrial (val) {
  let ids = [];
  val.forEach((item) => {
    ids.push(item[item.length - 1]);
  })
  this.industrialChainResult = ids.join(',');
}

处理后台返回数据进行回显

  • codes: 后台返回的逗号分隔的字符串。
  • this.industrialList:从后台取回来渲染级联多选的树形结构数据。
  • categoryResultList:树形结构子集字段名
    // 级联回显
    industrialChinaShow (codes) {
      let echoTreeArr = [];
      let eachAry = codes.split(',')
      let itemAry = [];//分类树组件,每一项的code数组
      // 递归分类数据
      let recursionCategory = (data) => {
        let len = data.length;
        for (let i = 0; i < len; i++) {//循环data参数,匹配回显的code
          itemAry.push(data[i].code);//构建分类树数组项,入栈
          for (let j = 0; j < eachAry.length; j++) {//遍历子节点分类code,拼凑成数组项code,并终止循环
            if (eachAry[j] == data[i].code) {//匹配到子节点code
              echoTreeArr.push(JSON.parse(JSON.stringify(itemAry)));//push进树分类数据
              eachAry.splice(j, 1);//删除以匹配到的code
              break;
            }
          }
          if (eachAry.length <= 0) {//所有回显code匹配完成后,跳出循环
            break;
          } else if (data[i].categoryResultList && data[i].categoryResultList.length > 0) {// 如果存在子分类,递归继续
            recursionCategory(data[i].categoryResultList);
          }
          itemAry.pop();//出栈
        }
      }
      recursionCategory(this.industrialList);//调用递归
      this.form.industrialChain = echoTreeArr;
    },

在后台返回的地方调用第三部的方法

this.industrialChinaShow(res.industrialChain) // res.industrialChain 后台返回的'a', 'a1', 'b', 'b1'(字符串以逗号分隔)

好了 就这样。

element-ui动态级联选择器回显问题解决

场景描述

后台返回类目数组,其中有一级类目;二级类目,三级类目;这种情况下如何回显数据

效果图如下

在这里插入图片描述

先给大家展示一些数据结构,后面会给大家一一讲解;尤其是回显那部分

数据结构如下

  • id:自己的id
  • level:等级
  • pid:父级id,0位第一级
  • name:名字
[
    {
    	id:1, level:0,pid:0,name:'测试1'            
    },
    {
    	id:2, level:0,pid:0,name:'测试2'            
    },
    {
    	id:11, level:1,pid:1,name:'测试1-1'            
    },
    {
    	id:12, level:2,pid:11,name:'测试1-1-1'            
    }
]

先贴上html部分

<el-cascader :props="categoryProps" 
            v-model="cascaderData"></el-cascader>

然后再贴上data数据中的部分

这儿需要注意几个点:label、value需要改为你数据结构一致的字段;lazyLoad函数中的node有许多参数,如果目前的不能满足你的需求;你可以查看里面的一些参数是否有你需要的数值;现在data中的lazyLoad函数主要是一些默认值;

      cascaderData: '12',
      categoryProps: {
        emitPath: false,
        label:'name', // 字段必须统一
        value:'id', // 字段必须统一
        lazy: true,
        lazyLoad (node, resolve) {
          const { level,value } = node;
          console.log(value);
          let nodes = [];
          if (level == 0) { // 第一级
            nodes = catalogueList.filter(v=>{return v.level == 0});
          }else { // 后面两级
            nodes = catalogueList.filter(v=>{return v.pid == value});
          };
          resolve(nodes.map(v=>({
            id: v.id,
            name: v.name,
            leaf: level >= 2
          })));
        }
      }, // 级联选择器显示数据

回显的方法

将以下方法赋值给lazyLoad函数即可实现回显了;

逻辑:

  • cascaderData:是选择的参数最后一级id
  • value:我们在选择是(鼠标点击选择的)会触发并返回id,如果没有选择点击,则返回undefined(我们就在这儿进行判断是回显还是手动触发)
  • 先说回显:threeFind:我们根据有的最后一级id(cascaderData),去查找改数据并查询到他父级(twoFind);然后根据他父级查找到(第三级)的所有数据(threeData)
  • 然后根据二级数据(twoFind)去查找一级(oneFind),然后根据一级(oneFind)查找到二级的所有数据;一级不用查(level==0)全是
  • 这个时候开始将对应(二级,三级)的数据放到children下面;children是默认的值;会自动去查找
  • 在放置第三级的数据的时候需要注意一个值:leaf,为true时就是结束;也必须写这个;否则选择器不会显示,但是展开的时候是显示状态
  • 现在回显也完成了;但是我们从二级或者一级选择分类的时候,会出现一级或者二级数据跑到二级或者三级目录下等清楚;这个时候就需要将选中的数据查找到
  • 然后将其子集的数据查找出来;并判断如果是第三级就leaf:true;即可完成
  • 赶紧去试试吧!
    setLazyLoad(node, resolve) {
      const { level,value } = node;
      const cascaderData = this.cascaderData;
      // 第一级数据
      let nodes = [];
      nodes = catalogueList.filter(v=>{return v.level == 0});
      // 选中的第三级某位数据
      const threeFind = catalogueList.find(v=>{return v.id == cascaderData});
      if (value) {
        // 查询数据
        const unknownFind = catalogueList.find(v=>v.id == value);
        if (level == 1) {
          let twoData = catalogueList.filter(v=>v.pid == unknownFind.id);
          nodes = twoData; // 第二级
        }else if (level == 2) {
          let threeData = catalogueList.filter(v=>v.pid == unknownFind.id);
          nodes = threeData.map(v=>{return {id:v.id,name:v.name,level:v.level,leaf:true}}); // 第三级
        };
      }else {
        // 选中的第二级某位数据
        let twoFind = catalogueList.find(v=>v.id == threeFind.pid);
        // 第三级数据
        let threeData = catalogueList.filter(v=>v.pid == twoFind.id);
        // 选中的第一级某位数据
        const oneFind = catalogueList.find(v=>{return v.id == twoFind.pid});
        // 第二级数据
        let twoData = catalogueList.filter(v=>{return v.pid == oneFind.id});
        // nodes = nodes.map(v=>{return {id:v.id,name:v.name,level:v.level}}); // 第一级
        const oneIndex = nodes.findIndex(v=>{return v.id == oneFind.id});
        nodes[oneIndex].children = twoData; // 第二级
        const twoIndex = nodes[oneIndex].children.findIndex(v=>v.id == twoFind.id);
        nodes[oneIndex].children[twoIndex].children = threeData.map(v=>{ // 第三季
          return {
            id:v.id,
            name:v.name,
            level:v.level,
            leaf: true,
          }
        });
      }
      resolve(nodes);
    },

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue项目index.html中使用环境变量的代码示例

    vue项目index.html中使用环境变量的代码示例

    在Vue3中使用环境变量的方式与Vue2基本相同,下面这篇文章主要给大家介绍了关于vue项目index.html中使用环境变量的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • Vue.component的属性说明

    Vue.component的属性说明

    这篇文章主要介绍了Vue.component的属性说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • vue子组件如何使用父组件传过来的值

    vue子组件如何使用父组件传过来的值

    这篇文章主要介绍了vue子组件如何使用父组件传过来的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue实现数字+英文字母组合键盘功能

    vue实现数字+英文字母组合键盘功能

    这篇文章主要介绍了vue实现数字+英文字母组合键盘功能,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Vue2 element 表头查询功能实现代码

    Vue2 element 表头查询功能实现代码

    本文介绍Vue2中Element UI表格自定义表头及查询功能实现,需通过slot-scope绑定数据,注意Vue2.6+版本改用#header语法,并提供示例代码说明,感兴趣的朋友一起看看吧
    2025-07-07
  • Vue3前端做打印页面信息实现打印功能(打印界面某个部分)

    Vue3前端做打印页面信息实现打印功能(打印界面某个部分)

    这篇文章主要介绍了如何使用vue3-print-nb依赖在Vue 3项目中实现页面打印功能,提供了完整的代码示例,大家可以根据项目需求选择合适的打印方法,需要的朋友可以参考下
    2025-02-02
  • npm踩坑问题实战记录

    npm踩坑问题实战记录

    这篇文章主要给大家介绍了关于npm踩坑问题的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • vue中el-tree动态初始默认选中和全选实现方法

    vue中el-tree动态初始默认选中和全选实现方法

    这篇文章主要给大家介绍了关于vue中el-tree动态初始默认选中和全选实现的相关资料,eltree默认选中eltree是一种常用的树形控件,通常用于在网页上呈现树形结构的数据,例如文件夹、目录、组织结构等,需要的朋友可以参考下
    2023-09-09
  • 前端储存之localStrage、sessionStrage和Vuex使用

    前端储存之localStrage、sessionStrage和Vuex使用

    localStorage、sessionStorage和Vuex是三种不同的客户端存储方式,用于在浏览器中保存数据,localStorage和sessionStorage都是以键值对的形式存储数据,但localStorage存储的数据在关闭浏览器后仍然存在
    2025-01-01
  • vue前端js实现预览word文档需求docx-preview方式

    vue前端js实现预览word文档需求docx-preview方式

    文章简要介绍了使用插件docx-preview的步骤,首先需要通过npm进行安装,在预览时使用官方提供的文档,本文内容较为简略,主要是分享安装和使用过程,供其他开发者参考
    2026-05-05

最新评论