2021-07-19 17:36:48 +08:00
|
|
|
<template>
|
|
|
|
|
<div>
|
|
|
|
|
<!-- menu -->
|
|
|
|
|
<div class="app-menu">
|
|
|
|
|
<div class="app-menu-header">
|
|
|
|
|
<div class="app-menu-logo">
|
2021-07-20 15:29:20 +08:00
|
|
|
<img src="@/assets/logo.png" class="w-9 h-9 mt-2" alt="logo" />
|
2021-07-19 17:36:48 +08:00
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="app-menu-list">
|
|
|
|
|
<div class="app-menu-item" v-for="(item,index) in menus" :key="index">
|
2021-07-20 15:29:20 +08:00
|
|
|
<router-link class="app-menu-item-link" :to="item.href">
|
2021-07-19 17:36:48 +08:00
|
|
|
<i class="iconfont app-menu-item-icon" :style="iconStyle" :class="item.icon"></i>
|
|
|
|
|
<span v-if="isText" class="app-menu-item-text ml-3">{{ item.text }}</span>
|
|
|
|
|
</router-link>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
|
|
import { onMounted, ref } from "@vue/runtime-core";
|
2021-07-20 22:46:18 +08:00
|
|
|
import type { PropType } from "vue";
|
|
|
|
|
|
|
|
|
|
interface AppMenuItem {
|
|
|
|
|
href: string;
|
|
|
|
|
icon: string;
|
|
|
|
|
text: string;
|
|
|
|
|
}
|
2021-07-19 17:36:48 +08:00
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
|
|
|
isText: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
default: false
|
|
|
|
|
},
|
|
|
|
|
size: {
|
|
|
|
|
type: String,
|
2021-07-20 15:29:20 +08:00
|
|
|
default: '26px'
|
2021-07-19 17:36:48 +08:00
|
|
|
},
|
|
|
|
|
color: {
|
|
|
|
|
type: String,
|
2021-07-20 15:29:20 +08:00
|
|
|
default: '#aaa'
|
2021-07-19 17:36:48 +08:00
|
|
|
},
|
|
|
|
|
menus: {
|
2021-07-20 22:46:18 +08:00
|
|
|
type: Array as PropType<AppMenuItem[]>,
|
2021-07-20 15:29:20 +08:00
|
|
|
default: []
|
2021-07-19 17:36:48 +08:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
let iconStyle = ref({})
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
// 初始化
|
|
|
|
|
iconStyle.value = {
|
|
|
|
|
fontSize: props.size,
|
|
|
|
|
color: props.color
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
.app-menu {
|
2021-07-19 23:13:22 +08:00
|
|
|
@apply flex-col items-center justify-center p-6;
|
2021-07-19 17:36:48 +08:00
|
|
|
max-width: 100px;
|
|
|
|
|
}
|
|
|
|
|
.app-menu-item-link,
|
|
|
|
|
.app-menu-header {
|
|
|
|
|
@apply flex items-center justify-center;
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-20 15:29:20 +08:00
|
|
|
.app-menu-item-link {
|
|
|
|
|
@apply mb-6 mt-6;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.app-menu-item-icon:hover {
|
|
|
|
|
color: #fff !important;
|
|
|
|
|
transform: scale(1.05);
|
|
|
|
|
transition: 0.2s ease-in-out;
|
2021-07-19 17:36:48 +08:00
|
|
|
}
|
|
|
|
|
</style>
|