custom类antd menu

工作需要封装了一下如下图的menu,实现比较简单,使用也比较简单。比较来说没有antd menu好用,大家看个思路自定义自己的menu;
在这里插入图片描述
技术栈 react + umi + ice-store + hooks + ts + less + antd

index.tsx如下

/*
 * @文件描述:Menu菜单
 * 参数 menus数组 见接口
 * @作者: 于效仟
 * @Date: 2019-11-27 17:12:01
 * @LastEditors: 于效仟
 * @LastEditTime: 2019-11-27 17:34:19
 */
import React, { useState } from 'react';
import { Dropdown, Menu } from 'antd';
import styles from './index.module.less';
import stores from '@/stores';
import { HomeStore } from '@/interfaces/home.store';
import classnames from 'classnames';
import router from 'umi/router';
import Link from 'umi/link';

interface MenuProps {
  // 菜单文本
  text: string;
  // 菜单链接
  url?: string;
  // 子菜单数组同当前
  subMenus?: MenuProps[];
}

interface MenusProps {
  menus: MenuProps[];
}

export default ({ menus }: MenusProps) => {
  const [menuNum, setMenuNum] = useState();
  const home = stores.useStore('homeStore') as HomeStore;
  const { tenantCode } = home;

  return (
    <div className={styles.menu}>
      {menus.map((menu, index) =>
        menu.subMenus ? (
          <Dropdown
            key={index}
            placement="bottomCenter"
            overlayClassName={styles.dropdownMenu}
            overlay={
              <Menu>
                {menu.subMenus &&
                  menu.subMenus.map((subMenu, indexDrop) => (
                    <Menu.Item
                      key={indexDrop}
                      onClick={() => {
                        setMenuNum(index);
                        router.push(`${subMenu.url}?tenantcode=${tenantCode}`);
                      }}
                    >
                      <span style={{ fontSize: 18 }}>{subMenu.text}</span>
                    </Menu.Item>
                  ))}
              </Menu>
            }
          >
            <div
              key={index}
              className={classnames(styles.menuItem, index === menuNum && styles.active)}
            >
              {menu.text}
            </div>
          </Dropdown>
        ) : (
          <Link
            key={index}
            className={classnames(styles.menuItem, index === menuNum && styles.active)}
            to={`${menu.url}?tenantcode=${tenantCode}`}
            onClick={() => setMenuNum(index)}
          >
            {menu.text}
          </Link>
        ),
      )}
    </div>
  );
};

index.module.less

.menu {
  width: 1920px;
  height: 50px;
  background: rgba(39, 114, 254, 1);
  line-height: 50px;
  padding-left: 389px;

  .menuItem {
    height: 25px;
    font-size: 18px;
    color: rgba(255, 255, 255, 0.7);
    line-height: 25px;
    margin-right: 54px;
    display: inline-block;

    &:hover,
    &.active {
      color: rgba(255, 255, 255, 1);
    }
  }

  .active {
    height: 25px;
    font-size: 18px;
    line-height: 25px;
    margin-right: 54px;
    color: #fff;
  }
}

.dropdownMenu {
  position: absolute;
  top: 130px !important;
  left: -2px;

  :global {
    .ant-dropdown-menu-item {
      width: 152px;
      height: 42px !important;
      display: flex;
      align-items: center;
      justify-content: center;
    }
  }
}

仅供学习与参考,没有过多去封装。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值