Vue3项目—顶栏Dropdown 下拉菜单

2,644 阅读1分钟

Vue3项目—顶栏Dropdown 下拉菜单

默认情况下,只需要悬停在触发菜单的元素上即可,无需点击也会显示下拉菜单。

示例

<template>
  <el-dropdown>
    <span class="el-dropdown-link">
      Dropdown List
      <el-icon class="el-icon--right">
        <arrow-down />
      </el-icon>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item>Action 1</el-dropdown-item>
        <el-dropdown-item>Action 2</el-dropdown-item>
        <el-dropdown-item>Action 3</el-dropdown-item>
        <el-dropdown-item disabled>Action 4</el-dropdown-item>
        <el-dropdown-item divided>Action 5</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script lang="ts" setup>
import { ArrowDown } from '@element-plus/icons-vue'
</script>
<style scoped>
.example-showcase .el-dropdown-link {
  cursor: pointer;
  color: var(--el-color-primary);
  display: flex;
  align-items: center;
}
</style>

效果:

image.png

项目实例

顶栏子组件:

<!-- layout/header/index.vue -->
<template class="pm-header">
  <div
    class="flex justify-between items-center mt-2 cursor-pointer"
  >
    <el-image
      v-if="!isPC"
      class="pm-sider__icon mt-2"
      src="/img/program/operation-sider-collapse-icon.png"
      @click="toggleCollapse"
    />
    <div
      v-if="isPC"
      class="flex justify-start items-center"
    >
      <el-image
        src="/img/common/logo@2x.png"
        fit="cover"
        class="mr-4 pm-header__logo"
      />
      <div class="pm-header__title text-light-50">
        运营后台
      </div>
    </div>
    <el-space>
      <div class="text-light-50">
        {{ name }}
      </div>
      <el-dropdown>
        <el-avatar :icon="UserFilled" />
        <template #dropdown>
          <el-dropdown-menu>
            <el-dropdown-item>
              用户id: {{ id }}
            </el-dropdown-item>
            <el-dropdown-item>
              性别: {{ gender }}
            </el-dropdown-item>
            <el-dropdown-item @click="userLogOut">
              退出系统
            </el-dropdown-item>
          </el-dropdown-menu>
        </template>
      </el-dropdown>
    </el-space>
  </div>
</template>

<script setup lang='ts'>
import { UserFilled } from '@element-plus/icons-vue';
import { logOut } from '~/core/api';
import { redirect } from '~/core/utils';
import * as API from '~/core/types';
import { useAccountStore, useMenuStore } from '~/store';
import { ref, watchEffect } from 'vue';
import { storeToRefs } from 'pinia';
const { userInfo: { name, gender, id } } = useAccountStore();
const store = useMenuStore();
const { toggleCollapse } = store;
const { userAgent } = storeToRefs(store);
const isPC = ref(false);

watchEffect(() => {
  isPC.value = userAgent.value === 'PC';
});
const userLogOut = async () => {
  await logOut();
  redirect('/login');
};

</script>

<style lang="scss">
@import '~/styles/var.scss';
.pm-header {
  &__logo {
    width: 40px;
    height: 28px;
  }
  &__title {
    font-size: $pm-font-size-md;
    line-height: 40px;
  }
}
</style>

效果:

image.png