权限勾选与取消操作

本文介绍了前端权限管理中关于树形结构勾选与取消的操作实现。通过HTML、CSS和JavaScript代码展示了如何处理节点的勾选状态,并实现选中节点时检查其兄弟节点的全选状态,以及获取所有子节点的功能。同时,文章还涉及了权限树的渲染和事件处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HTML部分
<Tree
className={styles.menutree}
checkable
checkStrictly
checkedKeys={addMenuIds} // 勾选中的菜单
// defaultExpandAll
blockNode
onCheck={(…rest) =>
this.onAuthCheck(…rest, ‘2.1’, data)
}
>
{this.renderMenuPermissionTreeNodes(data)}

CSS部分
.menutree {
:global {
.ant-tree-treenode-switcher-close {
// display: flex;
.ant-tree-node-content-wrapper {
// flex: 1;
width: calc(100% - 24px);
}
}
.ant-tree-treenode-switcher-open {
.ant-tree-node-content-wrapper {
width: calc(100% - 24px);
}
}
.ant-tree-node-content-wrapper {
padding-right: 0 !important;
}
.ant-tree-node-content-wrapper:hover {
.risk {
visibility: visible;
}
}
}
}
JS部分

onAuthCheck = (checkedKeys, raw, type, functionalAuthorityList) => {
const { addMenuIds } = this.state;
const role = getAuthority(X-Role-OTA) || [];
const { roleName } = getCurrentRole() || {};
let roleId = undefined;
role.map(item => {
if(item.roleName === roleName) {
roleId = item.roleId
}
})
const { checked, node, checkedNodes } = raw;
if (raw.checked) {
// 选中
const checkSiblingNodeChecked = this.checkSiblingNodeChecked(
node.props.eventKey,
functionalAuthorityList,
checkedNodes
);
// 没有父子关系 需要把子元素全部获取出来
const childrenKeys = this.getChildrenKeys(node, checked);

  let addRoleMenuKeys = childrenKeys.map((checkedKey) => ({
    menuId: checkedKey,
    roleId,
  }));
  // 如果相邻子元素全部打钩了,那父级元素需要打钩
  if (checkSiblingNodeChecked) {
    addRoleMenuKeys.push({
      menuId: checkSiblingNodeChecked,
      roleId,
    });
  }
  // 如果打钩了,顶级元素没有打钩,那顶级元素需要打钩
  const checkTopNodeChecked = this.checkTopNodeChecked(
    node.props.eventKey,
    functionalAuthorityList,
    checkedNodes
  );
  if (checkTopNodeChecked) {
    addRoleMenuKeys.push({
      menuId: checkTopNodeChecked,
      roleId,
    });
  }
  // 判断下兄弟节点是否全部打钩 如果全部打钩 那要把父节点也勾上
  // MenuPromise = addRolemenu(addRoleMenuKeys);
  addRoleMenuKeys = repeatData(addRoleMenuKeys,'menuId');
  const addMenuIdsArr = JSON.parse(JSON.stringify(addMenuIds));
  addRoleMenuKeys.forEach(item => {
    addMenuIdsArr.push(item.menuId)
  })
  this.setState({
    addMenuIds : [...addMenuIdsArr]
  })
} else {
  const isLeaf = node.isLeaf();
  let removeKeys;
  if (isLeaf) {
    removeKeys = [node.props.eventKey];
  } else {
    removeKeys = this.getChildrenKeys(node, checked);
  };
  const addMenuIdsArr = NotContainHandle(addMenuIds, removeKeys)
  this.setState({
    addMenuIds : [...addMenuIdsArr]
  })
}

};

checkTopNodeChecked = (key, functionalAuthorityList, checkedNodes) => {
const isSiblingNodeAllChecked = false;
const findParent = (tree, parentNode, parentNodeList = []) => {
let parentTitle;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.id === key)
return [
parentTitle,
parentNodeList.concat([
{ id: node.id, name: node.functionName, checked: node.checked },
]),
];
if (node.children) {
if (node.children.some((item) => item.id === key)) {
parentTitle = node;
return [
parentTitle,
parentNodeList.concat([
{ id: node.id, name: node.functionName, checked: node.checked },
]),
];
} else if (findParent(node.children)) {
parentTitle = findParent(
node.children,
node,
parentNodeList.concat([
{ id: node.id, name: node.functionName, checked: node.checked },
])
);
}
}
}
return parentTitle;
};
const parentNode = findParent(functionalAuthorityList);

if (!parentNode[0]) return false;

const getTopNodeChecked = checkedNodes.find((item) => item.key === parentNode[1][0].id);

if (!getTopNodeChecked) return parentNode[1][0].id;
return;

};

// 获取全部子节点
getChildrenKeys = (node, checked) => {
const isLeaf = node.isLeaf();
const childrenKeys = [node.props.key || node.props.eventKey];
if (!isLeaf) {
const loop = (item) => {
item.props.children.forEach((subItem) => {
childrenKeys.push(subItem.key);
loop(subItem);
});
};
loop(node);
}
this.expandClick(
{
source: [
‘menu.vehicle-management.vehicle-assignment-list.mubiaorenwukejian’,
‘menu.vehicle-management.vehicle-assignment-list.mubiaorenwubukejian’,
],
checked,
node,
dest: ‘menu.vehicle-management.vehicle-list.ota-enable’,
},
childrenKeys
);
return childrenKeys;
};

expandClick = ({ source, dest, checked, node }, parent) => {
if (checked && source.includes(node.props.dataRef.functionCode)) {
const { functionalAuthorityList } = this.props;
const vehicleOperations = this.findChildrenKeys(
functionalAuthorityList[‘2.1’],
(item) => item.functionCode === dest
);
if (!_.isEmpty(vehicleOperations)) {
vehicleOperations.forEach((item) => parent.push(item.id));
}
}
};

checkSiblingNodeChecked = (key, functionalAuthorityList, checkedNodes) => {
const isSiblingNodeAllChecked = false;
const findParent = (tree, parentNode) => {
let parentTitle;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.id === key) return parentNode;
if (node.children) {
if (node.children.some((item) => item.id === key)) {
parentTitle = node;
} else if (findParent(node.children)) {
parentTitle = findParent(node.children, node);
}
}
}
return parentTitle;
};
const parentNode = findParent(functionalAuthorityList);
if (!parentNode) return false;
const isSiblingNodeChecked = parentNode.children.every((subItem) =>
checkedNodes.find((item) => item.key === subItem.id)
);
if (isSiblingNodeChecked) return parentNode.id;
};

renderMenuPermissionTreeNodes = (data) =>
data.map((item) => {
const AuthorityService = MENU_LIST.find((menu) => menu.name === item.functionCode);
if (item.children) {
return (
<TreeNode
title={}
key={item.id}
dataRef={item}
>
{this.renderMenuPermissionTreeNodes(item.children)}

);
}
return ;
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值