效果圖:
實現方式即是從vue的data中拿到數據后進行循環
大致流程圖
HTML部分
html部分重點就是
@click.stop="secondary_menu_to(mc.m_c_route)" 點擊事件並增加阻止事件冒泡
v-show="clickBtnVal == val.menu_id?true:false" 通過判斷要顯示哪一個子菜單
<div id="app"> <aside> <ul> <li v-for="val in menu" :key="val.menu_id" @click="showChildAside(val.menu_id)"> <div class="menu_name"> 一級菜單{{val.menu_name}} </div> <ul> <transition-group name="aside" tag="ul"> <li class="child_aside_li" v-for="mc,key in val.menu_child" :key="mc.m_c_route" @click.stop="secondary_menu_to(mc.m_c_route)" v-show="clickBtnVal == val.menu_id?true:false"> 二級菜單{{mc.m_c_name}} </li> </transition-group> </ul> </li> </ul> </aside> <main>main</main> </div>
vue部分
需要注意的部分:一個是data中用於循環的數據設計
另一個是點擊判斷的傳過來的值是否為null或是已經處於打開的菜單的id值,即下面的 showChildAside(clickBtn)函數
<script type="text/javascript"> new Vue({ el: "#app", data: { menu: [{ menu_id: "A", menu_name: "主頁", menu_child: [{ m_c_route: "map11", m_c_name: "地圖" }, { m_c_route: "commiunity", m_c_name: "社區" } ] }, { menu_id: "B", menu_name: "主頁", menu_child: [{ m_c_route: "map2", m_c_name: "地圖" }, { m_c_route: "commiunity", m_c_name: "社區" } ] }, { menu_id: "C", menu_name: "主頁", menu_child: [{ m_c_route: "map3", m_c_name: "地圖" }, { m_c_route: "commiunity", m_c_name: "社區" } ] }, { menu_id: "D", menu_name: "主頁", menu_child: [{ m_c_route: "map4", m_c_name: "地圖" }, { m_c_route: "commiunity", m_c_name: "社區" } ] } ], clickBtnVal: null }, methods: { showChildAside(clickBtn) { // console.log("1 : ", this.clickBtnVal) // 這里的if用來判斷再一次點擊的選項有沒有處於開啟狀態 if (this.clickBtnVal != clickBtn || this.clickBtnVal == null) { this.clickBtnVal = clickBtn } else { this.clickBtnVal = null } }, secondary_menu_to(m_c_route) { // 這里為點擊子目錄后要做的事,跳轉頁面等 console.log("跳轉的路由", m_c_route) } }, }) </script>
css部分
<style type="text/css"> * { margin: 0; padding: 0; } ul, li { list-style: none; } #app { display: grid; grid-template-columns: 160px 1fr; } /* 父級菜單顯示菜單名的class */ .menu_name { height: 40px; line-height: 40px; background-color: #00FFFF; border-bottom: 2px #FFFFFF solid; cursor: pointer; padding-left: 15px; } /* 子級菜單顯示菜單明的class */ .child_aside_li { line-height: 60px; background-color: #3197C3; margin-left: 30px; overflow: hidden; color: white; padding-left: 10px; cursor: pointer; } aside { width: 160px; overflow: hidden; height: 100vh; background-color: aliceblue; } .aside-enter, .aside-leave-to { opacity: 0; height: 0; } .aside-enter-to, .aside-leave { opacity: 1; height: 60px; } .aside-enter-active, .aside-leave-active { transition: all 0.5s ease; } </style>
存在的問題:v-for與v-show一起連用不知道會不會有生么影響,性能的消耗也未知。還存不存在什么bug也未知