vue el-tree将选中的节点以tree结构形式数组返回

  • Post author:
  • Post category:vue


templete:

<div>
    <el-tree
      :data="data"
      show-checkbox
      node-key="label"
      :default-expanded-keys="[2, 3]"
      :default-checked-keys="[5]"
      :props="defaultProps"
      ref="tree"
    >
    </el-tree>
    <button @click="getInfo">获取数据</button>
  </div>

data:

 data: [
        {
          label: "宏观",
          children: [
            {
              label: "宏观经济",
              grade: [
                {
                  name: "谢佩瑜",
                  evaluation: "",
                  lastweek_change: "",
                  lastweek_performance: "",
                },
              ],
              children: [
                {
                  label: "经济高频数据跟踪",
                  desc: "【疫情疫苗跟踪】</br></br>1. 疫情:本轮全球疫情短暂回落后重拾上升趋势。",
                },
                {
                  label: "经济指标跟踪",
                  desc: "11月经济特征:供给冲击缓解后,生产延续修复;投资分化
                },
                { label: "重点市场观点跟踪", desc: "暂无" },
              ],
            },
            {
              label: "流动性",
              grade: [
                {
                  name: "倪旭东",
                  evaluation: "",
                  lastweek_change: "",
                  lastweek_performance: "",
                },
              ],
              children: [
                {
                  label: "货币环境跟踪",
                  desc: "预计货币政策稳健偏松,",
                },
                {
                  label: "信用环境跟踪",
                  desc: "地产政策有望边际放松,稳信用政策有望推出,",
                },
                { label: "重点市场观点跟踪", desc: "暂无" },
                { label: "重要基本假设更新", desc: "暂无" },
              ],
            },
          ],
        }],
        defaultProps: {
        children: "children",
        label: "label",
      },

methods:

getInfo() {
      const getC = this.$refs.tree.getCheckedNodes();
      const getHC = this.$refs.tree.getHalfCheckedNodes();
      let selected_nodes = getHC.concat(getC);
      let selected_ids = new Set(); // 记录选中的节点tree_id
      let used_ids = new Set(); // 记录已经查询过的节点
      // 遍历初始化selected_ids
      for (let node of selected_nodes) {
        selected_ids.add(node.$treeNodeId);
      }
      // 最终的结果数据用一个根节点存储, 为了对齐递归的数据结构
      let root_node = {
        treeNodeId: -1,
        children: [],
      };
      // 添加给parent_node节点一个新节点 node
      // 注意:node 的类型是原始的 tree 节点
      // 而parent_node 的类型是真正的结果节点
      function AddNode(node, parent_node) {
        if (
          !selected_ids.has(node.$treeNodeId) ||
          used_ids.has(node.$treeNodeId)
        ) {
          return;
        }
        used_ids.add(node.$treeNodeId); // 加过的要存入 used_ids 做标记
        let real_node = {
          treeNodeId: node.$treeNodeId,
          children: [],
          label: node.label,
          desc: node.desc,
          grade: node.grade,
          // 存储一下节点的数据
        };
        // // 添加子节点
        if (node.children) {
          for (let child_node of node.children) {
            AddNode(child_node, real_node);
          }
        }
        if (real_node.children.length === 0) {
          delete real_node.children;
        }
        if (!real_node.grade) {
          delete real_node.grade;
        }
        if (!real_node.desc) {
          delete real_node.desc;
        }
        parent_node.children.push(real_node);
      }
      for (let node of selected_nodes) {
        AddNode(node, root_node);
      }
      let result = root_node.children;
      console.log(result);
    },



版权声明:本文为qq_41038412原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。