LayUI下拉樹TreeSelect的使用解讀
樹形結(jié)構(gòu)在實(shí)際開發(fā)中是很長(zhǎng)用的一種結(jié)構(gòu)。最近寫了一個(gè)LayUI的小案例,其中用到了TreeSelect,這里整理一下。
TreeSelect官網(wǎng)地址:https://fly.layui.com/extend/treeSelect/
顯示效果圖

因?yàn)門reeSelect不是LayUI官方開發(fā)的,而是第三方基于LayUI開發(fā)的,所以需要先用Layui引入一下文件。

之后頁(yè)面只需要引入LayUI的CSS和JS就可以了。
頁(yè)面給一個(gè)標(biāo)簽,用于顯示TreeSelect下拉樹選中的內(nèi)容值,獲取選中值時(shí),直接獲取標(biāo)簽值,就是選中的內(nèi)容值。
<input type="text" name="parentId" id="tree2" lay-filter="tree2" class="layui-input" />
JS渲染樣式代碼
<script type="text/javascript">
layui.use(["treeSelect", "form", "tree"], function () {
var form = layui.form;
var tree = layui.tree;
var treeSelect = layui.treeSelect;
treeSelect.render({
// 選擇器
elem: '#tree',
// 異步獲取下拉樹需要顯示的數(shù)據(jù)
data: 'dept/treeSelect',
// 異步加載方式:get/post,默認(rèn)get
type: 'post',
// 占位符
placeholder: '上級(jí)菜單',
// 是否開啟搜索功能:true/false,默認(rèn)false
search: true,
// 一些可定制的樣式
style: {
folder: {
enable: true
},
line: {
enable: true
}
},
// 點(diǎn)擊節(jié)點(diǎn)回調(diào)
click: function(d){
//console.log(d);
},
// 加載完成后的回調(diào)函數(shù)
success: function (d) {
//console.log(d);
// 選中節(jié)點(diǎn),根據(jù)id篩選,一般修改時(shí)會(huì)有默認(rèn)選中狀態(tài),可以在這里設(shè)置
//treeSelect.checkNode('tree', 2);
//console.log($('#tree').val());
// 獲取zTree對(duì)象,可以調(diào)用zTree方法
//var treeObj = treeSelect.zTree('tree');
// console.log(treeObj);
// 刷新樹結(jié)構(gòu)
//treeSelect.refresh('tree');
}
});
});
</script>后臺(tái)響應(yīng)加載下拉樹數(shù)據(jù)方法(有詳細(xì)注釋)
@RequestMapping(value="/treeSelect")
@ResponseBody
//這里寫的,新增和修改數(shù)據(jù)請(qǐng)求都是同一個(gè)方法,如果是修改會(huì)傳遞一個(gè)修改對(duì)象的id
public Object treeSelect(Integer id) {
Sort sort = Sort.by("idx"); //排序
Specification<Dept> spec = buildSpec1(); //查詢條件,查詢父節(jié)點(diǎn)為null的元素
List<Dept> list = deptService.findAll(spec,sort); //查詢,Dept為實(shí)體類
return buildTree(list, id); //轉(zhuǎn)換為treeSelect指定的JSON數(shù)據(jù)格式方法
}
private Object buildTree(List<Dept> list, Integer id) {
List<HashMap<String, Object>> result=new ArrayList<>();
for (Dept dept : list) {
if(dept.getId() != id) { //判斷如果是修改的話,修改的節(jié)點(diǎn)及下級(jí)節(jié)點(diǎn)不顯示,也就不加載
HashMap<String, Object> node=new HashMap<>();
node.put("id", dept.getId()); //節(jié)點(diǎn)id
node.put("name",dept.getName()); //節(jié)點(diǎn)數(shù)據(jù)名稱
node.put("open", false); //是否展開
node.put("checked", false); //是否選中,前臺(tái)也可以設(shè)置是否選中
if(dept.getChildren().size() != 0) { //如果下級(jí)節(jié)點(diǎn)不為空,
node.put("children",buildTree(dept.getChildren(), id)); //遞歸加載下級(jí)節(jié)點(diǎn)
}
result.add(node);
}
}
return result;
}
public Specification<Dept> buildSpec1() {
Specification<Dept> specification = new Specification<Dept>() {
private static final long serialVersionUID = 1L;
@Override
public Predicate toPredicate(Root<Dept> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
HashSet<Predicate> rules=new HashSet<>();
Predicate parent = cb.isNull(root.get("parent")); //查詢父節(jié)點(diǎn)為null的元素
rules.add(parent);
return cb.and(rules.toArray(new Predicate[rules.size()]));
}
};
return specification;
}Dept實(shí)體類代碼
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.data.annotation.CreatedBy;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Dept {
private Integer id;
private String name; //部門名稱
private String deptName; //部門負(fù)責(zé)人
private String phone; //電話號(hào)
private String number; //編號(hào)
private double idx; //排序
@JsonIgnore
private Dept parent;
@JsonIgnore
private List<Dept> children = new ArrayList<>();
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public double getIdx() {
return idx;
}
public void setIdx(double idx) {
this.idx = idx;
}
@ManyToOne
@CreatedBy
public Dept getParent() {
return parent;
}
public void setParent(Dept parent) {
this.parent = parent;
}
@OneToMany(cascade=CascadeType.ALL,mappedBy="parent")
@OrderBy(value="idx")
public List<Dept> getChildren() {
return children;
}
public void setChildren(List<Dept> children) {
this.children = children;
}
public Dept(Integer id, String name, String deptName, String phone, String number, double idx, Dept parent, List<Dept> children) {
this.id = id;
this.name = name;
this.deptName = deptName;
this.phone = phone;
this.number = number;
this.idx = idx;
this.parent = parent;
this.children = children;
}
public Dept(Integer id) {
this.id = id;
}
public Dept() {
}
}這里后臺(tái)持久層是使用的Spring-Data-Jpa,如果你是用的其他持久層框架,只要返回的JSON數(shù)據(jù)格式一樣就可以了。
JSON數(shù)據(jù)格式

