rsuite Tree 组件禁用树节点:disabledItemValues 完整指南
前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载导读本文围绕 rsuite 官方文档 Tree 组件禁用树节点示例 展开系统讲解disabledItemValues的使用方法、匹配规则与底层实现原理并结合仓库源码src/Tree与测试用例给出可复制的实战方案。读完你既能快速上手禁用任意层级节点也能理解禁用节点在点击、键盘导航、虚拟滚动与级联场景下的完整行为边界。一、从官方示例看 disabledItemValues 的用法rsuiteTree组件的disabledItemValues属性用于接收一个节点值数组数组中列出的节点将被禁用置灰、不可选中。官方示例位于 docs/pages/components/tree/fragments/disabled.mdimport { Tree } from rsuite; const data [ { label: Node 1, value: 1, children: [ { label: Node 1-1, value: 1-1 }, { label: Node 1-2, value: 1-2 } ] }, { label: Node 2, value: 2, children: [ { label: Node 2-1, value: 2-1, children: [ { label: Node 2-1-1, value: 2-1-1 }, { label: Node 2-1-2, value: 2-1-2 } ] }, { label: Node 2-2, value: 2-2 } ] } ]; const App () ( Tree data{data} disabledItemValues{[1, 2, 2-1-1, 2-1-2]} defaultExpandAll / ); ReactDOM.render(App /, document.getElementById(root));观察这个示例可以得到几个关键结论示例数据是一个两层半嵌套的树结构disabledItemValues中同时包含了父节点1、2和叶子节点2-1-1、2-1-2说明禁用不受节点层级限制根、父、叶子节点均可禁用defaultExpandAll用于默认展开全部节点让禁用效果在首屏即可完整呈现组件属性表见 zh-CN 文档 Props 表对该属性的定义为disabledItemValues: string[]描述为“设置禁用树节点的值”。二、匹配机制按 valueKey 精确匹配disabledItemValues匹配的是节点在valueKey上对应的值而不是label或其他字段。valueKey默认为value可通过valueKey属性自定义参考 src/Tree/Tree.tsx 中labelKey label、valueKey value的默认值。在底层实现中禁用判断使用shallowEqual进行值比较。见 useTreeNodeProps.tsxconst disabled disabledItemValues.some(disabledItem equal(disabledItem, nodeValue));其中equal即shallowEqual。这意味着匹配基于原语值的浅比较字符串、数字类型的 value 均可匹配。测试用例也验证了这一行为Tree.falsy.spec.tsx 覆盖了disabledItemValues{[0]}、disabledItemValues{[]}这类假值场景说明0、空字符串等值同样可以正确命中并禁用对应节点。需要特别提醒的是树结构中每个节点的value必须唯一。useFlattenTree.ts 在扁平化数据时会对重复值打印警告The value ${value} is duplicated. Each node in the tree data must have a unique value.如果存在重复 valuedisabledItemValues可能同时禁用多个节点导致意外行为。三、禁用后的行为边界3.1 点击选择直接失效禁用节点的第一个行为是不可选中。TreeNode.tsx 的handleSelect在开头即拦截const handleSelect useEventCallback((event: React.SyntheticEvent) { if (disabled) { return; } onSelect?.(nodeData, event); });对应测试 Tree.spec.tsx 明确断言了“禁用节点不触发onSelect回调”it(Should not call onSelect callback when the item is disabled, () { const onSelect vi.fn(); render(Tree data{data} onSelect{onSelect} disabledItemValues{[Master]} /); fireEvent.click(screen.getByRole(treeitem, { name: Master })); expect(onSelect).not.toHaveBeenCalled(); });由于选择动作被拦截在TreeNode层禁用节点既不会更新组件选中值也不会触发onSelect/onChangevalue状态完全不受影响。3.2 键盘导航自动跳过禁用节点在键盘交互中禁用节点不会被聚焦。focusableTree.ts 中的getFocusableItems在收集可聚焦节点时直接过滤掉禁用项const disabled disabledItemValues.some(disabledItem shallowEqual(disabledItem, node[valueKey]) ); if (!disabled node.visible) { items.push(node); }因此使用↓/↑/Home/End遍历时焦点会“跳过”禁用节点按Enter选择焦点节点时禁用节点因不在可聚焦集合中而无法被选中。这与 zh-CN 文档“键盘交互”小节 描述的键盘操作规则相互印证。3.3 虚拟滚动不渲染、不占焦点位当开启virtualized虚拟滚动时禁用节点同样从可聚焦集合中排除。useVirtualTreeFocus.ts 中通过disabledItemValues.includes(node[valueKey])判断并跳过。对应测试 Tree.virtual-focus.spec.tsx 验证了“虚拟列表在跳过禁用与折叠节点后使用实际可见行索引定位焦点”保证长列表下禁用节点的行为与普通模式一致。3.4 展开 / 拖拽仍可操作禁用主要约束“选中”行为并不阻止节点的展开/折叠与拖拽TreeNodeToggle的展开点击走的是handleExpandTreeNode.tsx其中没有对disabled做拦截因此禁用父节点仍然可以展开查看其子节点拖拽事件onDragStart/onDragEnter/onDragOver/onDrop等同样没有禁用判断TreeNode.tsx。从源码结构可以推断若需要“连展开/拖拽一起禁掉”disabledItemValues无法直接实现需要在业务层配合onExpand回调或树数据的业务判断来补充限制。四、在级联场景中的特殊语义disabledItemValues有一个容易被忽略的行为在**多选multiple级联cascade**场景下禁用节点及其禁用父节点下的子孙节点不参与选中状态的自动联动。useFlattenTree.ts 的updateTreeNodeCheckState中会向上遍历祖先链判断“自身是否禁用”或“是否存在被禁用的父节点”// Check if this node or any of its parents is disabled const isNodeDisabled disabledItemValues.some((disabledValue: any) shallowEqual(node[valueKey], disabledValue) ); let hasDisabledParent false; let currentNode node; while (currentNode.parent !hasDisabledParent) { // 逐级检查父节点是否在 disabledItemValues 中 ... } // Skip disabled nodes - they should not be affected by cascade or value changes if (isNodeDisabled || hasDisabledParent) { return; }这一实现的业务含义是禁用节点自身不会被级联勾选逻辑“强行选中”或“强行取消”被禁用节点的子孙节点父节点被禁用同样被跳过避免出现“父级不可选、子级却被级联操作”的矛盾状态。也就是说在设计多选树时disabledItemValues是一个比“仅隐藏禁用项”更强的控制手段它把禁用节点及其子树从级联状态计算中整体隔离出去。五、样式与无障碍disabled 的呈现方式禁用节点在视觉与无障碍层面都有专门处理。5.1 视觉样式样式定义在 src/Tree/styles/index.scss-disabled { color: var(--rs-listbox-option-disabled-text); cursor: var(--rs-cursor-disabled); ... } -disabled.rs-tree-node-active .rs-tree-node-label { color: var(--rs-listbox-option-disabled-selected-text); }禁用节点使用--rs-listbox-option-disabled-text颜色变量置灰文本与禁用光标--rs-cursor-disabled禁用状态的激活节点rs-tree-node-active有独立的“禁用-选中”配色防止样式冲突类名由 TreeNode.tsx 拼接withPrefix({ disabled, active, text-muted: disabled, focus })即同时挂载rs-tree-node-disabled与rs-tree-node-text-muted。5.2 ARIA 无障碍TreeNode.tsx 为禁用节点输出aria-disabled{disabled}。这与 zh-CN 文档“可访问性”小节 的说明一致“有aria-disabled属性来指示树节点是否被禁用。”屏幕阅读器可据此向用户宣告节点的禁用状态虚拟滚动场景下的aria-posinset/aria-setsize位置信息也会在禁用节点被跳过的前提下正确计算见 Tree.virtual-position.spec.tsx 对aria-disabled的断言。六、实战建议与注意事项汇总结合文档与源码以下是使用disabledItemValues时的关键注意事项值必须与valueKey对齐默认匹配节点的value字段自定义valueKey后需同步调整数组内容值必须唯一重复 value 会触发控制台警告并可能导致意外禁用多个节点useFlattenTree.ts支持假值0、空字符串等假值可以被正常禁用Tree.falsy.spec.tsx仅约束选择禁用节点不可点击选中、不可被键盘聚焦但仍可展开/折叠、可拖拽如需禁止这些操作需业务层配合级联隔离多选级联场景下禁用节点及其子树不参与勾选状态联动useFlattenTree.ts无障碍同步禁用状态会通过aria-disabled暴露给辅助技术虚拟滚动下位置信息同样跳过禁用项。七、关联阅读官方完整示例文档docs/pages/components/tree/fragments/disabled.md本文示例出处Tree 组件完整 Props 表zh-CN、en-US组件入口与属性分发src/Tree/Tree.tsx节点渲染与点击拦截src/Tree/TreeNode.tsx禁用判断与级联逻辑src/Tree/hooks/useFlattenTree.ts、src/Tree/hooks/useTreeNodeProps.tsx键盘焦点过滤src/Tree/utils/focusableTree.ts禁用样式src/Tree/styles/index.scss相关测试Tree.spec.tsx、Tree.falsy.spec.tsx、Tree.virtual-focus.spec.tsx赞分享前端UI组件【免费下载链接】rsuite A suite of React components .项目地址https://gitcode.com/gh_mirrors/rs/rsuite点击查看免费下载相关推荐rsuite CheckTree 节点禁用完全指南disabledItemValues 用法、级联联动与无障碍实现rsuite CheckTree 节点禁用完全指南disabledItemValues 用法、级联联动与无障碍实现 CheckTree 是 rsuite 提前端UI组件RSuite Tree 组件虚拟化实战用 virtualized 与 scrollToItem 渲染千级节点树RSuite Tree 组件虚拟化实战用 virtualized 与 scrollToItem 渲染千级节点树 RSuite 的 Tree 组件用于展示树形前端UI组件rsuite MultiCascader 禁用与只读状态完整指南disabled / disabledItemValues / readOnly / plaintext 实战解析rsuite MultiCascader 禁用与只读状态完整指南disabled / disabledItemValues / readOnly / plai前端UI组件上一篇技术实现分析Payload-Dumper-Android架构解析与性能优化下一篇终极指南让老Mac重获新生OpenCore Legacy Patcher完整使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考