Elementのel-treeコントロールのバックグラウンドデータ構造の生成と方法の抽出


最近はel-treeコントロールを使っています。主にデータのフォーマットです。公式サイトのデータフォーマットによってノードのツリー構造が表示されます。
コードの参考が多いです
ここでは、より良いリンクを提供します。https://www.jb51.net/article/181990.htm
コードの説明はコメントに詳しく書いてあります。もうここで説明しません。なぜこのようなフォーマットのデータを抽出したのかというと、ElemenUID-treeが規定するデータフォーマットを使って、このコントロールを使いたいなら、彼らが規定したこのフォーマットに従ってください。
データフォーマットは以下の通りです。

Controllerコード

@RequestMapping("/cateList")
  @ResponseBody
  public List<TbCategory> cateList() {

    //     :
    // 1、      、    List1 (tbCategories)
    // 2、 List1        map(treeMap) :  id  ,        
    // 3、          List2 (resultList)
    // 4、  List1      ,     parentId   map   
    //   1)     ,          
    //      1、        childList         
    //       1、  :       ,      
    //       2、  :           
    // 5、         map 
    // 6、  List2(resultList)

    //   :             list2(resultList),       //list2


    List<TbCategory> tbCategories = categoryService.cateList();

    List<TbCategory> resultList = new ArrayList<TbCategory>(); //        

    Map<Object ,Object> treeMap = new HashMap();
    Object itemTree;

    for(int i = 0;i<tbCategories.size() && !tbCategories.isEmpty();i++){
      itemTree = tbCategories.get(i);
      treeMap.put(tbCategories.get(i).getNodeId(),tbCategories.get(i));//          map 


    }


//            ,              id       ,  ,               
 //   map      (           )
    for(int i =0;i<tbCategories.size();i++){
      //   1:    ,         
      //   2:         id
     if(!treeMap.containsKey(tbCategories.get(i).getParentId())){
        //               id  ,         
        //      id  , map   ,     ,        ,      ,          
        //        list  
        resultList.add(tbCategories.get(i));
      }
    }

    //     ,             children   
    for(int i =0 ;i<tbCategories.size()&& !tbCategories.isEmpty();i++){
      //     ,         ,  ,    id      id
      //treeMap.get(tbCategories.get(i).getParentId()); //  map        
      TbCategory category = (TbCategory)treeMap.get(tbCategories.get(i).getParentId());
      if(category!=null ){ //    null,         
        //      ,                   ,        
        if(category.getChildList() == null){
          //             null:              (       ),       null
          //     size          , 0,    (       ),
          category.setChildList(new ArrayList<TbCategory>());
        }
        category.getChildList().add(tbCategories.get(i)); //        ChildList   

        //          ,         (      ,         map ,
        //     ,map            ,    map         ),    
        //      map   ,          (             。      
        //         map,     list,       map     ,              map  
        // ,         list,   list             ,          ,          
        //          ,       ,                      ,          ,   map   list ,                )
        treeMap.put(tbCategories.get(i).getParentId(),category); //          map 
      }

    }


   return resultList;
  }
エンティティクラス:

 private Long nodeId;
  private String categoryName;
  private Long parentId;
  private Long childId;
  private List<T> childList;
以上のデータはすべてバックグランドでカプセル化しました。フロントで直接データを取得して表示すればいいです。

<el-tree :data="treeList"
       :props="defaultProps"
       @node-click="handleNodeClick"
       node-key="nodeId"
       show-checkbox=true>
  </el-tree>
js:

defaultProps:{
        children: 'childList',
        label: 'categoryName' //                       
      }
//     
 handleNodeClick: function (data) {
        console.log("    ");
      }
抽出方法
上記の方法も使えますが、この方法を共通の方法に抽出して、後で書く時に直接にこの方法を取り外すことができます。抽出する過程で多くの問題に遭遇しました。
例えば、エンティティクラスAは、対応するデータベースにおいてノードを格納するテーブルのエンティティクラスであるが、エンティティクラスにはsetChildList、getChild Listのセットは存在しない。これらの情報を保存するフィールドをツールクラスに書いて、その方法もこのツール類にあります。このように戻ったら、この工具類が入っている集合に戻ります。もう一つの問題はこのツールクラスにはどのフィールドが必要ですか?ツリーなので、ノードID、親ID、ノード名、およびサブノードのセットを記憶する必要があります。もっと多くのデータが欲しいなら、T data汎型を追加してもいいです。この汎型は直接に元のノードのエンティティ類オブジェクトを格納します。このようにすべてのデータがそろっています。データ構造も完全です。
contrellコード:
共通の方法を抽出したいので、パラメータの種類は不確定です。つまり、入ってきたリストの要素の種類は固定されていないので、汎型を使います。上に述べたように、ノードID、親ID、ノード名の割り当ては、ツールクラスで対応するフィールドに与えられます。しかし、泛型である以上、対象のタイプが分かりませんので、ツールの種類では、該当の値を取るためのポイントがありません。反射、反射などの分野で具体的なフィールドや方法の名前を使って値を取ります。だから、controlerでツール類を呼び出した時に、ノードID、親ID、ノード名を入力します。もちろん、バックグラウンドからデータが入っているリストセットを調べに来ました。
contrellerコードは以下の通りです。

