react18 antd 引入导航栏之后一些bug,解决方法收集

概述:

我们开发react引入antd之后导航栏会出现刷新不选中、不展开二级导航栏、页面js点击之后不选中最新tab、只能展开一个二级tab之类的问题。那么我们一起来把问题给解决了


问题描述

其实问题这些问题差不多就是一个问题,就是Menu没有刷新选中的状态

实现代码

html 复制代码
import React, { useState ,useEffect } from 'react';
import {
  DesktopOutlined,
  FileOutlined,
  PieChartOutlined,
  TeamOutlined,
  UserOutlined,
} from '@ant-design/icons';
import {Menu} from 'antd';
import {useNavigate ,useLocation} from "react-router-dom"
import type { MenuProps } from 'antd';


type MenuItem = Required<MenuProps>['items'][number];

function getItem(
  label: React.ReactNode,
  key: React.Key,
  icon?: React.ReactNode,
  children?: MenuItem[],
): MenuItem {
  return {
    key,
    icon,
    children,
    label,
  } as MenuItem;
}

const items: MenuItem[] = [
  getItem('首页', '/index', <PieChartOutlined />),
  getItem('店铺', '/store', <DesktopOutlined />),
  getItem('商品', 'goods', <UserOutlined />, [
    getItem('平台商品', '/goods/list'),
    getItem('平台添加', '/goods/edit'),
    getItem('平台商品', '/goods/page301'),
    getItem('平台品牌', '48'),
    getItem('自营商品', '55'),
    getItem('自营品牌', '56'),
    getItem('标配商品', '57'),
  ]),
  getItem('订单', 'page4', <UserOutlined />, [
    getItem('采购单', '/page3/page301'),
    getItem('客户订单', '4'),
    getItem('订单列表', '50'),
    getItem('售后列表', '53'),
  ]),
  getItem('财务', 'page5', <UserOutlined />, [
    getItem('结算单列表', '/page3/page301'),
    getItem('我的钱包', '40'),
    getItem('支付密码设置', '52'),
  ]),
  getItem('会员', 'page6', <UserOutlined />, [
    getItem('邀请会员', '/page3/page301'),
    getItem('邀请用户列表', '41'),
  ]),
  getItem('数据', 'page7', <UserOutlined />, [
    getItem('销售统计', '/page3/page301'),
    getItem('售后统计', '42'),
    getItem('商品统计', '43'),
    getItem('操作日记', '44'),
  ]),
  getItem('广告管理', 'page8', <UserOutlined />, [
    getItem('广告位列表', '/page3/page301'),
    getItem('广告列表', '422'),
  ]),
];

const Comp: React.FC = () => {
  
  const navigateTo = useNavigate();
  const currentRouter =  useLocation();
  const [selectedKeys, setSelectedKeys] = useState(currentRouter.pathname);//当前选中项
  const [stateOpenKeys, setStateOpenKeys] = useState(firstOpenkey);//默认二级导航栏
  
  useEffect(() => {//组件动态更新
    setSelectedKeys(currentRouter.pathname)
  })

  const menuClick = (e:{key:string})=>{
    console.log(e.key)
    //在js里面跳转到对应的路由  编程式导航跳转,利用到一个hook
    navigateTo(e.key);
  }

  function firstOpenkey(): string{
    for(let i=0;i<items.length;i++){
      //判断找到情况
      if(items[i]!['children']&&items[i]!['children'].length>0 && items[i]!['children'].find(findkey)){
        return items[i]!.key as string;
      }
    }
    return ''
  }

  function findkey(obj:{key:string}){
    return obj.key===currentRouter.pathname
  }

  const handleonOpenChange =(keys:string[])=>{
    //展开和回收的事件
    setStateOpenKeys(keys[keys.length-1])
  }

  return(
    <Menu 
      theme="dark" 
      defaultSelectedKeys={[currentRouter.pathname]} 
      selectedKeys={[selectedKeys]}
      mode="inline" 
      items={items} 
      onClick={menuClick} 
      onOpenChange={handleonOpenChange}
      openKeys={[stateOpenKeys]}
      />
  )
}

export default Comp;

这样一来就可以通过useNavigate来跳转页会刷新当前的状态,展开相应的二级ta

感兴趣的小伙伴也可以前往https://github.com/yididid/react-manage,进行下载项目代码

相关推荐
潜意识起点23 分钟前
精通 CSS 阴影效果:从基础到高级应用
前端·css
奋斗吧程序媛27 分钟前
删除VSCode上 origin/分支名,但GitLab上实际上不存在的分支
前端·vscode
IT女孩儿37 分钟前
JavaScript--WebAPI查缺补漏(二)
开发语言·前端·javascript·html·ecmascript
m0_748256563 小时前
如何解决前端发送数据到后端为空的问题
前端
请叫我飞哥@3 小时前
HTML5适配手机
前端·html·html5
@解忧杂货铺5 小时前
前端vue如何实现数字框中通过鼠标滚轮上下滚动增减数字
前端·javascript·vue.js
F-2H6 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
WebDeveloper20016 小时前
如何使用美国域名中心US Domain Center和WordPress创建商业网站
运维·服务器·css·网络·html
gqkmiss7 小时前
Chrome 浏览器插件获取网页 iframe 中的 window 对象
前端·chrome·iframe·postmessage·chrome 插件
m0_748247559 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php