首页 > 其他分享 >AntDesign中a-menu的使用案例

AntDesign中a-menu的使用案例

时间:2023-06-03 23:55:25浏览次数:65  
标签:案例 menu collapsed openKeys ant item key AntDesign

<template>
  <div class="nav-bar" :class="{ collapsed: collapsed }">
    <div class="collapse-btn" @click="toggleCollapsed">
      <a-icon :type="collapsed ? 'menu-unfold' : 'menu-fold'" />
    </div>
    <a-menu
      mode="inline"
      :open-keys="openKeys"
      @openChange="onOpenChange"
      :default-selected-keys="defaultKey"
      :inline-collapsed="collapsed"
    >
      <template v-for="item in routerList">
        <a-menu-item
          v-if="!item.children"
          :key="item.key"
          @click="onMenuClick(item)"
        >
          <template v-if="item.icon">
            <img
              :src="require('../assets/images/navIcon/' + item.icon + '.png')"
              class="title-img"
            />
          </template>
          <span>{{ item.name }}</span>
        </a-menu-item>
        <a-sub-menu v-else :key="item.key">
          <span slot="title">
            <template v-if="item.icon">
              <img
                :src="require('../assets/images/navIcon/' + item.icon + '.png')"
                class="title-img"
              />
            </template>
            <span>{{ item.name }}</span>
          </span>
          <a-menu-item
            v-for="child in item.children"
            :key="child.key"
            @click="onMenuClick(child)"
          >
            {{ child.name }}
          </a-menu-item>
        </a-sub-menu>
      </template>
    </a-menu>
  </div>
</template>
<script>
import Bus from '@/utils/eventBus'
import { getPermissionByUser } from '@/api/menu.js'
import { setLocalStorage, getLocalStorage } from '@/utils/localStorage.js'
export default {
  data() {
    return {
      routerList: [],
      rootSubmenuKeys: [],
      openKeys: [],
      collapsed: false,
      defaultKey: [],
    }
  },
  created() {
    this.getDataList()
  },
  // computed: {
  //   path() {
  //     return this.$route.path
  //   }
  // },
  methods: {
    // 获取菜单列表数据
    getDataList() {
      getPermissionByUser().then(result => {
        if (result.status === 0) {
          this.routerList = result.data
          this.setDefaultAndOpenKeys()
        }
      })
    },
    // 设置默认defaultKey和openKeys
    setDefaultAndOpenKeys() {
      const allKey = []
      this.routerList.map(item => {
        allKey.push(item.key)
      })
      this.rootSubmenuKeys = allKey
      const key = getLocalStorage('currentMenuKey')
      const dk = key ? key : this.routerList[0].key
      this.$set(this.defaultKey, 0, dk)
      const open = getLocalStorage('currentOpenKeys')
      if (open || this.routerList[0].children) {
        const ok = open ? open : this.routerList[0].key
        this.$set(this.openKeys, 0, ok)
      }
    },
    onOpenChange(openKeys) {
      const latestOpenKey = openKeys.find(
        key => this.openKeys.indexOf(key) === -1
      )
      if (this.rootSubmenuKeys.indexOf(latestOpenKey) === -1) {
        this.openKeys = openKeys
      } else {
        this.openKeys = latestOpenKey ? [latestOpenKey] : []
      }
      setLocalStorage('currentOpenKeys', openKeys[openKeys.length - 1])
    },
    onMenuClick(item) {
      this.$router.push(item.path)
      setLocalStorage('currentMenuKey', item.key)
    },
    toggleCollapsed() {
      this.collapsed = !this.collapsed
      setLocalStorage('collapsed', this.collapsed)
      Bus.emit('menuCollapse', this.collapsed)
    },
  },
}
</script>
<style lang="scss">
.nav-bar {
  width: 212px;
  overflow-y: auto;
  position: relative;

  .collapse-btn {
    position: absolute;
    bottom: 27px;
    right: 25px;
    cursor: pointer;
  }

  .title-img {
    margin-right: 8px;
    -webkit-filter: grayscale(100%);
    filter: grayscale(100%);
  }

  .ant-menu {
    height: 100%;
    background: #09193a;
    padding: 8px 0 0 0;
  }

  .ant-menu-item-selected,
  .ant-menu-submenu-selected {
    color: #ffffff !important;
    .title-img {
      -webkit-filter: grayscale(0);
      filter: grayscale(0);
    }
  }
}
.ant-menu-item:hover {
  color: #ffffff !important;
}

