| <template> | 
|   <div v-if="!item.hidden" class="menu-wrapper"> | 
|     <template | 
|       v-if=" | 
|         hasOneShowingChild(item.children, item) && | 
|           (!onlyOneChild.children || onlyOneChild.noShowingChildren) && | 
|           !item.alwaysShow | 
|       " | 
|     > | 
|       <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)"> | 
|         <el-menu-item | 
|           :index="resolvePath(onlyOneChild.path)" | 
|           :class="{ 'submenu-title-noDropdown': !isNest }" | 
|         > | 
|           <item | 
|             :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" | 
|             :title="onlyOneChild.meta.title" | 
|           /> | 
|         </el-menu-item> | 
|       </app-link> | 
|     </template> | 
|     <!-- 如果当前item 有子节点 index唯一标识,popper-append-to-body是否将弹出菜单插入至body元素,在菜单定位出现问题时,可尝试修复该属性--> | 
|     <el-submenu | 
|       v-else | 
|       ref="subMenu" | 
|       :index="resolvePath(item.path)" | 
|       popper-append-to-body | 
|     > | 
|       <template slot="title"> | 
|         <!-- item指的是router中index中的路由对象。 例如 item.meta.icon="Example"  item.meta.title="监测因子展示" --> | 
|         <item | 
|           v-if="item.meta" | 
|           :icon="item.meta && item.meta.icon" | 
|           :title="item.meta.title" | 
|         /> | 
|       </template> | 
|   | 
|       <!-- 递归调用自身,直到item.children 不含子节点  自定义标签,vue文件名的驼峰标识--> | 
|       <sidebar-item | 
|         v-for="child in item.children" | 
|         :key="child.path" | 
|         :is-nest="true" | 
|         :item="child" | 
|         :base-path="resolvePath(child.path)" | 
|         class="nest-menu" | 
|       /> | 
|     </el-submenu> | 
|   </div> | 
| </template> | 
|   | 
| <script> | 
| import path from 'path' | 
| import { isExternal } from '@/utils/validate' | 
| import Item from './Item' | 
| import AppLink from './Link' | 
| import FixiOSBug from './FixiOSBug' | 
|   | 
| export default { | 
|   name: 'SidebarItem', | 
|   components: { Item, AppLink }, | 
|   mixins: [FixiOSBug], | 
|   props: { | 
|     // route object | 
|     item: { | 
|       type: Object, | 
|       required: true | 
|     }, | 
|     isNest: { | 
|       type: Boolean, | 
|       default: false | 
|     }, | 
|     basePath: { | 
|       type: String, | 
|       default: '' | 
|     } | 
|   }, | 
|   data() { | 
|     // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237 | 
|     // TODO: refactor with render function | 
|     this.onlyOneChild = null | 
|     return {} | 
|   }, | 
|   methods: { | 
|     hasOneShowingChild(children = [], parent) { | 
|       const showingChildren = children.filter(item => { | 
|         if (item.hidden) { | 
|           return false | 
|         } else { | 
|           // Temp set(will be used if only has one showing child) | 
|           this.onlyOneChild = item | 
|           return true | 
|         } | 
|       }) | 
|   | 
|       // When there is only one child router, the child router is displayed by default | 
|       if (showingChildren.length === 1) { | 
|         return true | 
|       } | 
|   | 
|       // Show parent if there are no child router to display | 
|       if (showingChildren.length === 0) { | 
|         this.onlyOneChild = { ...parent, path: '', noShowingChildren: true } | 
|         return true | 
|       } | 
|   | 
|       return false | 
|     }, | 
|     resolvePath(routePath) { | 
|       if (isExternal(routePath)) { | 
|         return routePath | 
|       } | 
|       if (isExternal(this.basePath)) { | 
|         return this.basePath | 
|       } | 
|       return path.resolve(this.basePath, routePath) | 
|     } | 
|   } | 
| } | 
| </script> |