关于el-cascader-panel 的地址三级联动问题

1,271 阅读4分钟

最近遇到一个需求。先来讲一下需求 运费模板问题。 三级联动 用的el-cascader-panel 的级联面板 省市区

image.png 有一个区域设置,停发物流,停发原因,操作

区域设置的内容是根据三级联动框的内容改变。

image.png

我全选北京市后 上面的显示 只显示【北京市】 不显示 北京市 市辖区 什么什么区

如果没有全选北京市

就让变成这样

image.png

北京市市辖区东城区,北京市市辖区西城区 以此类推~~~~~

这就遇到难题了。因为这个级联面板的原因 没选中一个数据的话是 不管你在第几级的的,

看你这个一级或者二级 再或者三级选中没有,

假设 我们选中了一级, 剩下的二级和三级肯定是全选的是吧,

如果选中 二级 的话 三级的所有内容是全选的是吧, 一级的数据是非选中的,二级的同类是非选中的 对吧

不多说 需求了解完毕之后, 开整。看代码

**大体分为这几个步骤
**

1.首选获取选中数据 进行拆分成树状结构的数据, { children: [ { label: '南京市', loaded: false, checked: true, value: '320100', children:[ {label: '玄武区',value: '320102',loaded: false, checked: true} ] }, ], label: '江苏省', loaded: false, value: '320000', checked: false } *就类似上面的 树状结构数据, 2. 进行处理这个树状结构的数据 然后放到tag标签进行渲染, 3. 还要在处理一份树状结构数据,处理成 省一个数组 市一个数组,区一个数组。 大体分为以上步骤

image.png

上面的 蓝色标签是用tag 来写的,下面的 级联面板是 用element的

el-cascader-panel 里面方法 @change 是选中后触发这个方法。 v-model 是回显输送来使用。

image.png

上面的图片是进行处理 你选中的数组。arrdatahx 定义为空数组,如果等level==1 直接添加 不墨迹




       if (e.level == 1) {
           arrdatahx.push(e);
        } else if (e.level == 2 ){
          let paVal = e.parent.value;
          let fin = arrdatahx.findIndex((i) => {
            return i.value == paVal;
          });
          if (fin == -1) {
            arrdatahx.push(e.parent);
          }
          console.log(e, 'e==2')
          const arrdata1 = []
          }else if(e.level==3){
          let paVal = e.parent.parent.value;
          let fin = arrdatahx.findIndex((i) => {
            return i.value == paVal;
          });
          if (fin == -1) {
            arrdatahx.push(e.parent.parent);
          }
          }
          
          

上面的代码是进行 选中第几级的数据,

这是处理 树状结构 转成tag的数据 进行渲染展示




         let Fpro = [];
      arrdatahx.forEach((e) => {
        if (!e.checked) {
          e.children.forEach((e1) => {
            if (!e1.checked) {
              e1.children.forEach((e2) => {
                if (e2.checked) {
                  Fpro.push({
                    value: e2.value,
                    label: e.label + e1.label + e2.label,
                  });
                }
              });
            } else {
              Fpro.push({
                value: e1.value,
                label: e.label + e1.label,
              });
            }
          });
        } else {
          Fpro.push({
            value: e.value,
            label: e.label,
          });
        }
      });
      console.log("Fpro", Fpro);
      this.magtag = Fpro

magtag 对应的是tag里面循环渲染 这是把数据先转换成可视化数据,tag可以看得到的你选中的数据,

下一步就要处理选中的处理数据 进行回显咯。。

arrelca.forEach((e, index) => {
        // console.log(e)
        if (e.level == 1) {
           arrdatahx.push(e);
        } else if (e.level == 2 ){
          let paVal = e.parent.value;
          let fin = arrdatahx.findIndex((i) => {
            return i.value == paVal;
          });
          if (fin == -1) {
            arrdatahx.push(e.parent);
          }
          console.log(e, 'e==2')
          const arrdata1 = []

          arrpurre.push({
            children: funchildren(e),
            label: e.parent.label,
            loaded: e.parent.loaded,
            value: e.parent.value,
            checked: e.parent.checked
          })
          function funchildren(val1) {
            arrdata1.push({
              label: val1.label,
              loaded: val1.loaded,
              checked: val1.checked,
              value: val1.value,
              children:funct(val1.children)
            })
          console.log('arrdata1',arrdata1);
          function  funct(vaa){
            let adrr = []
            adrr.push({
              label: vaa.label,
              loaded: vaa.loaded,
              checked: vaa.checked,
              value: vaa.value,
            })
            return adrr
          }
          
          return arrdata1
          }
        }else if(e.level == 3){
          let paVal = e.parent.parent.value;
          let fin = arrdatahx.findIndex((i) => {
            return i.value == paVal;
          });
          if (fin == -1) {
            arrdatahx.push(e.parent.parent);
          }
          // console.log('e3',e);
            arrd.push({
             children: funchildren(e.pathNodes[1]),
            label: e.pathNodes[0].label,
            loaded: e.pathNodes[0].loaded,
            value: e.pathNodes[0].value,
            checked: e.pathNodes[0].checked
            })
            function  funchildren(e1){
              let acxc = []
              acxc.push({
           children: funchilxx(e.pathNodes[2]),
            label: e1.label,
            loaded: e1.loaded,
            value: e1.value,
            checked: e1.checked
              })
              return acxc
            }
          function funchilxx (e2){
              let addc  = []
              addc.push({
                label: e2.label,
            loaded: e2.loaded,
            value: e2.value,
            checked: e2.checked
              })
              return addc
          }
        //  console.log('arrd',arrd);
        }
        
       
       这是里处理 省市区的各个数组因为需求是  省一个数组 市一个数组,区一个数组。
       
       
       
        let sheng =[]
       let shi = []
       let  qu =  []
      arrd.forEach((e,index)=>{
       if(sheng.indexOf(Number(e.value) )==-1){
         sheng.push(Number(e.value) )
       }
            e.children.forEach(e1=>{
                 if(shi.indexOf(Number(e1.value))==-1){
                      shi.push(Number(e1.value) )
                 }
              e1.children.forEach(e2=>{
                 if(qu.indexOf(Number(e2.value))==-1){
                   qu.push(Number(e2.value))
                 }
                
              })
            })
      })

最后处理出来的数据 是这样的,

image.png

省市区 三个数组,所有ID 这是传送给后端的数据,

但是这些数据 不能进行回显数据,

所以我还要处理这些数据 让这些数据 进行串联,链接。找附属关系。。。。 想想都头皮发麻!!!!

这是处理 省市区数据 跟本地数据地址库的数据进行比对,

因为这个级联面板的话 回显数据是 ['110000', '110114','00415'], 前面是省市区 一个数组包含三个ID才能回显出来你要的数据。 所以上面的 数据要处理成这样才能结尾。

这是处理省市区数据的代码

image.png

最终处理完数据 跟这个el-cascader-panel级联面板 的绑定数据 表示回显。。 到现在算是对这个级联面板的全部操作 完毕了。。

回想一下 这几个步骤 ,大体的思路 是 选中数据,获得选中的数据,完成对tag的回显,在处理选中的数据,对后端数据的传输,在通过 后端的数据 进行编辑回显。。。。大体的流程!!

到现在算是结束了, 感谢两位大佬!【@毕方】【@文庆】 对我的指点 本人小菜鸡一枚。 如果发现比我更好的方法 不要吝啬哦~~~~~~~~ 或者有大佬 相互交流~~