.nav-bar.collapsed {
  width: 52px;
  transition: all 0.6s ease;

  .collapse-btn {
    right: 15px;
  }

  .ant-menu-inline-collapsed {
    width: 52px;
  }

  .ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title {
    padding: 0 0 0 18px !important;
  }

  .ant-menu-item {
    color: #d3d3d3 !important;
    padding: 0 16px !important;

    & > span {
      display: none;
    }
  }
}
</style>

标签:案例,menu,collapsed,openKeys,ant,item,key,AntDesign
From: https://www.cnblogs.com/openmind-ink/p/17455053.html

相关文章

  • 6.6 数组排序案例分析
    冒泡排序classArrayUtil{publicstaticvoidsort(intdata[]){for(intx=0;x<data.length;x++){for(inty=0;y<data.length-x-1;y++){//注意这里的-x-1含义;if(data[y]<data[y+1]){......
  • 方法递归的案例:文件搜索
        ......
  • 【React工作记录八十三】React+Hook+ts+antDesign实现table行编辑功能
    前言大家好我是歌谣今天要说的是antdesign实现表格行编辑的功能考虑问题的时候我们需要多看官方的api开发开始紧接着我们对照着api进行开发首先加一个table<TableonChange={onTableChange}rowKey="id"......
  • 多线程安全的案例展示与解决方案
    一、概念1.什么是线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。通俗来说就是:不管业务中遇到怎么的多个线......
  • Vue——属性指令、style和class、条件渲染、列表渲染、事件处理、数据双向绑定、过滤
    vm对象<body><divid="app"><h1>{{name}}</h1><button@click="handleClick">点我</button></div></body><script>//1写在data或method中的属性或方法,从vm中直接可以点出来//2method的函数中,如......
  • NLP自然语言处理—主题模型LDA案例:挖掘人民网留言板文本数据|附代码数据
    全文链接:http://tecdat.cn/?p=2155最近我们被客户要求撰写关于NLP自然语言处理的研究报告,包括一些图形和统计输出。随着网民规模的不断扩大,互联网不仅是传统媒体和生活方式的补充,也是民意凸显的地带。领导干部参与网络问政的制度化正在成为一种发展趋势,这种趋势与互联网发展的时......
  • 5.24 面向对象案例分析六
    classBook{//类的名称要以class开头,否则报错,并且提示不到这行代码!!!privateintbid;privateStringtitle;privatedoubleprice;privatestaticintcount=0;publicBook(Stringtitle,doubleprice){count++;this.bid=count;......
  • 5.23 面向对象案例分析五
    用static,引入计数器案例classUser{privateStringuid;privateStringpassword;privatestaticintcount=0;publicUser(){this("NOID","mldn");}publicUser(Stringuid){this(uid,"mldnjava&q......
  • 5.21 面向对象案例分析三
    狗的一个类,包括名字,颜色,年龄;典型的java类的一段代码classDog{privateStringname;privateStringcolor;privateintage;publicDog(){}publicDog(Stringname,Stringcolor,intage){this.name=name;this.color=color;......
  • 5.20 面向对象案例分析二
    classEmployee{privatelongempno;privateStringename;privatedoublesalary;privatedoublerate;publicEmployee(){}publicEmployee(longempno,Stringename,doublesalary,doublerate){this.empno=empno;this......