如图:

vue
<template>
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
<el-radio-button :value="false">expand</el-radio-button>
<el-radio-button :value="true">collapse</el-radio-button>
</el-radio-group>
<el-menu
default-active="2"
class="el-menu-vertical-demo"
:collapse="isCollapse"
@open="handleOpen"
@close="handleClose"
>
<el-sub-menu index="1">
<template #title>
<div style="overflow: hidden;" v-if="!isCollapse">
<el-icon><location /></el-icon>
<span>Navigator One</span>
</div>
<div class="container" v-else>
<el-icon><location /></el-icon>
<div class="nav-coll-title">Navigator One</div>
</div>
</template>
<el-menu-item-group>
<template #title><span>Group One</span></template>
<el-menu-item index="1-1">item one</el-menu-item>
<el-menu-item index="1-2">item two</el-menu-item>
</el-menu-item-group>
<el-menu-item-group title="Group Two">
<el-menu-item index="1-3">item three</el-menu-item>
</el-menu-item-group>
<el-sub-menu index="1-4">
<template #title><span>item four</span></template>
<el-menu-item index="1-4-1">item one</el-menu-item>
</el-sub-menu>
</el-sub-menu>
</el-menu>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import {
Document,
Menu as IconMenu,
Location,
Setting,
} from '@element-plus/icons-vue'
const isCollapse = ref(true)
const handleOpen = (key: string, keyPath: string[]) => {
console.log(key, keyPath)
}
const handleClose = (key: string, keyPath: string[]) => {
console.log(key, keyPath)
}
</script>
<style>
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 200px;
min-height: 400px;
}
.nav-collapse {
height: 64px;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
}
:deep(.el-sub-menu__title) {
line-height: 0 !important;
}
.nav-title-collapse {
line-height: 14px !important;
}
.container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.nav-coll-title {
line-height: 14px;
height: 14px;
}
.el-menu--collapse {
--el-menu-icon-width: 100px !important;
}
</style>