<p>我在我的项目中遇到了一些钩子问题。这是一个用于检查用户权限并返回true或false的函数。</p>
<pre class="brush:php;toolbar:false;">从“react-redux”导入 { useSelector };
const CheckPermission = (module_key,permission_key) =>; {
const { 用户 } = useSelector((状态) => ({
用户:state.auth.user,
}));
const rolePermissions = 用户?.角色?.role_permissions ?? [];
const return_value = !!rolePermissions.find(
(p_list) =>;
p_list.module?.key === module_key &&
p_list.permission?.key ===permission_key
);
返回返回值;
};
导出默认CheckPermission;</pre>
<p>然后我在我的侧边栏组件中使用它</p>
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);
} 别的 {
返回空值;
}
})}
"错误:渲染时使用的hooks数量多于上一次渲染时的数量",通常发生在您使用React hooks(例如useSelector)的方式违反了hooks规则时。规则规定,hooks必须始终在函数组件的顶层调用,而不是在循环、条件或嵌套函数中调用。在您的代码中,您似乎在循环和条件中使用了CheckPermission函数。