JSON數(shù)據(jù)
[
{
"children": [ //下級(jí)節(jié)點(diǎn)
{
"children": [
{
"name": "測(cè)試",
"checked": false,
"id": 30,
"open": false
}, {
"name": "開發(fā)",
"checked": false,
"id": 31,
"open": false
}, {
"children": [
{
"name": "測(cè)試節(jié)點(diǎn)",
"checked": false,
"id": 36,
"open": false
}
],
"name": "測(cè)試",
"checked": false,
"id": 32,
"open": false
}
],
"name": "技術(shù)部",
"checked": false,
"id": 2,
"open": false
}, {
"name": "財(cái)務(wù)部",
"checked": false,
"id": 19,
"open": false
}
],
"name": "某某公司", //節(jié)點(diǎn)內(nèi)容
"checked": false, //是否選中
"id": 1, //id
"open": false //是否展開
}, {
"name": "測(cè)試",
"checked": false,
"id": 33,
"open": false
}
]以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
js實(shí)現(xiàn)GIF動(dòng)圖分解成多幀圖片上傳
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)GIF動(dòng)圖分解成多幀圖片上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
細(xì)說(shuō)webpack6 Babel的使用詳解
這篇文章主要介紹了細(xì)說(shuō)webpack6 Babel的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
js 實(shí)現(xiàn)的可折疊留言板(附源碼下載)
留言板想必大家都有見過(guò)吧,但是可以折疊的卻不是很多,恰好本文提供一個(gè)比較不錯(cuò)的可折疊留言板,感興趣的朋友可以學(xué)習(xí)下2014-07-07
js實(shí)現(xiàn)StringBuffer的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇js實(shí)現(xiàn)StringBuffer的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
JavaScript提升性能的常用技巧總結(jié)【經(jīng)典】
這篇文章主要介紹了JavaScript提升性能的常用技巧,結(jié)合實(shí)例形式總結(jié)分析了JavaScript編程中常見的性能提升優(yōu)化技巧,涉及作用域、循環(huán)、變量、DOM及函數(shù)節(jié)流等,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2016-06-06
Textarea根據(jù)內(nèi)容自適應(yīng)高度
使用JAVASCRIPT控制Textarea內(nèi)容自適應(yīng)高度,實(shí)施起來(lái)很簡(jiǎn)單,很平滑。2013-10-10

