You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React/JS匹配数组对象用户邮箱 按权限判断按钮禁用状态

用户权限匹配与按钮禁用实现方案

首先注意你给出的UserList结构有一层多余的外层数组包裹,实际存储用户权限的是数组第一个元素下以数字为键的对象集合,写逻辑的时候要先处理这层结构。

核心判断逻辑

不推荐直接用includes扫整个结构判断:直接对数组调用includes读不到嵌套的email字段,把整个对象转成字符串再匹配又容易出现误判(比如其他字段刚好出现相同字符串就会判断错误),精准匹配字段的写法更可靠:

// 注意邮箱是字符串,定义的时候要加引号
const myEmail = "user2@gmail.com";

/**
 * 校验当前用户是否为只读权限
 * @param {string} currentEmail 当前用户邮箱
 * @param {Array} permissionSource 权限列表数据
 * @returns {boolean} 返回true时按钮需要禁用
 */
const isReadOnlyUser = (currentEmail, permissionSource) => {
  // 提取所有用户权限条目,适配你当前的嵌套结构
  const allUserPermissions = Object.values(permissionSource[0]);
  // 精准匹配当前用户的权限条目
  const currentUserPerm = allUserPermissions.find(item => item.users.email === currentEmail);
  // 没找到匹配用户时可以根据业务需求调整返回值,这里默认无匹配就禁用按钮
  if (!currentUserPerm) return true;
  return currentUserPerm.permission.access === "Read Only";
};

// 直接得到按钮需要的disabled布尔值
const buttonDisabled = isReadOnlyUser(myEmail, UserList);

如果后续你优化数据结构,去掉外层多余的数组,直接把用户权限对象存在数组中(即const UserList = [{users: {...}, permission: {...}}, ...]),只需要把上面提取allUserPermissions的逻辑改成const allUserPermissions = permissionSource即可,其余逻辑不用修改。

跨组件传值实现

因为控制状态的按钮在独立文件中,选以下两种常用方案即可:

  • 方案1:状态上提,通过props传递
    在持有UserList和当前用户邮箱的上层组件中,提前调用上面的工具函数计算出buttonDisabled布尔值,作为props传给独立的按钮组件,按钮组件内部直接绑定<button disabled={buttonDisabled}></button>即可。这种方案下按钮组件完全不需要感知权限逻辑,只负责根据传入的props渲染,职责最清晰,优先推荐。
  • 方案2:全局状态+公共工具函数
    如果用户权限是全站通用的逻辑,可以把当前登录用户邮箱、权限列表存在全局状态中(比如React Context、Redux,Vue的Pinia/Vuex都可以),再把上面的校验函数抽成公共工具方法,在按钮组件文件中直接引入方法、读取全局状态计算出禁用状态即可,适合多个地方都需要做同类权限判断的场景。

内容的提问来源于stack exchange,提问作者makiwumi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:57:21