@RequestMapping("/cateList")
@ResponseBody
public List<TreeUtils> cateList() throws Exception{
    List<TbCategory> tbCategories = categoryService.cateList();
    List<TreeUtils> treeList = TreeUtils.getTreeList(tbCategories,"nodeId", "parentId", "categoryName");

    return treeList;
  }
ツールクラス:

//               , ,      ,           ,               ,
//            TreeUtils     ,                  TreeUtils   

public class TreeUtils<T> {

  private Integer id;      //   id
  private Integer parentId;  //    
  private String name;     //      ,           TreeUtils      ,            ,el-tree lable         
  private List<TreeUtils> childList; //             
  private T data;       //     
方法

/**
   * @param listData  //           
   * @return
   */
  public static List<TreeUtils> getTreeList(List<?> listData ,String id,String parentId,String categoryName) throws Exception{

    List<TreeUtils> resultList = new ArrayList<TreeUtils>(); //        
    Map<Integer ,Object> map = new HashMap<Integer,Object>();

    for(int i =0;i<listData.size() && !listData.isEmpty();i++){

      //              ,   TreeUtils       
      //     listData         TreeUtils   x,     x
      TreeUtils treeUtils = new TreeUtils();
      treeUtils.setId(Integer.parseInt(TreeUtils.getFileValue(listData.get(i),id).toString())); // id       //     Object       Integer, toString,    Integer。        Object                  
      treeUtils.setParentId(Integer.parseInt(TreeUtils.getFileValue(listData.get(i),parentId).toString())); //  id
      treeUtils.setName(TreeUtils.getFileValue(listData.get(i),categoryName).toString()); //    
      //System.out.println("    +"+TreeUtils.getFileValue(listData.get(i),categoryName).toString());
      treeUtils.setData(listData.get(i));  // data:         , children

      //            id      map   ,id  ,      
      map.put(treeUtils.getId(),treeUtils);


      //           resultList   
      //if( 0 == treeUtils.getParentId()){
       //  resultList.add(treeUtils);
      // }
    }
//          ,           
//    ,         id
//    ,         
    for(int i =0;i<listData.size();i++){
      if(!map.containsKey(Integer.parseInt(TreeUtils.getFileValue(listData.get(i),parentId).toString()))){
        resultList.add((TreeUtils) map.get(Integer.parseInt(TreeUtils.getFileValue(listData.get(i),id).toString())));
      }
    }



    for(int i =0;i<listData.size() && !listData.isEmpty();i++){
      TreeUtils obj = (TreeUtils)map.get(Integer.parseInt(TreeUtils.getFileValue(listData.get(i), parentId).toString()));
      if(obj != null){
        if(obj.getChildList() == null){
          obj.setChildList(new ArrayList());
        }
        obj.getChildList().add(map.get(Integer.parseInt(TreeUtils.getFileValue(listData.get(i),id).toString())));
      }
    }
    return resultList;
  }
反射の方法

/**
   *                   ,          Object
   * Object       Integer,  Object  String,    String  Integer
   * @param item
   * @param fileName
   * @return
   */
  public static Object getFileValue(Object item,String fileName) throws Exception {
    Class<?> aClass = item.getClass();
    Field file = aClass.getDeclaredField(fileName); //             
    file.setAccessible(true); //       
    return file.get(item);  //             ,              ,       ,             ,    
  }
ps:抽出方法には多くの問題があります。その中のTは?などの泛型はまだ簡単なだけで使うことができて、熟練していないで、後で多く勉強します。
 ここでは、Elementのel-treeコントロールのバックグラウンドデータ構造の生成と方法の抽出に関する記事を紹介します。Element el-treeの生成と抽出方法については、以前の記事を検索したり、下記の関連記事を閲覧したりしてください。どうぞよろしくお願いします。