<template> 
 | 
  <div v-if="!item.hidden"> 
 | 
    <template v-if="hasOneShowingChild(item.children,item) && (!onlyOneChild.children||onlyOneChild.noShowingChildren)&&!item.alwaysShow"> 
 | 
      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)"> 
 | 
        <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> 
 | 
  
 | 
    <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body> 
 | 
      <template slot="title"> 
 | 
        <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" /> 
 | 
      </template> 
 | 
      <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() { 
 | 
    this.onlyOneChild = null 
 | 
    return {} 
 | 
  }, 
 | 
  methods: { 
 | 
    hasOneShowingChild(children = [], parent) { 
 | 
      if (!children) { 
 | 
        children = []; 
 | 
      } 
 | 
      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, routeQuery) { 
 | 
      if (isExternal(routePath)) { 
 | 
        return routePath 
 | 
      } 
 | 
      if (isExternal(this.basePath)) { 
 | 
        return this.basePath 
 | 
      } 
 | 
      if (routeQuery) { 
 | 
        let query = JSON.parse(routeQuery); 
 | 
        return { path: path.resolve(this.basePath, routePath), query: query } 
 | 
      } 
 | 
      return path.resolve(this.basePath, routePath) 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</script> 
 |