From 251d2411f235e23209d57173857e05b637729ce8 Mon Sep 17 00:00:00 2001
From: LiuHao <liuhaoai545@gmail.com>
Date: 星期日, 02 四月 2023 01:01:56 +0800
Subject: [PATCH] refactor ts

---
 src/layout/components/Sidebar/SidebarItem.vue |   81 +++++++++++++++++++++-------------------
 1 files changed, 42 insertions(+), 39 deletions(-)

diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue
index c423fb1..0c5831f 100644
--- a/src/layout/components/Sidebar/SidebarItem.vue
+++ b/src/layout/components/Sidebar/SidebarItem.vue
@@ -1,41 +1,14 @@
-<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 }">
-          <svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/>
-          <template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template>
-        </el-menu-item>
-      </app-link>
-    </template>
-
-    <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
-      <template v-if="item.meta" #title>
-        <svg-icon :icon-class="item.meta && item.meta.icon" />
-        <span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
-      </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-sub-menu>
-  </div>
-</template>
-
-<script setup>
+<script setup lang="ts">
 import { isExternal } from '@/utils/validate'
-import AppLink from './Link'
+import AppLink from './Link.vue'
 import { getNormalPath } from '@/utils/ruoyi'
+import { RouteOption } from "vue-router";
+import { PropType } from "vue";
 
 const props = defineProps({
   // route object
   item: {
-    type: Object,
+    type: Object as PropType<RouteOption>,
     required: true
   },
   isNest: {
@@ -48,9 +21,9 @@
   }
 })
 
-const onlyOneChild = ref({});
+const onlyOneChild = ref<any>({});
 
-function hasOneShowingChild(children = [], parent) {
+const hasOneShowingChild = (children:RouteOption[] = [], parent: RouteOption) => {
   if (!children) {
     children = [];
   }
@@ -78,7 +51,7 @@
   return false
 };
 
-function resolvePath(routePath, routeQuery) {
+const resolvePath = (routePath:string, routeQuery?:string): any => {
   if (isExternal(routePath)) {
     return routePath
   }
@@ -92,11 +65,41 @@
   return getNormalPath(props.basePath + '/' + routePath)
 }
 
-function hasTitle(title){
-  if (title.length > 5) {
-    return title;
-  } else {
+const hasTitle = (title: string | undefined): string => {
+  if(!title || title.length <= 5) {
     return "";
   }
+  return title;
 }
 </script>
+
+<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 }">
+					<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" />
+					<template #title>
+						<span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span>
+					</template>
+				</el-menu-item>
+			</app-link>
+		</template>
+
+		<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported>
+			<template v-if="item.meta" #title>
+				<svg-icon :icon-class="item.meta ? item.meta.icon : '' " />
+				<span class="menu-title" :title="hasTitle(item.meta?.title)">{{ item.meta?.title }}</span>
+			</template>
+
+			<sidebar-item
+				v-for="child in item.children"
+				:key="child.path"
+				:is-nest="true"
+				:item="child as RouteOption"
+				:base-path="resolvePath(child.path)"
+				class="nest-menu"
+			/>
+		</el-sub-menu>
+	</div>
+</template>

--
Gitblit v1.9.3