const renderMenu = (菜单, 键) =>; { if (!CheckPermission(menu.moduleKey, menu.permissionKey)) { 返回空值; } 返回 ( <工具提示标题={menu.name}placement=“right”key={key}> <导航链接 activeClassName={styles.active} 精确的 类名={styles.item} 到={菜单.路径} > <span className={styles.iconBox}>{menu.icon}</span> <span className={styles.itemText}> {菜单.名称}</span> </NavLink> </工具提示> ); }; 导出默认值({collapse,onCollapse,isAdmin})=> { const { 用户 } = useSelector((状态) => ({ 用户:state.auth.user, })); 返回 ( <布局.Sider 主题=“光” className = {classnames(styles.sider,折叠?styles.collapsed:“”)} 可折叠的 折叠={折叠} onCollapse={onCollapse} 宽度={折叠? 64:264} onBreakpoint={() =>; {}} 断点=“xl” 风格={{ 溢出:“自动”, 高度:“100vh”, 位置:“固定”, 左:0, 顶部:0, 顶部填充:“50px”, }} >; {用户&&用户只读 ?菜单.map((菜单, i) => { if (menu.name === "Харилцагч") { 返回渲染菜单(菜单,i); } 别的 { 返回 ( 菜单&& 菜单.children && // eslint-disable-next-line array-callback-return menu.children.map((子菜单, j) => { if (submenu.name === "QR данс") { 返回 ( <div key={i} className={styles.parentnav}> {渲染菜单(子菜单,j)}; ); } }) ); } }) : 菜单.map((菜单, i) => { if (菜单.路径) { 返回渲染菜单(菜单,i); } 别的 { 返回 ( <div key={i} className={styles.parentnav}> {菜单.名称? ({菜单.名称}) : 无效的} {menu.children.map((子菜单, j) => { if (!submenu.path) 返回 null; 如果(是管理员){ 返回渲染菜单(子菜单,j); } 别的 { 返回空值; } })}
P粉8248896502023-08-15 09:10:52
"错误:渲染时使用的hooks数量多于上一次渲染时的数量",通常发生在您使用React hooks(例如useSelector)的方式违反了hooks规则时。规则规定,hooks必须始终在函数组件的顶层调用,而不是在循环、条件或嵌套函数中调用。在您的代码中,您似乎在循环和条件中使用了CheckPermission函数。
// Sidebar.js import React from "react"; import { useSelector } from "react-redux"; import { NavLink, Tooltip } from "your-react-ui-library"; // 导入您的UI库 const Sidebar = ({ collapse, onCollapse, isAdmin, menus }) => { const { user } = useSelector((state) => ({ user: state.auth.user, })); // 将权限检查逻辑直接移入Sidebar组件 const checkPermission = (module_key, permission_key) => { const rolePermissions = user?.role?.role_permissions ?? []; return !!rolePermissions.find( (p_list) => p_list.module?.key === module_key && p_list.permission?.key === permission_key ); }; const renderMenu = (menu, key) => { // 使用本地的checkPermission函数进行权限检查 if ( !checkPermission(menu.moduleKey, menu.permissionKey) || (!isAdmin && !menu.path) ) { return null; } return ( <Tooltip title={menu.name} placement="right" key={key}> <NavLink activeClassName={styles.active} exact className={styles.item} to={menu.path} > <span className={styles.iconBox}>{menu.icon}</span> <span className={styles.itemText}> {menu.name}</span> </NavLink> </Tooltip> ); }; return ( <Layout.Sider // ... 其他属性和样式 ... > <div className={styles.action}> {user && user.read_only ? menus.map((menu, i) => { if (menu.name === "Харилцагч") { return renderMenu(menu, i); } else { return ( menu && menu.children && // eslint-disable-next-line array-callback-return menu.children.map((submenu, j) => { if (submenu.name === "QR данс") { return ( <div key={i} className={styles.parentnav}> {renderMenu(submenu, j)} </div> ); } }) ); } }) : menus.map((menu, i) => { if (menu.path) { return renderMenu(menu, i); } else { return ( <div key={i} className={styles.parentnav}> {menu.name ? ( <div className={`${styles.navlabel} ${styles.partentText}`} > {menu.name} </div> ) : null} {menu.children.map((submenu, j) => { if (!submenu.path) return null; if (isAdmin) { return renderMenu(submenu, j); } else { return null; } })} </div> ); } })} </div> </Layout.Sider> ); }; export default Sidebar;