element树形图地区选择器(二)

话不多说直接开干

后台返回的数据为(为了一次看到更多的内容我用JSON.stringify包裹返回值)

可以看到每个层级的节点id都是从1开始的,但是tree我们要每个节点都得是唯一值才好渲染页面,从上面的图中可以看到我用了一个函数将获取到的值做了一次操作,来看下执行该函数后的结果

可以看到每个子节点的id都变成了唯一值(不接受反驳)

代码为(就是一个简单的递归这里我就不详细说明了)


export default function nodesPid(nodes, pid) {
  for (let i = 0; i < nodes.length; i++) {
    if (pid) {
      nodes[i].pid = pid
      nodes[i].id = pid + '_' + nodes[i].id
    }
    if (nodes[i].states) {
      nodesPid(nodes[i].states, nodes[i].id)
    }
  }
}

好的我们最后得将节点转为树型结构那么我们就得获取当前节点所在树形结构的位置,不然怎么转呢,我是将每个节点所在位置用一个属性表示添加到每个节点,说的也不够明白直接上图

上面是整个算法里面最关键的地方,如果想要看懂整个流程上面必须看懂,不过只想快点搞定可以直接看下面代码了.

上面数据的转换我也用一个函数封装了

import NodeEnd from "./NodeEnd"

export const inspiration = function(awObj){
  var Obj = awObj
  function prentNOdeAward(Obj,prentNode){
    for(let i = 0 ; i < Obj.length ; i++){
      if(!Obj[i].pid){prentNode = [{}]}
      if(i==0){
        NodeEnd(prentNode,Obj[i],0)
      }else{
        NodeEnd(prentNode,Obj[i],1)
      }
      Obj[i].prentNV = JSON.parse(JSON.stringify(prentNode))
      if(Obj[i].states){
        prentNOdeAward(Obj[i].states,JSON.parse(JSON.stringify(prentNode)))
      }
    }
  }
  prentNOdeAward(Obj,[])
  return Obj
}

NodeEnd.js

export default function(nodes,Cnode,type){
  Cnode = JSON.parse(JSON.stringify(Cnode))
  if(Cnode.states){
    delete Cnode.states
  }
  delete Cnode.prentNV
  function toAd(node){
    if(node[0]&&node[0].states){      //找到nodes最里面一层
        toAd(node[0].states)
    }else{      //到最里面了
      if(!nodes[0].id){       //nodes没有id表示是国家刚进入给nodes为[{}]
        node[0].states = []
        Object.assign(node[0],Cnode)
      }else{                //表示已经不是国家刚进入了,至少为第二层
        // if(nodes[0].states.length==0){node[0] = {} }
        if(type==0){      //表示往里面添加一层
          if(nodes[0].states.length==0){ 
            node[0] = {}
            Object.assign(node[0],Cnode)
          }else{
            node[0].states = [{}]
            Object.assign(node[0].states[0],Cnode)
          }
        }else{          //替换最里面一层
          Object.assign(node[0],Cnode)
        }
      }
    }
  }
  toAd(nodes)
}

这样数据就封装完成了.

var newarr = [];
            this.$refs.tree.getCheckedNodes().map((res) => {
                console.log(newarr);
            });

现在我们可以看到选中国家地区后的返回值

这里我用一个算法封装数据

先看结果

我选中如下地区

   

返回封装数据后

下面是算法函数

var newarr = [];
            this.$refs.tree.getCheckedNodes().map((res) => {
                toTree(newarr, JSON.parse(JSON.stringify(res)));
            });

 

 

toTree.js

import treeDiff from './treeDiff'
export default function(newarr,node){
  if(!(node.states&&node.states.length>0&&!node.pid)){        //全选某个存在子级的父级或者
    treeDiff(newarr,node)
  }
}

 

treeDiff.js

export default function(wholeTrees,ChilTree){
  // 引用类型(每次执行函数mangeD地址指向后面一层NVTree)
  var mangeD = ChilTree.prentNV[0]

  var contral = wholeTrees            //指向器      根据递归到生成newarr的第几层就指向第几层

  function childTreeDiff(wholeTree){
    var temp = false,index = 0;
    for (let i = 0 ; i < wholeTree.length ; i++){       //一层一层往已经生成的树形图里面递归
      if(wholeTree[i].id == mangeD.id){         //如果
        temp = true
        index = i
      }
    }
    if(temp){     //表示新tree存在当前子节点prentNV
      // if(Object.prototype.hasOwnProperty.call(mangeD,'states')){
      if(mangeD.states){
        mangeD = mangeD.states[0]
      }else{
        contral = wholeTrees  //回到指向最外层
        contral.push(mangeD)        
        return
      }
      if(!wholeTree[index].states){
        contral = wholeTrees    //回到指向最外层
        wholeTree[index].states = [JSON.parse(JSON.stringify(mangeD))]
      }else{
        contral = wholeTree[index].states       //回到指向最里层
        childTreeDiff(wholeTree[index].states)
      }
    }else{
      contral.push(mangeD)
      contral = wholeTrees          //回到指向最外层
    }
  }
  childTreeDiff(wholeTrees)
}

有细心的小伙伴发现是不是跟mustache模板引擎里面的核心算法有异曲同工之妙

然后编辑

是不是搞定了,哈哈

简便方法我下一章讲

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Element-UI 提供了一个树形选择器组件,可以用于选择树形结构的数据。在使用树形选择器之前,需要先引入 Element-UI 库并注册树形选择器组件。 下面是一个简单的示例代码: ```html <template> <div> <el-tree :data="data" show-checkbox node-key="id" ref="tree" :props="defaultProps"></el-tree> <el-button type="primary" @click="getCheckedNodes">获取选中节点</el-button> </div> </template> <script> export default { data() { return { data: [ { id: 1, label: '一级 1', children: [ { id: 4, label: '级 1-1', children: [ { id: 9, label: '三级 1-1-1' }, { id: 10, label: '三级 1-1-2' } ] } ] }, { id: 2, label: '一级 2', children: [ { id: 5, label: '级 2-1' }, { id: 6, label: '级 2-2' } ] }, { id: 3, label: '一级 3', children: [ { id: 7, label: '级 3-1' }, { id: 8, label: '级 3-2' } ] } ], defaultProps: { children: 'children', label: 'label' } }; }, methods: { getCheckedNodes() { const checkedNodes = this.$refs.tree.getCheckedNodes(); console.log(checkedNodes); } } }; </script> ``` 在上述示例中,我们使用了 `el-tree` 组件来展示树形结构数据,并设置了 `show-checkbox` 属性以显示复选框。我们还设置了 `node-key` 属性来指定节点的唯一标识符,以便在获取选中节点时使用。 在 `el-tree` 组件中,我们还设置了 `props` 属性来指定节点的属性名称。在上述示例中,我们指定了 `children` 属性为子节点数组,`label` 属性为节点文本。 最后,我们在页面中添加了一个按钮,当按钮被点击时会调用 `getCheckedNodes` 方法来获取选中的节点,并将结果输出到控制台中。 以上就是使用 Element-UI 树形选择器的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值