Elementのel-treeコントロールのバックグラウンドデータ構造の生成と方法の抽出
最近はel-treeコントロールを使っています。主にデータのフォーマットです。公式サイトのデータフォーマットによってノードのツリー構造が表示されます。
コードの参考が多いです
ここでは、より良いリンクを提供します。https://www.jb51.net/article/181990.htm
コードの説明はコメントに詳しく書いてあります。もうここで説明しません。なぜこのようなフォーマットのデータを抽出したのかというと、ElemenUID-treeが規定するデータフォーマットを使って、このコントロールを使いたいなら、彼らが規定したこのフォーマットに従ってください。
データフォーマットは以下の通りです。
Controllerコード
上記の方法も使えますが、この方法を共通の方法に抽出して、後で書く時に直接にこの方法を取り外すことができます。抽出する過程で多くの問題に遭遇しました。
例えば、エンティティクラスAは、対応するデータベースにおいてノードを格納するテーブルのエンティティクラスであるが、エンティティクラスにはsetChildList、getChild Listのセットは存在しない。これらの情報を保存するフィールドをツールクラスに書いて、その方法もこのツール類にあります。このように戻ったら、この工具類が入っている集合に戻ります。もう一つの問題はこのツールクラスにはどのフィールドが必要ですか?ツリーなので、ノードID、親ID、ノード名、およびサブノードのセットを記憶する必要があります。もっと多くのデータが欲しいなら、T data汎型を追加してもいいです。この汎型は直接に元のノードのエンティティ類オブジェクトを格納します。このようにすべてのデータがそろっています。データ構造も完全です。
contrellコード:
共通の方法を抽出したいので、パラメータの種類は不確定です。つまり、入ってきたリストの要素の種類は固定されていないので、汎型を使います。上に述べたように、ノードID、親ID、ノード名の割り当ては、ツールクラスで対応するフィールドに与えられます。しかし、泛型である以上、対象のタイプが分かりませんので、ツールの種類では、該当の値を取るためのポイントがありません。反射、反射などの分野で具体的なフィールドや方法の名前を使って値を取ります。だから、controlerでツール類を呼び出した時に、ノードID、親ID、ノード名を入力します。もちろん、バックグラウンドからデータが入っているリストセットを調べに来ました。
contrellerコードは以下の通りです。
ここでは、Elementのel-treeコントロールのバックグラウンドデータ構造の生成と方法の抽出に関する記事を紹介します。Element 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の生成と抽出方法については、以前の記事を検索したり、下記の関連記事を閲覧したりしてください。どうぞよろしくお願いします。