React动态权限控制失效,组件没按角色切换显示

轩辕栾同 阅读 60

我在做用户角色切换时动态控制按钮权限,根据用户权限数组渲染组件。但切换角色后按钮没变化,哪里出问题了?

比如当前用useState存用户权限,用includes判断是否显示:


function AdminButton({ permissions }) {
  return (
    {permissions.includes('admin') && (
      <button>删除数据</button>
    )}
  )
}

在父组件用useEffect监听权限变化:


const [userRole, setRole] = useState('guest');

useEffect(() => {
  if (userRole === 'admin') {
    // 更新权限数组
  }
}, [userRole]);

但实际测试时,切换userRole为admin后按钮仍然不显示。控制台没报错,权限数组确实在变化,是什么原因导致组件没重新渲染?

我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
Mr.兴翰
Mr.兴翰 Lv1
问题出在 permissions 没有触发更新。你用 useState 存角色名,但权限数组可能没跟着变——useEffect 里只改了角色,没更新权限数组本身,组件依赖的 permissions 根本没变,React 当然不重渲染。

你得让 permissions 也变成 state,并在角色切换时同步更新它。比如:

const [userRole, setRole] = useState('guest');
const [permissions, setPermissions] = useState(['guest']);

useEffect(() => {
if (userRole === 'admin') {
setPermissions(['guest', 'admin']);
} else if (userRole === 'editor') {
setPermissions(['guest', 'editor']);
} else {
setPermissions(['guest']);
}
}, [userRole]);


然后组件里直接用 permissions

function AdminButton({ permissions }) {
return permissions.includes('admin') ? <button>删除数据</button> : null;
}


或者更偷懒点,别传 permissions,直接在父组件里用 userRole 判断:

{userRole === 'admin' && <button>删除数据</button>}


代码放这了,你对比下自己原来的,大概率是 permissions 没随 userRole 变,导致组件没收到新 props。
点赞 7
2026-02-26 15:17
小俊豪
小俊豪 Lv1
应该是权限数组没触发组件更新。你得把权限数组也用useState管理,不然useEffect改了普通变量不会触发渲染。

改成这样:

const [userRole, setRole] = useState('guest');
const [permissions, setPermissions] = useState([]);

useEffect(() => {
if (userRole === 'admin') {
setPermissions(['admin', 'edit']);
} else {
setPermissions(['guest']);
}
}, [userRole]);

return ;
点赞 12
2026-02-10 16:33