layui遞歸實(shí)現(xiàn)動(dòng)態(tài)左側(cè)菜單
本文實(shí)例為大家分享了layui遞歸實(shí)現(xiàn)動(dòng)態(tài)左側(cè)菜單的具體代碼,供大家參考,具體內(nèi)容如下
我知道兩種方式實(shí)現(xiàn):
一、先加載所有的主菜單,之后通過(guò)點(diǎn)擊主菜單在加載該菜單的子菜單(缺點(diǎn),如果判斷是否已經(jīng)加載過(guò),那么動(dòng)態(tài)添加了菜單,這里顯示不出來(lái),不判斷的話,每次點(diǎn)擊都會(huì)請(qǐng)求一次,這樣請(qǐng)求的次數(shù)就太多了,服務(wù)器不太好的話可能會(huì)成為高并發(fā)的一個(gè)原因)
二、就是以下的了,使用遞歸一次性全部加載出來(lái)(缺點(diǎn),耗費(fèi)服務(wù)器內(nèi)存)
如果動(dòng)態(tài)添加一個(gè)菜單,你當(dāng)前頁(yè)面不手動(dòng)刷新菜單不會(huì)顯示,這個(gè)問(wèn)題可以考慮用websocket實(shí)現(xiàn)
首先是service層如何獲取所有的菜單(主菜單和所有的子菜單)
/** *獲取所有菜單 **/ @Override public List<MeunInfo> getParentMeun() { //獲取所有的菜單(包括子菜單和父級(jí)菜單) List<MeunInfo> list = meunDao.getParentMeun(); //創(chuàng)建一個(gè)集合用于保存所有的主菜單 List<MeunInfo> rootMeun=new ArrayList<>(); //遍歷所有菜單集合,如果是主菜單的話直接放入rootMeun集合 for (MeunInfo info:list){ //判斷為0是因?yàn)槲业闹鞑藛螛?biāo)識(shí)是0 if (info.getMeunParent()==0){ rootMeun.add(info); } } //這個(gè)是遍歷所有主菜單,分別獲取所有主菜單的所有子菜單 for (MeunInfo info:rootMeun){ //獲取所有子菜單 遞歸 List<MeunInfo> childrenList=getchildrenMeun(info.getId(),list); //這個(gè)是實(shí)體類中的子菜單集合 info.setChildrenList(childrenList); } return rootMeun; } /** * 遞歸獲取子菜單(這個(gè)我也不太理解,copy過(guò)去就行) **/ public List<MeunInfo> getchildrenMeun(int id,List<MeunInfo> allMeun){ //用于保存子菜單 List<MeunInfo> childrenList=new ArrayList<>(); for (MeunInfo info: allMeun){ //判斷當(dāng)前的菜單標(biāo)識(shí)是否等于主菜單的id if(info.getMeunParent()==id){ //如果是的話 就放入主菜單對(duì)象的子菜單集合 childrenList.add(info); } } //這里就是遞歸了,遍歷所有的子菜單 for (MeunInfo info:childrenList){ info.setChildrenList(getchildrenMeun(info.getId(),allMeun)); } //如果子菜單為空的話,那就說(shuō)明某菜單下沒(méi)有子菜單了,直接返回空,子菜單為空的話就不會(huì)繼續(xù) //迭代了 if(childrenList!=null && childrenList.size()==0){ return null; } return childrenList; }
接下來(lái)是實(shí)體類
//菜單id private int id; //菜單標(biāo)題 private String meunTitle; //菜單地址 private String meunUrl; //菜單狀態(tài) private int meunStatus; //菜單標(biāo)識(shí) private int meunParent; //菜單排序 private int meunSort; //子菜單集合 private List<MeunInfo> childrenList; //get set 省略
之后你可以測(cè)試,可以拿到結(jié)果,這個(gè)自行測(cè)試
界面代碼(注意這里我是用的是layui)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="css/layui.css" > <style type="text/css"> #index-container,html,body{ margin:0px; padding:0px; } #index-container{ width:100%; height:auto; } #index-navigationbar{ width:100%; height:60px; } #index-navigationbar ul{ padding-left:77%; } #index-commonmenu{ width: 15%; height:519px; float: left; } #indixe-tab{ width:84.9%; height: 150px; float: right; } </style> </head> <body> <!--首頁(yè)容器--> <div id="index-container"> <!--信息菜單--> <div id="index-navigationbar"> <ul class="layui-nav" style="text-algin:right;background-color: black;"> <li class="layui-nav-item"> <a href="">控制臺(tái)<span class=" layui-badge">9</span></a> </li> <li class="layui-nav-item"> <a href="">個(gè)人中心<span class=" layui-badge-dot"></span></a> </li> <li class="layui-nav-item" lay-unselect=""> <a href="javascript:;" ><img src="http://t.cn/RCzsdCq" class="layui-nav-img">我</a> <dl class="layui-nav-child"> <dd><a href="javascript:;" >修改信息</a></dd> <dd><a href="javascript:;" >安全管理</a></dd> <dd><a href="javascript:;" >退了</a></dd> </dl> </li> </ul> </div> <!--操作菜單--> <div id="index-commonmenu"> <ul class="layui-nav layui-nav-tree" lay-filter="demo" style="margin-right:10px;height:538px;"> <!-- <li class="layui-nav-item"> <a href="javascript:;" >筆記管理</a> <dl class="layui-nav-child"> <dd><a href="javascript:;" meun_id=1>筆記列表</a></dd> <dd><a href="javascript:;" >分享列表</a></dd> </dl> </li> <li class="layui-nav-item"> <a href="javascript:;" >解決方案</a> <dl class="layui-nav-child"> <dd> <a href="javascript:;" >其他</a> <dl class="layui-nav-child"> <dd><a href="javascript:;" >三級(jí)菜單</a></dd> </dl> </dd> <dd><a href="">后臺(tái)模版</a></dd> <dd><a href="">電商平臺(tái)</a></dd> </dl> </li> <li class="layui-nav-item"><a href="javascript:;" >云市場(chǎng)</a></li> <li class="layui-nav-item"><a href="javascript:;" >社區(qū)</a></li>--> </ul> </div> <!--頁(yè)面選項(xiàng)卡--> <div id="indixe-tab"> <div class="layui-tab" lay-allowClose="true" lay-filter="demo1" style="margin:0px;padding:0px;"> <ul class="layui-tab-title"> </ul> <div class="layui-tab-content" style="margin:0px;padding:0px;"> </div> </div> </div> <div style="clear: both"></div> </div> </body> </html> <script type="text/javascript" src="/layui.js"></script> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script> //注意:導(dǎo)航 依賴 element 模塊,否則無(wú)法進(jìn)行功能性操作 layui.use('element', function(){ var $ = layui.jquery ,element = layui.element; element.on('nav(demo)', function(elem){ //console.log(elem.getAttribute("meun_id")); //得到當(dāng)前點(diǎn)擊的DOM對(duì)象 var id=$(this).attr("meun_id"); if(typeof(id)!="undefined"){ console.log('進(jìn)入方法'); element.tabAdd('demo1', { title: '新選項(xiàng)'+ (Math.random()*1000|0) //用于演示 ,content: '<iframe src="test.html" style="width:100%;height:491px;" scrolling="auto" frameborder="0"></iframe>' ,id: id//實(shí)際使用一般是規(guī)定好的id,這里以時(shí)間戳模擬下z }) element.tabChange('demo1', id); } }); //獲取所有的菜單 $.ajax({ type:"GET", url:"http://localhost:8080/test", dataType:"json", success:function(data){ //先添加所有的主材單 $.each(data,function(i,obj){ var content='<li class="layui-nav-item">'; content+='<a href="javascript:;" >'+obj.meunTitle+'</a>'; //這里是添加所有的子菜單 content+=loadchild(obj); content+='</li>'; $(".layui-nav-tree").append(content); }); element.init(); }, error:function(jqXHR){ aler("發(fā)生錯(cuò)誤:"+ jqXHR.status); } }); //組裝子菜單的方法 function loadchild(obj){ if(obj==null){ return; } var content=''; if(obj.childrenList!=null && obj.childrenList.length>0){ content+='<dl class="layui-nav-child">'; }else{ content+='<dl>'; } if(obj.childrenList!=null && obj.childrenList.length>0){ $.each(obj.childrenList,function(i,note){ content+='<dd>'; content+='<a href="javascript:;" >'+note.meunTitle+'</a>'; if(note.childrenList==null){ return; } content+=loadchild(note); content+='</dd>'; }); content+='</dl>'; } console.log(content); return content; } }); </script>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中的canvas?實(shí)現(xiàn)一個(gè)圓環(huán)漸變倒計(jì)時(shí)效果
這篇文章主要介紹了JavaScript中的canvas?實(shí)現(xiàn)一個(gè)圓環(huán)漸變倒計(jì)時(shí)效果,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09在實(shí)例中重學(xué)JavaScript事件循環(huán)
這篇文章主要介紹了在實(shí)例中重學(xué)JavaScript事件循環(huán),幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下2020-12-12不用AI也能實(shí)現(xiàn)的文字自動(dòng)播報(bào)(SpeechSynthesis文本實(shí)例合成)
SpeechSynthesis是HTML5的一個(gè)新特性,基于SpeechSynthesis可以實(shí)現(xiàn)在客戶瀏覽器端進(jìn)行動(dòng)態(tài)文本的語(yǔ)音合成播放,這篇文章主要介紹了不用AI也能實(shí)現(xiàn)的文字自動(dòng)播報(bào)(SpeechSynthesis文本實(shí)例合成),需要的朋友可以參考下2023-03-03uniapp中使用videojs構(gòu)建H5直播播放器
這篇文章主要為大家介紹了uniapp中使用videojs構(gòu)建H5直播播放器實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06JS中style.display和style.visibility的區(qū)別實(shí)例說(shuō)明
下面的例子說(shuō)明了這種區(qū)別:在這個(gè)例子中,divContent1和divContent2隱藏的時(shí)候用的是style.display=none,這時(shí)候,后面的div會(huì)向上移動(dòng),占據(jù)已經(jīng)隱藏的div的空間。divContent3和divContent4用的是style.visibility=hidden來(lái)隱藏,但是其隱藏后仍然占據(jù)原來(lái)的空間2013-03-03關(guān)于JavaScript中高階函數(shù)的魅力詳解
高階函數(shù):英文叫Higher-order function。JavaScript的函數(shù)其實(shí)都指向某個(gè)變量。下面這篇文章主要給大家介紹了關(guān)于JavaScript中高階函數(shù)的魅力,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09